⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dtdconverter.java

📁 OR Mapping工具
💻 JAVA
字号:
package org.ephman.xml.dtd;/** interface to wrap dtd fields * should give name of field and type/validation (id string 4c!) */import java.util.*;import java.io.*;import org.ephman.abra.tools.*;import org.ephman.xml.*;public class DtdConverter {	static void printUsage () {		System.out.println ("DtdConverter <props-file> [<dtd-file>*] ");	}	static String packageName = "foo.bar";	final static String DTD_NAME = "dtdName";	final static String ENTRY_POINT = "entryPoint";	final static String MAP_FILES = "mapFiles";	final static String OUTPUT_DIR = "outDir";	final static String DATE_FORMATS = "dateFormats";	final static String PACKAGE = "package";	final static String EXTENDS_CLASS = "extends";	static String extendsClass = null;	static PrintStream outStream = System.out;	static HashSet dateFormatStrings = new HashSet ();;	public static void main (String []argv) {		if (argv.length < 3) {			printUsage ();			System.exit (0);		}		try {			String propsName = argv[0];			Properties props = new Properties ();			props.load (new FileInputStream (propsName));						//			String dtdName = argv[1];			//			String topName = argv[2];			packageName = props.getProperty (PACKAGE, packageName); // default to foo.bar			String dateFormatText = props.getProperty (DATE_FORMATS, "");			if (dateFormatText.length () > 0) {				Vector v = org.ephman.utils.Tokenizer.tokenize (dateFormatText, ",", "\"");				for (int i=0; i< v.size (); i++) 					dateFormatStrings.add ("\"" + (String)v.elementAt (i) + "\"");			}						String outDirName = props.getProperty (OUTPUT_DIR, "");									extendsClass = props.getProperty (EXTENDS_CLASS);						DtdConverter inst = new DtdConverter ();						for (int i=1; i < argv.length ; i++) {				String dtdName = argv[i];				String topName = dtdName.substring (0, dtdName.indexOf ("."));				int index = topName.lastIndexOf ("/");				if (index != -1)					topName = topName.substring (index +1);				if (outDirName.length () > 0) { // use file else sys.out					if (!outDirName.endsWith ("/")) outDirName += "/";					String outFileName = outDirName + topName + ".xml";					outStream = new PrintStream (new FileOutputStream (outFileName));				}				inst.initClassTree (props.getProperty (MAP_FILES), argv);				System.out.println ("Processing " + topName);				inst.processDtd (dtdName, topName);			}		} catch (Exception e) {			e.printStackTrace ();		}	   	}	HashMap classTree = new HashMap ();	HashMap hashedClasses = new HashMap ();	void initClassTree (String fileList, String [] argv) throws Exception {				if (fileList != null && !fileList.trim ().equals ("")) {			StringTokenizer tokens = new StringTokenizer (fileList, ",");						FakeMTJ mtj = new FakeMTJ ();			while (tokens.hasMoreTokens ()) {				String mapFileName = tokens.nextToken ();				mtj.applyRules(mtj.mapXMLFile(mapFileName, false), mapFileName);			}			/*			for (int i=3; i < argv.length; i++) {						String mapFileName = argv[i];						System.out.println ("Adding file::"+mapFileName );						mtj.applyRules(mtj.mapXMLFile(mapFileName, false), mapFileName);						}*/			classTree = mtj.getClassTree();			Iterator it = classTree.values().iterator (); // for lookups..			while (it.hasNext()) {                JClass jc = (JClass)it.next();				hashedClasses.put (getTypedHashKey (jc), jc);			}		}	}		// take the dtd parse and compare to class list produce xml-map-file	void processDtd (String dtdName, String topName) throws Exception {		//take Dtd object parse -> take an element and create JClass for it		// -> check members/types and see if already have a type in old or new map ..		//for PCDATA fields create JField nodes in currentClass.		dtd = new DtdParser (new FileReader (dtdName)).parseDtd ();		dtd.analyze (topName);  // simple hashing ..		//		String topName = dtd.firstElement.name;		newClasses = new HashMap ();		JClass topClass = processJClass (topName);				//		System.out.println (topClass.toFileString ());		Iterator it = newClasses.values().iterator ();		outStream.println ("<mapping>\n");		outStream.println ("<property name=\"gen.pkg\" value=\""							+ packageName + "\"/>");		while (it.hasNext ())			outStream.println (((JClass)it.next ()).toFileString ());		outStream.println ("\n</mapping>\n");		outStream.close ();			}	HashMap newClasses;	JClass processJClass (String elementName) throws Exception {		DtdElement element = dtd.getElement (elementName);		JClass jc = new JClass (elementName, "${gen.pkg}");		if (extendsClass != null) jc.setParentClassName (extendsClass);		//		Vector simpleEls = new Vector ();		for (int i=0; i<element.elements.size (); i++) {			String subElementName = (String)element.elements.elementAt (i);			//			System.out.println (subElementName);			DtdElement subElement = dtd.getElement (getName (subElementName));			JField jf = null;			if (subElement.isPCData) { // simple type				jf = new JField ();				setJavaType (subElement, jf);			} else { // composite type..				JCompositeField jcf = new JCompositeField ();				jf = jcf;				JClass sub_jc = (JClass)newClasses.get (getName (subElementName));				jcf.setJClass (sub_jc == null ? processJClass (getName (subElementName))							   : sub_jc);				jcf.setDkType (TypeMapper.getType (jcf.getJClass().getPackageName () + "."+								 jcf.getJClass().getClassName ()));				jcf.setMapFileType (jcf.getJClass().getPackageName () + "."+								 jcf.getJClass().getClassName ());			}			setGrouping (subElementName, jf);			jf.setJavaName (getName (subElementName));			jc.addField (jf);		}		JClass preMadeClass = (JClass)hashedClasses.get (getTypedHashKey (jc));		if (preMadeClass != null) return preMadeClass;		hashedClasses.put (getTypedHashKey (jc), jc);		newClasses.put (jc.getClassName (), jc);		return jc;	}	void setGrouping (String n, JField jf) {		if (n.endsWith ("?")) { }					else if (n.endsWith ("*") || n.endsWith ("+")) 			jf.setToVector ();		else			jf.setRequired ();	}	// name	private String getName (String n) {		String name;		if (n.endsWith ("?") ||n.endsWith ("*") || n.endsWith ("+")) 			name = n.substring (0, n.length()-1);		else			name = n;					return name;	}	void setJavaType (DtdElement el, JField jf) {		DtdAttList attList = dtd.getAttList (el.name);		String syn = attList == null ? "c"			: attList.charSyntax;		String jType = "String";		String mType = "string";		if (syn.indexOf ("c") != -1 || syn.indexOf ("z") != -1 || syn.indexOf ("a") != -1 ||			syn.indexOf ("a") != -1 || syn.indexOf ("s") != -1 ) // string .. nothing			{ }		else if (syn.indexOf ("n") != -1)	{ // number or date						//			System.out.println (syn + " != " + test);			if (dateFormatStrings.contains (syn)) {				jf.setAsDate ();				mType = "date";				jType = "Timestamp";			}			else {				mType = "integer";				jType = "int";			}		}		else if (syn.indexOf ("d") != -1 )	{ // double			jType = "double";			mType = "double";		}		jf.setMapFileType (mType);		jf.setDkType (TypeMapper.getType (jType));	}	Dtd dtd = null;	/** method to take a type like Amount with fields sign:String;curr:String;value:double 	 * and create hash index from that..	 */	String getTypedHashKey (JClass jc) {		// use Tree Map -- ordered by name to		// create String key..		Iterator it = jc.getAllFields ().values ().iterator ();		StringBuffer sb = new StringBuffer (EMPTY_STRING);		while (it.hasNext ()) {			JField jf = (JField)it.next ();			String vecS = jf.isVector () ? "]V" : "";			sb.append (jf.getJavaName () +":"+jf.getObjectType()+ vecS +					   ";");		}		//		System.out.println ("Created-HK>>"+sb.toString ());		return sb.toString ();	}	static final String EMPTY_STRING = "";	class FakeMTJ extends MapToJava {		protected void applyRules (XmlNode xn, String fileName) 			throws XmlException, IOException, SchemaException		{			super.applyRules (xn, fileName);		}		public XmlNode mapXMLFile (String name) throws XmlException, FileNotFoundException {			return super.mapXMLFile (name);		}		public HashMap getClassTree () {			return super.getClassTree ();		}		FakeMTJ () {			super ("", false, false, false, false, false);		}			}}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -