Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java In directory sc8-pr-cvs1:/tmp/cvs-serv8417/net/sf/hibernate/tool/hbm2java Modified Files: BasicRenderer.java ClassMapping.java ClassName.java CodeGenerator.java Field.java Generator.java Log Message: applied Max Andersen's patch for <meta>attributes in hbm2java Index: BasicRenderer.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java/BasicRenderer.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** BasicRenderer.java 5 Jan 2003 02:11:24 -0000 1.3 --- BasicRenderer.java 16 Jan 2003 20:52:38 -0000 1.4 *************** *** 3,6 **** --- 3,8 ---- import java.io.PrintWriter; + import java.io.StringWriter; + import java.util.Collection; import java.util.Iterator; import java.util.List; *************** *** 8,13 **** import java.util.TreeSet; public class BasicRenderer implements Renderer { ! /** * Returns the true name for the given class name. By true name is --- 10,20 ---- import java.util.TreeSet; + import org.apache.commons.lang.StringUtils; + import org.apache.commons.logging.Log; + import org.apache.commons.logging.LogFactory; + public class BasicRenderer implements Renderer { ! ! static private Log log = LogFactory.getLog(BasicRenderer.class); /** * Returns the true name for the given class name. By true name is *************** *** 19,269 **** */ String getTrueTypeName(Field field, Map class2classmap) { ! String name = ( field.getClassType()!=null ) ? ! field.getClassType().getFullyQualifiedName(): ! field.getType(); ! ClassMapping cmap = (ClassMapping) class2classmap.get(name); ! ! if(cmap!=null) { ! if (cmap.getProxy()!=null) { ! return cmap.getProxy(); ! } ! } ! return name; ! } ! ! public void render(String className, ClassMapping classMapping, Map class2classmap, PrintWriter writer) throws Exception { ! if ( classMapping.getPackageName()!=null ) { ! writer.println("package " + classMapping.getPackageName() + ";"); ! } ! else { ! writer.println("// default package"); ! } ! writer.println(); ! ! // imports ! classMapping.getImports().add("java.io.Serializable"); ! classMapping.getImports().add("org.apache.commons.lang.builder.ToStringBuilder"); ! if ( classMapping.mustImplementEquals() ) { ! classMapping.getImports().add("org.apache.commons.lang.builder.EqualsBuilder"); ! classMapping.getImports().add("org.apache.commons.lang.builder.HashCodeBuilder"); ! } ! ! for ( Iterator imports = classMapping.getImports().iterator(); imports.hasNext(); ) { ! writer.println("import " + imports.next() + ";"); ! } ! writer.println(); ! ! // class declaration ! writer.println("/** @author Hibernate CodeGenerator */"); ! writer.print( "public class " + classMapping.getName() ); ! ! // subclass ! if (classMapping.getSuperClass() != null) { ! writer.print( " extends " + classMapping.getSuperClass() ); ! } ! ! // always implements Serializable ! writer.print(" implements Serializable"); ! ! // implement proxy, but NOT if the proxy is the class it self! ! if ( ! classMapping.getProxy()!=null && ! ( !classMapping.getProxy().equals( classMapping.getCanonicalName() ) ) ! ) { ! writer.print(", "); ! writer.print( classMapping.getProxy() ); ! } ! writer.println(" {"); ! writer.println(); ! ! // fields ! for ( Iterator fields = classMapping.getFields().iterator(); fields.hasNext(); ) { ! Field field = (Field) fields.next(); ! writer.println( ! " /** " + ! ( field.isNullable() && !field.isIdentifier() ? "nullable " : "" ) + ! ( field.isIdentifier() ? "identifier" : "persistent" ) ! + " field */" ! ); ! writer.println( ! " private " + ! shortenType( field.getType(), classMapping.getImports() ) + ! ' ' + ! field.getName() + ! ';' ! ); ! writer.println(); ! } ! ! // full constructor ! List allFieldsForFullConstructor = classMapping.getAllFieldsForFullConstructor(); ! ! writer.println(" /** full constructor */"); ! String fullCons = " public " + classMapping.getName() + "("; ! ! ! for ( Iterator fields = allFieldsForFullConstructor.iterator(); fields.hasNext(); ) { ! Field field = (Field) fields.next(); ! fullCons = fullCons + shortenType( ! getTrueTypeName(field, class2classmap), classMapping.getImports() ! ) + " " + field.getName(); ! if( fields.hasNext() ) { ! fullCons = fullCons + ", "; ! } ! } ! ! writer.println(fullCons + ") {"); ! //invoke super to initialize superclass... ! List supersConstructorFields = classMapping.getFieldsForSupersFullConstructor(); ! if (!supersConstructorFields.isEmpty()) { ! writer.print(" super("); ! for (Iterator fields = supersConstructorFields.iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! writer.print(field.getName()); ! if(fields.hasNext()) { ! writer.print(", "); ! } ! } ! writer.println(");"); ! } ! ! // initialisation of localfields ! for(Iterator fields = classMapping.getLocalFieldsForFullConstructor().iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! writer.println(" this." + field.getName() + " = " + field.getName() + ";"); ! } ! writer.println(" }"); ! writer.println(); ! ! // no args constructor (if fullconstructor had any arguments!) ! if (allFieldsForFullConstructor.size() > 0) { ! writer.println(" /** default constructor */"); ! writer.println(" public " + classMapping.getName() + "() {"); ! writer.println(" }"); ! writer.println(); ! } ! ! // minimal constructor (only if the fullconstructor had any arguments) ! if ((allFieldsForFullConstructor.size() > 0) && classMapping.needsMinimalConstructor()) { ! ! List allFieldsForMinimalConstructor = classMapping.getAllFieldsForMinimalConstructor(); ! writer.println(" /** minimal constructor */"); ! ! String minCons = " public " + classMapping.getName() + "("; ! for (Iterator fields = allFieldsForMinimalConstructor.iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! minCons = minCons + shortenType(getTrueTypeName(field, class2classmap), classMapping.getImports()) + " " + field.getName(); ! if (fields.hasNext()) { ! minCons = minCons + ", "; ! } ! } ! ! writer.println(minCons + ") {"); ! // invoke super to initialize superclass... ! List supersMinConstructorFields = classMapping.getFieldsForSupersMinimalConstructor(); ! if (!supersMinConstructorFields.isEmpty()) { ! writer.print(" super("); ! for (Iterator fields = supersMinConstructorFields.iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! writer.print(field.getName()); ! if(fields.hasNext()) { ! writer.print(", "); ! } ! } ! writer.println(");"); ! } ! ! // initialisation of localfields ! for (Iterator fields = classMapping.getLocalFieldsForMinimalConstructor().iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! writer.println(" this." + field.getName() + " = " + field.getName() + ";"); ! } ! writer.println(" }"); ! writer.println(); ! } ! ! // field accessors ! for (Iterator fields = classMapping.getFields().iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! ! String getterType = ( field.getType().toLowerCase().equals("boolean") ) ? " is" : " get"; ! ! // getter ! writer.println(" public " + getTrueTypeName(field, class2classmap) + getterType + field.getAsSuffix() + "() {"); ! writer.println(" return this." + field.getName() + ";"); ! writer.println(" }"); ! writer.println(""); ! ! // setter ! writer.println(" public void set" + field.getAsSuffix() + "(" + getTrueTypeName(field, class2classmap) + " " + field.getName() + ") {"); ! writer.println(" this." + field.getName() + " = " + field.getName() + ";"); ! writer.println(" }"); ! } ! ! writer.println(); ! writer.println(" public String toString() {"); ! //easier to use reflectionToString() than worry about superclasses ! writer.println(" return ToStringBuilder.reflectionToString(this);"); ! writer.println(" }"); ! writer.println(); ! ! if ( classMapping.mustImplementEquals() ) { ! writer.println(" public boolean equals(Object other) {"); ! writer.println(" if ( !(other instanceof " + className + ") ) return false;"); ! writer.println(" " + className + " castOther = (" + className + ") other;"); ! writer.println(" return new EqualsBuilder()"); ! for (Iterator fields = classMapping.getFields().iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! if ( field.isIdentifier() ) { ! writer.println(" .append(this." + field.getName() + ", castOther." + field.getName() + ")"); ! } ! } ! writer.println(" .isEquals();"); ! writer.println(" }"); ! writer.println(); ! ! writer.println(" public int hashCode() {"); ! writer.println(" return new HashCodeBuilder()"); ! for (Iterator fields = classMapping.getFields().iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! if ( field.isIdentifier() ) { ! writer.println(" .append(" + field.getName() + ")"); ! } ! } ! writer.println(" .toHashCode();"); ! writer.println(" }"); ! writer.println(); ! } ! ! writer.println("}"); ! } ! /** ! * Returns the last part of type if it is in the set of imports. ! * e.g. java.util.Date would become Date, if imports contains ! * java.util.Date. ! * ! * @param type ! * @param imports ! * @return String ! */ ! private String shortenType(String type, TreeSet imports) { ! if( imports.contains(type) ) { ! return type.substring( type.lastIndexOf('.')+1 ); ! } ! else { ! if( type.endsWith("[]") ) { ! return shortenType( type.substring(0, type.length()-2), imports ) + "[]"; ! } ! else { ! return type; ! } ! } ! } ! ! } ! ! ! ! --- 26,401 ---- */ String getTrueTypeName(Field field, Map class2classmap) { ! String name = ( field.getClassType()!=null ) ? ! field.getClassType().getFullyQualifiedName(): ! field.getType(); ! ClassMapping cmap = (ClassMapping) class2classmap.get(name); ! ! if(cmap!=null) { ! if (cmap.getProxy()!=null) { ! return cmap.getProxy(); ! } ! } ! return name; ! } ! ! String getTrueTypeName(ClassName cn, Map class2classmap) { ! String name = cn.getFullyQualifiedName(); ! ClassMapping cmap = (ClassMapping) class2classmap.get(name); ! ! ! if(cmap!=null) { ! if (cmap.getProxy()!=null) { ! return cmap.getProxy(); ! } ! } ! return name; ! } ! ! ! public void render(String packageName, ClassMapping classMapping, Map class2classmap, PrintWriter mainwriter) throws Exception { ! if ( classMapping.getGeneratedPackageName()!=null ) { ! mainwriter.println("package " + classMapping.getGeneratedPackageName() + ";"); ! } ! else { ! mainwriter.println("// default package"); ! } ! mainwriter.println(); ! ! // switch to another writer to be able to insert the actually ! // used imports when whole class has been rendered. ! StringWriter strWriter = new StringWriter(); ! PrintWriter writer = new PrintWriter(strWriter); ! ! ! // class declaration ! if(classMapping.getMeta("description")==null) { ! writer.println("/** @author Hibernate CodeGenerator */"); ! } else { ! writer.println("/** \n" + toJavaDoc(classMapping.getMetaAsString("description"),0) + "*/"); ! } ! ! String classScope = "public"; ! if(classMapping.getMeta("scope-class")!=null) { ! classScope = classMapping.getMetaAsString("scope-class").trim(); ! } ! if(classMapping.shouldBeAbstract()) { ! writer.print( "abstract " + classScope + " class " + classMapping.getGeneratedName() ); ! } else { ! writer.print( classScope + " class " + classMapping.getGeneratedName() ); ! } ! ! // subclass ! if (classMapping.getSuperClass() != null) { ! writer.print( " extends " + classMapping.getSuperClass() ); ! } else if (classMapping.getMeta("extends")!=null) { ! writer.print( " extends " + classMapping.getMetaAsString("extends")); ! } ! ! // always implements Serializable ! writer.print(" implements Serializable"); ! ! // implement proxy, but NOT if the proxy is the class it self! ! if ( ! classMapping.getProxy()!=null && ! ( !classMapping.getProxy().equals( classMapping.getCanonicalName() ) ) ! ) { ! writer.print(", "); ! writer.print( classMapping.getProxy() ); ! } ! ! if(classMapping.getMeta("implements")!=null) { ! Collection implementz = classMapping.getMeta("implements"); ! for (Iterator iter = implementz.iterator(); iter.hasNext();) { ! String iface = (String) iter.next(); ! writer.print(", "); ! writer.print(iface); ! } ! } ! ! writer.println(" {"); ! writer.println(); ! ! // fields ! for ( Iterator fields = classMapping.getFields().iterator(); fields.hasNext(); ) { ! Field field = (Field) fields.next(); ! ! String fieldScope = getFieldScope(field, "property-scope", "scope-field"); ! writer.println( ! " /** " + ! ( field.isNullable() && !field.isIdentifier() ? "nullable " : "" ) + ! ( field.isIdentifier() ? "identifier" : "persistent" ) ! + " field */"); ! writer.println( ! " " + fieldScope + " " + ! shortenType( field.getType(), classMapping.getImports() ) + ! ' ' + ! field.getName() + ! ';' ! ); ! ! writer.println(); ! } ! ! // full constructor ! List allFieldsForFullConstructor = classMapping.getAllFieldsForFullConstructor(); ! ! writer.println(" /** full constructor */"); ! String fullCons = " public " + classMapping.getGeneratedName() + "("; ! ! ! for(Iterator fields = allFieldsForFullConstructor.iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! fullCons = fullCons + shortenType(getTrueTypeName(field, class2classmap), classMapping.getImports()) + " " + field.getName(); ! if(fields.hasNext()) { ! fullCons = fullCons + ", "; ! } ! } ! ! writer.println(fullCons + ") {"); ! //invoke super to initialize superclass... ! List supersConstructorFields = classMapping.getFieldsForSupersFullConstructor(); ! if (!supersConstructorFields.isEmpty()) { ! writer.print(" super("); ! for (Iterator fields = supersConstructorFields.iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! writer.print(field.getName()); ! if(fields.hasNext()) { ! writer.print(", "); ! } ! } ! writer.println(");"); ! } ! ! // initialisation of localfields ! for(Iterator fields = classMapping.getLocalFieldsForFullConstructor().iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! writer.println(" this." + field.getName() + " = " + field.getName() + ";"); ! } ! writer.println(" }"); ! writer.println(); ! ! // no args constructor (if fullconstructor had any arguments!) ! if (allFieldsForFullConstructor.size() > 0) { ! writer.println(" /** default constructor */"); ! writer.println(" public " + classMapping.getGeneratedName() + "() {"); ! writer.println(" }"); ! writer.println(); ! } ! ! // minimal constructor (only if the fullconstructor had any arguments) ! if ((allFieldsForFullConstructor.size() > 0) && classMapping.needsMinimalConstructor()) { ! ! List allFieldsForMinimalConstructor = classMapping.getAllFieldsForMinimalConstructor(); ! writer.println(" /** minimal constructor */"); ! ! String minCons = " public " + classMapping.getGeneratedName() + "("; ! for (Iterator fields = allFieldsForMinimalConstructor.iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! minCons = minCons + shortenType(getTrueTypeName(field, class2classmap), classMapping.getImports()) + " " + field.getName(); ! if (fields.hasNext()) { ! minCons = minCons + ", "; ! } ! } ! ! writer.println(minCons + ") {"); ! // invoke super to initialize superclass... ! List supersMinConstructorFields = classMapping.getFieldsForSupersMinimalConstructor(); ! if (!supersMinConstructorFields.isEmpty()) { ! writer.print(" super("); ! for (Iterator fields = supersMinConstructorFields.iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! writer.print(field.getName()); ! if(fields.hasNext()) { ! writer.print(", "); ! } ! } ! writer.println(");"); ! } ! ! // initialisation of localfields ! for (Iterator fields = classMapping.getLocalFieldsForMinimalConstructor().iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! writer.println(" this." + field.getName() + " = " + field.getName() + ";"); ! } ! writer.println(" }"); ! writer.println(); ! } ! ! ! doFieldAccessors(classMapping, class2classmap, writer); ! ! writer.println(); ! writer.println(" public String toString() {"); ! //easier to use reflectionToString() than worry about superclasses ! writer.println(" return ToStringBuilder.reflectionToString(this);"); ! writer.println(" }"); ! writer.println(); ! ! if ( classMapping.mustImplementEquals() ) { ! writer.println(" public boolean equals(Object other) {"); ! writer.println(" if ( !(other instanceof " + classMapping.getGeneratedName() + ") ) return false;"); ! writer.println(" " + classMapping.getGeneratedName() + " castOther = (" + classMapping.getGeneratedName() + ") other;"); ! writer.println(" return new EqualsBuilder()"); ! for (Iterator fields = classMapping.getFields().iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! if ( field.isIdentifier() ) { ! writer.println(" .append(this." + field.getName() + ", castOther." + field.getName() + ")"); ! } ! } ! writer.println(" .isEquals();"); ! writer.println(" }"); ! writer.println(); ! ! writer.println(" public int hashCode() {"); ! writer.println(" return new HashCodeBuilder()"); ! for (Iterator fields = classMapping.getFields().iterator(); fields.hasNext();) { ! Field field = (Field) fields.next(); ! if ( field.isIdentifier() ) { ! writer.println(" .append(" + field.getName() + ")"); ! } ! } ! writer.println(" .toHashCode();"); ! writer.println(" }"); ! writer.println(); ! } ! ! writer.println("}"); ! ! ! // finally write the imports ! doImports(classMapping, mainwriter); ! mainwriter.print(strWriter.toString()); ! ! ! } + public void doFieldAccessors(ClassMapping classMapping, Map class2classmap, PrintWriter writer) { + // field accessors + for (Iterator fields = classMapping.getFields().iterator(); fields.hasNext();) { + Field field = (Field) fields.next(); + + // getter + String getAccessScope = getFieldScope(field, "scope", "scope-get"); + String getterType = ( field.getType().toLowerCase().equals("boolean") ) ? " is" : " get"; + + if(field.getMeta("description")!=null) { + writer.println(" /** \n" + toJavaDoc(field.getMetaAsString("description"), 4) + " */"); + } + writer.println(" " + getAccessScope + " " + getTrueTypeName(field, class2classmap) + getterType + field.getAsSuffix() + "() {"); + writer.println(" return this." + field.getName() + ";"); + writer.println(" }"); + writer.println(""); + + // setter + String setAccessScope = getFieldScope(field, "scope", "scope-set"); + writer.println(" " + setAccessScope + " void set" + field.getAsSuffix() + "(" + getTrueTypeName(field, class2classmap) + " " + field.getName() + ") {"); + writer.println(" this." + field.getName() + " = " + field.getName() + ";"); + writer.println(" }"); + writer.println(""); + + // add/remove'rs (commented out for now) + /* + if(field.getForeignClass()!=null) { + ClassName foreignClass = field.getForeignClass(); + + String trueforeign = getTrueTypeName(foreignClass, class2classmap); + classMapping.addImport(trueforeign); + + // Try to identify the matching set method on the child. + ClassMapping forignMap = (ClassMapping) class2classmap.get(foreignClass.getFullyQualifiedName()); + + if(forignMap!=null) { + Iterator foreignFields = forignMap.getFields().iterator(); + while (foreignFields.hasNext()) { + Field ffield = (Field) foreignFields.next(); + if(ffield.isIdentifier()) { + log.debug("Trying to match " + ffield.getName() + " with " + field.getForeignKeys()); + } + } + + } else { + log.error("Could not find foreign class's mapping - cannot provide bidirectional setters!"); + } + + String addAccessScope = getFieldScope(field, "scope", "scope-add"); + writer.println(" " + setAccessScope + " void add" + field.getAsSuffix() + "(" + shortenType(trueforeign, classMapping.getImports()) + " a" + field.getName() + ") {"); + writer.println(" this." + getterType + field.getAsSuffix() + "().add(a" + field.getName() + ");"); + writer.println(" a" + field.getName() + ".setXXX(this);"); + writer.println(" }"); + writer.println(""); + + + } + */ + } + + } + public void doImports(ClassMapping classMapping, PrintWriter writer) { + // imports + classMapping.getImports().add("java.io.Serializable"); + classMapping.getImports().add("org.apache.commons.lang.builder.ToStringBuilder"); + if ( classMapping.mustImplementEquals() ) { + classMapping.getImports().add("org.apache.commons.lang.builder.EqualsBuilder"); + classMapping.getImports().add("org.apache.commons.lang.builder.HashCodeBuilder"); + } + + for ( Iterator imports = classMapping.getImports().iterator(); imports.hasNext(); ) { + writer.println("import " + imports.next() + ";"); + } + writer.println(); + } + + public String getFieldScope(Field field, String defaultScopeName, String localScopeName) { + String defaultScope = ( field.getMeta(defaultScopeName)==null )? "public" : field.getMetaAsString(defaultScopeName); + String fieldScope = defaultScope; + if (field.getMeta(localScopeName) != null) { + fieldScope = field.getMetaAsString(localScopeName); + } + return fieldScope; + } + + /** + * Convert string into something that can be rendered nicely into a javadoc + * comment. + * Prefix each line with a star ('*'). + * @param string + */ + private String toJavaDoc(String string, int indent) { + StringBuffer result = new StringBuffer(); + + if(string!=null) { + String[] lines = StringUtils.split(string, "\n\r\f"); + for (int i = 0; i < lines.length; i++) { + String docline = " * " + lines[i] + "\n"; + result.append(StringUtils.leftPad(docline, docline.length() + indent)); + } + } + + return result.toString(); + } + + + /** + * Returns the last part of type if it is in the set of imports. + * e.g. java.util.Date would become Date, if imports contains + * java.util.Date. + * + * @param type + * @param imports + * @return String + */ + private String shortenType(String type, TreeSet imports) { + if( imports.contains(type) ) { + return type.substring( type.lastIndexOf('.')+1 ); + } + else { + if( type.endsWith("[]") ) { + return shortenType( type.substring(0, type.length()-2), imports ) + "[]"; + } + else { + return type; + } + } + } + } Index: ClassMapping.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java/ClassMapping.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ClassMapping.java 5 Jan 2003 02:11:24 -0000 1.4 --- ClassMapping.java 16 Jan 2003 20:52:38 -0000 1.5 *************** *** 3,10 **** --- 3,13 ---- import java.util.ArrayList; + import java.util.Collection; import java.util.HashMap; + import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; + import java.util.Set; [...1148 lines suppressed...] + * @return boolean + */ + public boolean shouldBeAbstract() { + return shouldBeAbstract; + } + + // Based on some raw heuristics the following method validates the provided metaattribs. + void validateMetaAttribs() { + // Inform that "extends" is not used if this one is a genuine subclass + if(getSuperClass()!=null && getMeta("extends")!=null) { + log.warn("Warning: meta attribute extends='" + getMetaAsString("extends") + "' will be ignored for subclass " + name); + } + + + } + + + } Index: ClassName.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java/ClassName.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ClassName.java 5 Jan 2003 02:11:24 -0000 1.3 --- ClassName.java 16 Jan 2003 20:52:38 -0000 1.4 *************** *** 84,87 **** --- 84,91 ---- return isArray; } + + public String toString() { + return getFullyQualifiedName(); + } } Index: CodeGenerator.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java/CodeGenerator.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** CodeGenerator.java 5 Jan 2003 02:11:24 -0000 1.3 --- CodeGenerator.java 16 Jan 2003 20:52:38 -0000 1.4 *************** *** 12,15 **** --- 12,20 ---- import java.util.Iterator; import java.util.List; + + import org.apache.commons.collections.MultiHashMap; + import org.apache.commons.collections.MultiMap; + import org.apache.commons.logging.Log; + import org.apache.commons.logging.LogFactory; import org.jdom.Document; import org.jdom.Element; *************** *** 23,101 **** */ public class CodeGenerator { ! ! public static void main(String[] args) { ! try { ! ArrayList mappingFiles = new ArrayList(); ! ! SAXBuilder builder = new SAXBuilder(); ! builder.setEntityResolver( new DTDEntityResolver() ); ! builder.setErrorHandler( new ErrorHandler() { ! public void error(SAXParseException error) { ! System.err.println( "Error parsing XML: " + error.getSystemId() + '(' + error.getLineNumber() + ')' ); ! error.printStackTrace(); ! } ! public void fatalError(SAXParseException error) { ! error(error); ! } ! public void warning(SAXParseException error) { ! System.err.println( "Warning parsing XML: " + error.getSystemId() + '(' + error.getLineNumber() + ')' ); ! } ! } ); ! ! String outputDir = null; ! ! List generators = new ArrayList(); ! ! // parse command line parameters ! for (int i = 0; i < args.length; i++) { ! if (args[i].startsWith("--")) { ! ! if ( args[i].startsWith("--config=") ) { ! // parse config xml file ! Document document = builder.build( new File( args[i].substring(9) ) ); ! Iterator generateElements = document.getRootElement().getChildren("generate").iterator(); ! ! while (generateElements.hasNext()) { ! generators.add( new Generator( (Element) generateElements.next() ) ); ! } ! } ! else if ( args[i].startsWith("--output=") ) { ! outputDir = args[i].substring(9); ! } ! ! } ! else { ! mappingFiles.add( args[i] ); ! } ! } ! ! // if no config xml file, add a default generator ! if (generators.size() == 0) { ! generators.add( new Generator() ); ! } ! ! HashMap classMappings = new HashMap(); ! ! for ( Iterator iter = mappingFiles.iterator(); iter.hasNext(); ) { ! // parse the mapping file ! Document document = builder.build( new File( (String) iter.next() ) ); ! Iterator classElements = document.getRootElement().getChildren("class").iterator(); ! while ( classElements.hasNext() ) { ! ClassMapping cmap = new ClassMapping( (Element) classElements.next()); ! classMappings.put(cmap.getCanonicalName(),cmap); ! } ! } ! ! // generate source files ! for ( Iterator iterator = generators.iterator(); iterator.hasNext(); ) { ! Generator g = (Generator) iterator.next(); ! g.setBaseDirName(outputDir); ! g.generate(classMappings); ! } ! } ! catch (Exception e) { ! e.printStackTrace(); ! } ! } } --- 28,111 ---- */ public class CodeGenerator { ! ! private static final Log log = LogFactory.getLog(CodeGenerator.class); ! ! public static void main(String[] args) { ! try { ! ArrayList mappingFiles = new ArrayList(); ! ! SAXBuilder builder = new SAXBuilder(); ! builder.setEntityResolver( new DTDEntityResolver() ); ! ! builder.setErrorHandler( new ErrorHandler() { ! public void error(SAXParseException error) { ! log.error("Error parsing XML: " + error.getSystemId() + '(' + error.getLineNumber() + ')',error); ! } ! public void fatalError(SAXParseException error) { ! error(error); ! } ! public void warning(SAXParseException error) { ! log.warn("Warning parsing XML: " + error.getSystemId() + '(' + error.getLineNumber() + ')' ); ! } ! } ); ! ! String outputDir = null; ! ! List generators = new ArrayList(); ! ! MultiMap globalMetas = new MultiHashMap(); ! // parse command line parameters ! for (int i = 0; i < args.length; i++) { ! if (args[i].startsWith("--")) { ! ! if ( args[i].startsWith("--config=") ) { ! // parse config xml file ! Document document = builder.build( new File( args[i].substring(9) ) ); ! globalMetas = MetaAttributeHelper.loadAndMergeMetaMap(document.getRootElement(), null); ! Iterator generateElements = document.getRootElement().getChildren("generate").iterator(); ! ! while (generateElements.hasNext()) { ! generators.add( new Generator( (Element) generateElements.next() ) ); ! } ! } ! else if ( args[i].startsWith("--output=") ) { ! outputDir = args[i].substring(9); ! } ! ! } ! else { ! mappingFiles.add( args[i] ); ! } ! } ! ! // if no config xml file, add a default generator ! if (generators.size() == 0) { ! generators.add( new Generator() ); ! } ! ! HashMap classMappings = new HashMap(); ! builder.setValidation(true); ! for ( Iterator iter = mappingFiles.iterator(); iter.hasNext(); ) { ! // parse the mapping file ! Document document = builder.build( new File( (String) iter.next() ) ); ! Iterator classElements = document.getRootElement().getChildren("class").iterator(); ! MultiMap mm = MetaAttributeHelper.loadAndMergeMetaMap(document.getRootElement(), globalMetas); ! while ( classElements.hasNext() ) { ! ClassMapping cmap = new ClassMapping( (Element) classElements.next(), mm); ! classMappings.put(cmap.getCanonicalName(),cmap); ! } ! } ! ! // generate source files ! for ( Iterator iterator = generators.iterator(); iterator.hasNext(); ) { ! Generator g = (Generator) iterator.next(); ! g.setBaseDirName(outputDir); ! g.generate(classMappings); ! } ! } ! catch (Exception e) { ! e.printStackTrace(); ! } ! } } Index: Field.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java/Field.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Field.java 5 Jan 2003 02:11:24 -0000 1.3 --- Field.java 16 Jan 2003 20:52:38 -0000 1.4 *************** *** 2,5 **** --- 2,11 ---- package net.sf.hibernate.tool.hbm2java; + import java.util.Collection; + import java.util.Iterator; + import java.util.Set; + + import org.apache.commons.collections.MultiMap; + public class Field { *************** *** 12,77 **** private boolean nullable = true; private ClassName classType; ! ! public Field(String name, ClassName type, boolean nullable) { ! this.name = name; ! setType(type); ! this.nullable = nullable; ! ! this.asSuffix = name.substring(0, 1).toUpperCase() + name.substring(1); ! } ! ! public Field(String name, ClassName type, boolean nullable, boolean id, boolean generated) { ! this.name = name; ! setType(type); ! this.id = id; ! this.nullable = nullable; //? ! this.generated = generated; ! this.asSuffix = name.substring(0, 1).toUpperCase() + name.substring(1); ! } ! ! public Field(String name, ClassName type, String initialisation, boolean nullable) { ! this(name, type, nullable); ! ! this.initialisation = initialisation; ! } ! ! public String getInitialisation() { ! return this.initialisation; ! } ! ! public String getName() { ! return this.name; ! } ! ! public String getAsSuffix() { ! return this.asSuffix; ! } ! ! public String getType() { ! String type = classType.getFullyQualifiedName(); ! int loc = type.indexOf("java.lang."); ! if ( loc<0 ) { ! return type; ! } ! else { ! return type.substring(10); ! } ! } ! ! public boolean isIdentifier() { ! return id; ! } ! ! public boolean isNullable() { ! return nullable; ! } ! ! public boolean isGenerated() { ! return generated; ! } ! ! public String toString() { ! return getType() + ":" + getName(); ! } /** --- 18,89 ---- private boolean nullable = true; private ClassName classType; ! private MultiMap metaattribs = null; ! private ClassName foreignClass; ! private Set foreignKeys; ! ! ! public Field(String name, ClassName type, boolean nullable, MultiMap metaattribs) { ! initWith(name, type, name, nullable, id, generated, null, null, metaattribs); ! } ! ! public Field(String name, ClassName type, boolean nullable, boolean id, boolean generated, MultiMap metaattribs) { ! initWith(name, type, initialisation, nullable, id, generated, null, null, metaattribs); ! } ! ! public Field(String name, ClassName type, String initialisation, boolean nullable, ClassName foreignClass, Set foreignKeys, MultiMap metaattribs) { ! initWith(name, type, initialisation, nullable, id, generated, foreignClass, foreignKeys, metaattribs); ! } ! ! protected void initWith(String name, ClassName type, String initialisation, boolean nullable, boolean id, boolean generated, ClassName foreignClass, Set foreignKeys, MultiMap metaattribs) { ! this.name = name; ! setType(type); ! this.initialisation = initialisation; ! this.nullable = nullable; ! this.id = id; ! this.generated = generated; ! this.asSuffix = name.substring(0, 1).toUpperCase() + name.substring(1); ! this.foreignClass = foreignClass; ! this.foreignKeys = foreignKeys; ! setMeta(metaattribs); ! } ! ! public String getInitialisation() { ! return this.initialisation; ! } ! ! public String getName() { ! return this.name; ! } ! ! public String getAsSuffix() { ! return this.asSuffix; ! } ! ! public String getType() { ! String type = classType.getFullyQualifiedName(); ! int loc = type.indexOf("java.lang."); ! if ( loc<0 ) { ! return type; ! } ! else { ! return type.substring(10); ! } ! } ! ! public boolean isIdentifier() { ! return id; ! } ! ! public boolean isNullable() { ! return nullable; ! } ! ! public boolean isGenerated() { ! return generated; ! } ! ! public String toString() { ! return getType() + ":" + getName(); ! } /** *************** *** 84,97 **** } ! private void setType(ClassName type) { ! this.classType = type; ! } ! ! ! } ! ! --- 96,159 ---- } ! private void setType(ClassName type) { ! this.classType = type; ! } ! /** ! * Method setMeta. ! * @param metaForProperty ! */ ! private void setMeta(MultiMap multiMap) { ! if(multiMap==null) { ! ! throw new RuntimeException("Forget it!"); ! } ! metaattribs = multiMap; ! } + Collection getMeta(String attribute) { + return (Collection) metaattribs.get(attribute); + } + /** + * Method getMetaAsString. + * @param string + * @return String + */ + public String getMetaAsString(String attribute) { + Collection c= getMeta(attribute); + + if(c==null) { + return ""; + } else { + StringBuffer sb = new StringBuffer(); + for (Iterator iter = c.iterator(); iter.hasNext();) { + Object element = (Object) iter.next(); + sb.append(element.toString()); + } + return sb.toString(); + } + } + /** + * Returns the foreignClass. + * @return ClassName + */ + public ClassName getForeignClass() { + return foreignClass; + } + /** + * Sets the foreignClass. + * @param foreignClass The foreignClass to set + */ + public void setForeignClass(ClassName foreignClass) { + this.foreignClass = foreignClass; + } + /** + * Returns the foreignKeys. + * @return Set + */ + public Set getForeignKeys() { + return foreignKeys; + } + } Index: Generator.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java/Generator.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Generator.java 13 Jan 2003 08:57:43 -0000 1.4 --- Generator.java 16 Jan 2003 20:52:38 -0000 1.5 *************** *** 9,12 **** --- 9,14 ---- import java.util.Map; + import org.apache.commons.logging.Log; + import org.apache.commons.logging.LogFactory; import org.jdom.Element; *************** *** 16,94 **** */ public class Generator { ! private String rendererClass = "net.sf.hibernate.tool.hbm2java.BasicRenderer"; ! private String baseDirName = "generated"; ! private String packageName = null; ! private String suffix = ""; ! private String extension = "java"; ! private boolean lowerFirstLetter = false; ! ! /** ! * Constructs a new SchemaExport using the defaults. ! */ ! public Generator () {} ! ! /** ! * Constructs a new SchemaExport, configured from XML. ! */ ! public Generator(Element generateElement) throws Exception { ! String value = null; ! ! // set rendererClass field ! if ((this.rendererClass = generateElement.getAttributeValue("renderer")) == null) { ! throw new Exception("attribute renderer is required."); ! } ! ! // set dirName field ! if ((value = generateElement.getAttributeValue("dir")) != null) { ! this.baseDirName = value; ! } ! ! // set packageName field ! this.packageName = generateElement.getAttributeValue("package"); ! ! // set suffix ! if ((value = generateElement.getAttributeValue("suffix")) != null) { ! this.suffix = value; ! } ! ! // set extension ! if ((value = generateElement.getAttributeValue("extension")) != null) { ! this.extension = value; ! } ! ! // set lowerFirstLetter ! value = generateElement.getAttributeValue("lowerFirstLetter"); ! if ( (value == null) || ( value.equals("false") ) ) { ! this.lowerFirstLetter = false; ! } ! else if ( value.equals("true") ) { ! this.lowerFirstLetter = true; ! } ! else { ! throw new Exception("invalid value for element lowerFirstLeter. should be true or false."); ! } ! } ! ! /** ! * ! */ ! public void generate(Map classMappingsCol) throws Exception { ! Renderer renderer = (Renderer) Class.forName(this.rendererClass).newInstance(); ! ! for (Iterator classMappings = classMappingsCol.values().iterator(); classMappings.hasNext();) { ! ClassMapping classMapping = (ClassMapping) classMappings.next(); ! writeRecur(classMapping, classMappingsCol, renderer); ! } ! for (Iterator cmpMappings = ClassMapping.getComponents(); cmpMappings.hasNext();) { ! ClassMapping mapping = (ClassMapping) cmpMappings.next(); ! write(mapping, classMappingsCol, renderer); ! } ! } ! ! private void writeRecur(ClassMapping classMapping, Map class2classmap, Renderer renderer) throws Exception { ! write(classMapping, class2classmap, renderer); ! if (!classMapping.getSubclasses().isEmpty()) { Iterator it = classMapping.getSubclasses().iterator(); --- 18,99 ---- */ public class Generator { ! ! private Log log = LogFactory.getLog(Generator.class); ! ! private String rendererClass = "net.sf.hibernate.tool.hbm2java.BasicRenderer"; ! private String baseDirName = "generated"; ! private String packageName = null; ! private String suffix = ""; ! private String extension = "java"; ! private boolean lowerFirstLetter = false; ! ! /** ! * Constructs a new Generator using the defaults. ! */ ! public Generator () {} ! ! /** ! * Constructs a new Generator, configured from XML. ! */ ! public Generator(Element generateElement) throws Exception { ! String value = null; ! ! // set rendererClass field ! if ((this.rendererClass = generateElement.getAttributeValue("renderer")) == null) { ! throw new Exception("attribute renderer is required."); ! } ! ! // set dirName field ! if ((value = generateElement.getAttributeValue("dir")) != null) { ! this.baseDirName = value; ! } ! ! // set packageName field ! this.packageName = generateElement.getAttributeValue("package"); ! ! // set suffix ! if ((value = generateElement.getAttributeValue("suffix")) != null) { ! this.suffix = value; ! } ! ! // set extension ! if ((value = generateElement.getAttributeValue("extension")) != null) { ! this.extension = value; ! } ! ! // set lowerFirstLetter ! value = generateElement.getAttributeValue("lowerFirstLetter"); ! if ( (value == null) || ( value.equals("false") ) ) { ! this.lowerFirstLetter = false; ! } ! else if ( value.equals("true") ) { ! this.lowerFirstLetter = true; ! } ! else { ! throw new Exception("invalid value for element lowerFirstLeter. should be true or false."); ! } ! ! } ! ! /** ! * ! */ ! public void generate(Map classMappingsCol) throws Exception { ! Renderer renderer = (Renderer) Class.forName(this.rendererClass).newInstance(); ! ! for (Iterator classMappings = classMappingsCol.values().iterator(); classMappings.hasNext();) { ! ClassMapping classMapping = (ClassMapping) classMappings.next(); ! writeRecur(classMapping, classMappingsCol, renderer); ! } ! for (Iterator cmpMappings = ClassMapping.getComponents(); cmpMappings.hasNext();) { ! ClassMapping mapping = (ClassMapping) cmpMappings.next(); ! write(mapping, classMappingsCol, renderer); ! } ! } ! private void writeRecur(ClassMapping classMapping, Map class2classmap, Renderer renderer) throws Exception { ! write(classMapping, class2classmap, renderer); ! if (!classMapping.getSubclasses().isEmpty()) { Iterator it = classMapping.getSubclasses().iterator(); *************** *** 98,183 **** } } - - - /** - * - */ - private void write(ClassMapping classMapping, Map class2classmap, Renderer renderer) throws Exception { - File dir = this.getDir( classMapping.getPackageName() ); - File file = new File( dir, this.getFileName( classMapping.getName() ) ); - - PrintWriter writer = new PrintWriter(new FileOutputStream(file)); - - renderer.render( this.getName( classMapping.getName() ), classMapping, class2classmap, writer ); - writer.close(); - } - - /** - * - */ - private String getFileName(String className) { - return this.getName(className) + "." + this.extension; - } - - /** - * - */ - private String getName(String className) { - String name = null; - - if (this.lowerFirstLetter) { - name = className.substring(0, 1).toLowerCase() + className.substring(1, className.length()); - } - else { - name = className; - } - - return name + this.suffix; - } - - /** - * - */ - private File getDir(String packageName) throws Exception { - File baseDir = new File(this.baseDirName); - File dir = null; - - if (this.packageName == null) { - dir = new File(baseDir, packageName==null ? "" : packageName.replace('.', File.separatorChar)); - } - else { - dir = new File(baseDir, this.packageName.replace('.', File.separatorChar)); - } - - // if the directory exists, make sure it is a directory - if (dir.exists()) { - if (!dir.isDirectory()) { - throw new Exception("The path: " + dir.getCanonicalPath() + " exists, but is not a directory"); - } - } // else make the directory and any non-existent parent directories - else { - if (!dir.mkdirs()) { - throw new Exception("unable to create directory: " + dir.getCanonicalPath()); - } - } - - return dir; - } - - public String getBaseDirName() { - return baseDirName; - } - - public void setBaseDirName(String baseDirName) { - if (baseDirName != null) { - this.baseDirName = baseDirName; - } - } - - } --- 103,181 ---- } } + /** + * + */ + private void write(ClassMapping classMapping, Map class2classmap, Renderer renderer) throws Exception { + File dir = this.getDir(classMapping.getGeneratedPackageName()); + File file = new File(dir, this.getFileName(classMapping.getGeneratedName())); + log.debug("Writing " + file); + + PrintWriter writer = new PrintWriter(new FileOutputStream(file)); + + renderer.render(this.packageName, classMapping, class2classmap, writer); + writer.close(); + } + + /** + * + */ + private String getFileName(String className) { + return this.getName(className) + "." + this.extension; + } + /** + * + */ + private String getName(String className) { + String name = null; + if (this.lowerFirstLetter) { + name = className.substring(0, 1).toLowerCase() + className.substring(1, className.length()); + } else { + name = className; + } + return name + this.suffix; + } + /** + * + */ + private File getDir(String packageName) throws Exception { + File baseDir = new File(this.baseDirName); + File dir = null; + + if (this.packageName == null) { + dir = new File(baseDir, packageName==null ? "" : packageName.replace('.', File.separatorChar)); + } else { + dir = new File(baseDir, this.packageName.replace('.', File.separatorChar)); + } + + // if the directory exists, make sure it is a directory + if (dir.exists()) { + if (!dir.isDirectory()) { + throw new Exception("The path: " + dir.getCanonicalPath() + " exists, but is not a directory"); + } + } // else make the directory and any non-existent parent directories + else { + if (!dir.mkdirs()) { + throw new Exception("unable to create directory: " + dir.getCanonicalPath()); + } + } + + return dir; + } + + public String getBaseDirName() { + return baseDirName; + } + + public void setBaseDirName(String baseDirName) { + if (baseDirName != null) { + this.baseDirName = baseDirName; + } + } + + } |