javaclassgenerator.java

来自「OR Mapping工具」· Java 代码 · 共 515 行 · 第 1/2 页

JAVA
515
字号
package org.ephman.abra.tools;import java.io.*;import java.util.*;/** * given a base output directory * generate a class when given a JClass descriptor * @author Paul M. Bethe * @version 0.0.2 */public class JavaClassGenerator implements ClassGenerator, AbraTypes {	private String outdir;	private char fileSeperator;	private String toImplement;	/** make a new generator with a base directory of outdir	 * so for foo.bar.FooBar if outdir = /home/dknull	 * and file_sep = '/' then a class /home/dknull/foo/bar/FooBar.java is created	 * @param outdir the base directory for writing files	 * @param file_sep the file seperator ('/' for unix/linux , '\\' for Windows)	 */	public JavaClassGenerator (String outdir, char file_sep, String toImp) {		this.outdir = outdir;		this.fileSeperator = file_sep;		this.toImplement = toImp;	}	public void close () {} // nothing needed	public void generate (JClass currentClass) throws IOException, SchemaException {		boolean isDatabaseClass = MapToJava.makeFactories;        String fname =  currentClass.getPackageName().replace('.', fileSeperator) + fileSeperator              + currentClass.getClassName() + ".java";        FileWriter outFile = new FileWriter (outdir + fileSeperator + fname);		Debugger.trace ("Generating class " +outdir + fileSeperator + fname, Debugger.VERBOSE);        writeClassHeader (outFile, currentClass, isDatabaseClass);        String constructorString = "";		Debugger.trace ("Class-> " + currentClass.getClassName () +						" PrimKeyJ: " + currentClass.getPrimaryKeyJava() +						" PrimKeyS: " + currentClass.getPrimaryKey (),						Debugger.ALL);		currentClass.resetFieldIteration();		while (currentClass.hasMoreFields()) {            JField jf = currentClass.getNextField();            writeFieldCode (outFile, jf);			Debugger.trace ("\tField: " + jf.getJavaName (), Debugger.ALL);            constructorString += "\t\t_" + jf.getJavaName() + " = " + getDefaultValue(jf) + ";\n";        }        // now do views --		Iterator i = currentClass.getViewList ();		while (i.hasNext ()) {			JView view = (JView)i.next ();			writeView (view, currentClass, outFile);        }        writeClassTrailer (outFile, currentClass, constructorString);		outFile.close ();    }	public static String INIT_VIEW_NAME = "initializeFromView";	private void writeView (JView view, JClass currentClass, FileWriter classFile) throws IOException, SchemaException{		String fname =  view.getViewName().replace('.', fileSeperator) + ".java";        FileWriter outFile = new FileWriter (outdir + fileSeperator + fname);		writeViewHeader (outFile, view, currentClass);		String constructorString = "";		String u_name = view.getFormatName ();		u_name = u_name.substring (0,1).toUpperCase () + u_name.substring (1);		JView top_view = view;		if (view.getSuperView () != null ) {			while (top_view.getSuperView () != null)				top_view = top_view.getSuperView ();					}		// write code to make w/ constructor //		classFile.write ("\tpublic void " + INIT_VIEW_NAME + " ("+ top_view.getViewName() +" view) {\n");		if (view.getSuperView () != null ) 			classFile.write ("\t\tsuper." + INIT_VIEW_NAME + "(view);\n");				String viewVarName = "view";		if (top_view != view) {			classFile.write ("\t\t"+view.getViewName() + " casted_view = "							 + "("+view.getViewName()+")view;\n");			viewVarName = "casted_view";		}		Vector fieldList = view.getFieldList ();		for (int i=0; i< fieldList.size (); i++) {			JFieldView fieldView = (JFieldView)fieldList.elementAt (i);			JField jf = fieldView.getField ();			if (jf instanceof JCompositeField) { // foreign 				if (fieldView.getAsView() &&					Checks.exists (fieldView.getViewFormat ()) && !jf.isVector ()) {					classFile.write ("\t\tif (this.get" + jf.getGetSet ()									 + "() != null && " + viewVarName									 + ".get" + jf.getGetSet ()+"() != null)");											// is a view						classFile.write ("\n\t\t\tthis.get" + jf.getGetSet ()										 + "().initializeFromView ("										 +viewVarName +".get" + jf.getGetSet ()										 + "());\n");					//else if (jf.isVector () // nothing for now				}				else {} // single field ??			}			else {				classFile.write ("\t\tthis.set" + jf.getGetSet ()+ " (" +								 viewVarName + ".get" + jf.getGetSet ()								 + " ());\n");			}		}		classFile.write ("\t}\n\n");		// now creation views		classFile.write ("\tpublic " + top_view.getViewName() + " create" + u_name + "View () {\n");		classFile.write ("\t\tHashMap viewContext = new HashMap ();\n");		classFile.write ("\t\treturn this.create"+ u_name + "View (viewContext);\n\t}\n\n");		classFile.write ("\tpublic " + top_view.getViewName() + " create" + u_name + "View (HashMap _viewContext) {\n");		classFile.write ("\t\t" + view.getViewName() +" foo = (" +view.getViewName() 						 +")_viewContext.get (this);\n");		classFile.write ("\t\tif (foo == null) { //not found\n");		classFile.write ("\t\t\tfoo = new " + view.getViewName() +" ();\n");		classFile.write ("\t\t\t_viewContext.put (this, foo);\n");		classFile.write ("\t\t\tthis.create" + u_name + "View (foo, _viewContext);\n\t\t}\n");		classFile.write ("\t\treturn foo;\n\t}\n\n");		classFile.write ("\tprotected void create" + u_name + "View (" + top_view.getViewName() +" foo, HashMap _viewContext) {\n");		String varName = "foo";		if (view.getSuperView () != null) {			classFile.write ("\t\tsuper.create" + u_name + "View (foo, _viewContext);\n");			classFile.write ("\t\t" + view.getViewName () + " casted_foo = (" + view.getViewName ()+ ")foo;\n");			varName = "casted_foo";		}		//Vector fieldList = view.getFieldList ();		for (int i=0; i< fieldList.size (); i++) {			JFieldView fieldView = (JFieldView)fieldList.elementAt (i);			JField jf = fieldView.getField ();			writeViewFieldCode (outFile, fieldView, classFile, varName);			String initVal = getDefaultValue(jf);			if (!jf.isCollection () && jf instanceof JCompositeField && fieldView.getAsView ())				initVal = "null";			else if (jf instanceof JCompositeField && !fieldView.getAsView ()) { // get the field defval ..				JField for_f = ((JCompositeField)jf).getJClass ().getFieldByName (fieldView.getViewFormat ());				initVal = getDefaultValue (for_f);			}			constructorString += "\t\t_" + jf.getJavaName() + " = " + initVal + ";\n";		}		classFile.write ("\t}\n\n");		writeViewTrailer (outFile, view, constructorString);		outFile.close();	}    private void writeViewTrailer (FileWriter outFile, JView view, String constructorString) throws IOException, SchemaException {          int i = view.getViewName ().lastIndexOf (".");        String viewName = "";        if (i != -1)            viewName = view.getViewName ().substring(i + 1);        else            viewName = view.getViewName ();        outFile.write ("\tpublic " + viewName + " () {\n");        outFile.write (constructorString);        outFile.write ("\t}\n\n} // -- End class " + viewName);    }    private void writeViewHeader (FileWriter outFile, JView view, JClass currentClass) throws IOException, SchemaException {        int i = view.getViewName ().lastIndexOf (".");        String className = "";        if (i != -1) {            String packageName = view.getViewName ().substring(0, i);            className = view.getViewName ().substring(i + 1);            outFile.write ("package " + packageName + ";\n\n");        }        else            className = view.getViewName ();		String ext = view.getSuperView () == null ? "" : "extends " + view.getSuperView ().getViewName () + " ";		outFile.write ("import java.util.*;\n");		outFile.write ("import java.sql.*;\n");        outFile.write ("// Do not edit!! generated classes\n");		outFile.write ("/** A Viewer to link" + currentClass.getClassName () + " to a message viewing format \n");		outFile.write (" * @version " + (new Date ()).toString () + "\n");		outFile.write (" * @author generated by Dave Knull\n */\n\n");        outFile.write ("public class " + className + " " + ext +"implements org.ephman.abra.utils.Viewable " + "{\n\n");    }    private void writeViewFieldCode (FileWriter outFile, JFieldView fieldView, FileWriter classFile, String varName) throws IOException, SchemaException {		JField jf = fieldView.getField ();        String fieldName = jf.getJavaName();        String fieldType = jf.getObjectType();		String elType = "";        		if (jf instanceof JCompositeField && ((JCompositeField)jf).getJClass() != null) {			if (fieldView.getAsView ()) {				JView comp_view = ((JCompositeField)jf).getJClass ().getView(fieldView.getViewFormat());				if (comp_view != null)					fieldType = comp_view.getViewName();				else					fieldType = jf.getObjectType ();			}			else {				JField for_field =  ((JCompositeField)jf).getJClass ().getFieldByName (fieldView.getViewFormat());				if (for_field == null) {				    String errMsg = "Foreign field " + fieldView.getViewFormat() + " not found: " + jf.getJavaName ();					Debugger.trace (errMsg, Debugger.ERROR);					fieldType = jf.getObjectType ();				}				else					fieldType = for_field.getObjectType ();							}		}		if (jf.isVector()) {  			elType = fieldType; 			fieldType = "java.util.Vector";		} else if (jf.isArray ()) {			elType = fieldType;			fieldType += " []";		} if (jf.isArrayList ()) {      elType = fieldType;      fieldType = "java.util.ArrayList";    }      outFile.write ("\tprivate " + fieldType + " _" + fieldName + ";\n\n");      outFile.write ("\tpublic " + fieldType + " get" + jf.getGetSet() + " () { return this._"              + fieldName + "; }\n\n");      outFile.write ("\tpublic void set" + jf.getGetSet() + " (" + fieldType + " foo) {\n");      outFile.write ("\t\tthis._"+ fieldName + " = foo;\n");      outFile.write ("\t}\n\n");		if (jf.isCollection ()) {			outFile.write ("\tpublic void addTo" + jf.getGetSet ()						   + " ("+ elType + " foo) {\n");      if (jf.isVector()) {			  outFile.write ("\t\t_" + fieldName + ".addElement (foo);\n\t}\n\n");      }      else if (jf.isArrayList()) {        outFile.write ("\t\t_" + fieldName + ".add (foo);\n\t}\n\n");      }

⌨️ 快捷键说明

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