From: <max...@us...> - 2003-04-05 16:18:05
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java In directory sc8-pr-cvs1:/tmp/cvs-serv14684/src/net/sf/hibernate/tool/hbm2java Modified Files: BasicRenderer.java Generator.java Renderer.java Added Files: FinderRenderer.java Log Message: * Small refactoring of Renderer. Provide info about actual generated class and packagename * Added Matt Halls Finder generation code with adjustments. --- NEW FILE: FinderRenderer.java --- package net.sf.hibernate.tool.hbm2java; import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * <p>Title: Basic Finder Generator for Hibernate 2</p> * <p>Description: Generate basic finders for hibernate properties. * This requires two things in the hbm.xml files. * * The first is an indication of which fields you want to generate finders for. * You indicate that with a meta block inside a property tag such as * * <property name="name" column="name" type="string"> * <meta attribute="finder-method">findByName</meta> * </property> * * The finder method name will be the text enclosed in the meta tags. * * The second is to create a config file for hbm2java of the format: * * <codegen> * <generate renderer="net.sf.hibernate.tool.hbm2java.BasicRenderer"/> * <generate suffix="Finder" renderer="net.sf.hibernate.tool.hbm2java.FinderRenderer"/> * </codegen> * * And then use the param to hbm2java --config=xxx.xml where xxx.xml is the config file you * just created. * * An optional parameter is meta tag at the class level of the format: * * <meta attribute="sessionMethod">com.whatever.SessionTable.getSessionTable().getSession();</meta> * * Which would be the way in which you get sessions if you use the Thread Local Session pattern * like I do. * </p> * <p>Copyright: Copyright (c) 2003</p> * @author Matt Hall (matt2k(at)users.sf.net) * @author Max Rydahl Andersen (small adjustments and bugfixes) * @version 1.0 */ public class FinderRenderer extends AbstractRenderer { private static final String MT_FINDERMETHOD = "finder"; private static Log log = LogFactory.getLog(FinderRenderer.class); /** * Render finder classes. *@param classMapping *@param class2classmap *@param mainwriter *@exception Exception */ public void render(String savedToPackage, String savedToClass, ClassMapping classMapping, Map class2classmap, PrintWriter mainwriter) throws Exception { if (savedToPackage!=null && !savedToPackage.trim().equals("")) { mainwriter.println("package " + savedToPackage +";"); } else 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); writer.println("/** Automatically generated Finder class for " + savedToClass + ".\n" + " * @author Hibernate FinderGenerator " + " **/"); String classScope = "public"; writer.print(classScope + " class " + savedToClass); // always implements Serializable writer.print(" implements Serializable"); writer.println(" {"); writer.println(); // switch to another writer to be able to insert the // veto- and changeSupport fields StringWriter strPropWriter = new StringWriter(); PrintWriter propWriter = new PrintWriter(strPropWriter); doFinders(classMapping, class2classmap, propWriter); propWriter.println("}"); writer.print(strPropWriter.toString()); // finally write the imports doImports(classMapping, mainwriter); mainwriter.print(strWriter.toString()); } /** * Create finders for properties that have the <meta atttribute="finder-method"> * finderName</meta> block defined. Also, create a findAll(Session) method. * *@param classMapping *@param class2classmap *@param writer */ public void doFinders(ClassMapping classMapping, Map class2classmap, PrintWriter writer) { // Find out of there is a system wide way to get sessions defined String sessionMethod = classMapping.getMetaAsString("sessionMethod").trim(); // fields for (Iterator fields = classMapping.getFields().iterator(); fields.hasNext(); ) { Field field = (Field) fields.next(); if (field.getMeta(MT_FINDERMETHOD) != null) { String finderName = field.getMetaAsString(MT_FINDERMETHOD); if ("".equals(sessionMethod)) { // Make the method signature require a session to be passed in writer.println(" public static List " + finderName + "(Session session, " + getTrueTypeName(field, class2classmap) + " " + field.getName() + ") " + "throws SQLException, HibernateException {"); } else { // Use the session method to get the session to execute the query writer.println(" public static List " + finderName + "(" + getTrueTypeName(field, class2classmap) + " " + field.getName() + ") " + "throws SQLException, HibernateException {"); writer.println(" Session session = " + sessionMethod); } writer.println(" List finds = session.find(\"from " + classMapping.getName() + " in class " + classMapping.getPackageName() + "." + classMapping.getName() + " where " + classMapping.getName() + "." + field.getName() + "=?\", " + getFieldAsObject(false, field) + ", " + getFieldAsHibernateType(false, field) + ");"); writer.println(" return finds;"); writer.println(" }"); } writer.println(); } // Create the findAll() method if ("".equals(sessionMethod)) { writer.println(" public static List findAll" + "(Session session) " + "throws SQLException, HibernateException {"); } else { writer.println(" public static List findAll() " + "throws SQLException, HibernateException {"); writer.println(" Session session = " + sessionMethod); } writer.println(" List finds = session.find(\"from " + classMapping.getName() + " in class " + classMapping.getPackageName() + "." + classMapping.getName() + "\");"); writer.println(" return finds;"); writer.println(" }"); writer.println(); } static Map primitiveToObject = new HashMap(); { primitiveToObject.put("char", "Character"); primitiveToObject.put("byte", "Byte"); primitiveToObject.put("short", "Short"); primitiveToObject.put("int", "Integer"); primitiveToObject.put("long", "Long"); primitiveToObject.put("boolean", "Boolean"); primitiveToObject.put("float", "Float"); primitiveToObject.put("double", "Double"); } /** * Generate the imports for the finder class. * *@param classMapping *@param writer */ public void doImports(ClassMapping classMapping, PrintWriter writer) { // imports is not included from the class it self as this is a separate generated class. /* classMapping.getImports().add("java.io.Serializable"); for (Iterator imports = classMapping.getImports().iterator(); imports.hasNext(); ) { writer.println("import " + imports.next() + ";"); } */ // Imports for finders writer.println("import java.io.Serializable;"); writer.println("import java.util.List;"); writer.println("import java.sql.SQLException;"); writer.println(); // * import is bad style. But better than importing classing that we don't necesarrily uses... writer.println("import net.sf.hibernate.*;"); // writer.println("import net.sf.hibernate.Hibernate;"); // writer.println("import net.sf.hibernate.HibernateException;"); writer.println(); } /** * Gets the fieldAsObject attribute of the FinderRenderer object * *@param prependThis *@param field *@return */ private String getFieldAsObject(boolean prependThis, Field field) { ClassName type = field.getClassType(); if (type != null && type.isPrimitive() && !type.isArray()) { String typeName = (String) primitiveToObject.get(type.getName()); typeName = "new " + typeName + "( "; typeName += prependThis ? "this." : ""; return typeName + field.getName() + " )"; } return field.getName(); } /** * Coversion map for field types to Hibernate types, might be good to move * this to some other more general class */ static Map hibType = new HashMap(); { hibType.put("char", "Hibernate.CHARACTER"); hibType.put("byte", "Hibernate.BYTE"); hibType.put("short", "Hibernate.SHORT"); hibType.put("int", "Hibernate.INTEGER"); hibType.put("long", "Hibernate.LONG"); hibType.put("boolean", "Hibernate.BOOLEAN"); hibType.put("float", "Hibernate.FLOAT"); hibType.put("double", "Hibernate.DOUBLE"); hibType.put("String", "Hibernate.STRING"); } /** * Return the hibernate type string for the given field * *@param prependThis *@param field *@return */ private String getFieldAsHibernateType(boolean prependThis, Field field) { ClassName type = field.getClassType(); String hibTypeString = (String) hibType.get(type.getName()); if (hibType != null) { return hibTypeString; } else { return "Hibernate.OBJECT"; } } } Index: BasicRenderer.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java/BasicRenderer.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** BasicRenderer.java 29 Mar 2003 04:08:49 -0000 1.13 --- BasicRenderer.java 5 Apr 2003 16:18:01 -0000 1.14 *************** *** 23,28 **** static private Log log = LogFactory.getLog(BasicRenderer.class); ! public void render(ClassMapping classMapping, Map class2classmap, PrintWriter mainwriter) throws Exception { ! if ( classMapping.getGeneratedPackageName()!=null ) { mainwriter.println("package " + classMapping.getGeneratedPackageName() + ";"); } --- 23,30 ---- static private Log log = LogFactory.getLog(BasicRenderer.class); ! public void render(String savedToPackage, String savedToClass, ClassMapping classMapping, Map class2classmap, PrintWriter mainwriter) throws Exception { ! if (savedToPackage!=null && !savedToPackage.trim().equals("")) { ! mainwriter.println("package " + savedToPackage + ";"); ! } else if ( classMapping.getGeneratedPackageName()!=null ) { mainwriter.println("package " + classMapping.getGeneratedPackageName() + ";"); } *************** *** 50,56 **** } if(classMapping.shouldBeAbstract()) { ! writer.print( "abstract " + classScope + " class " + classMapping.getGeneratedName() ); } else { ! writer.print( classScope + " class " + classMapping.getGeneratedName() ); } --- 52,58 ---- } if(classMapping.shouldBeAbstract()) { ! writer.print( "abstract " + classScope + " class " + savedToClass ); } else { ! writer.print( classScope + " class " + savedToClass ); } *************** *** 93,97 **** doFields(classMapping, propWriter); ! doConstructors(classMapping, class2classmap, propWriter); String vetoSupport = makeSupportField("vetos", classMapping.getAllFields()); --- 95,99 ---- doFields(classMapping, propWriter); ! doConstructors(savedToClass, classMapping, class2classmap, propWriter); String vetoSupport = makeSupportField("vetos", classMapping.getAllFields()); *************** *** 102,106 **** doToString(classMapping, propWriter); ! doEqualsAndHashCode(classMapping, propWriter); propWriter.println("}"); --- 104,108 ---- doToString(classMapping, propWriter); ! doEqualsAndHashCode(savedToClass,classMapping, propWriter); propWriter.println("}"); *************** *** 179,188 **** ! public void doConstructors(ClassMapping classMapping, Map class2classmap, PrintWriter writer) { // full constructor List allFieldsForFullConstructor = classMapping.getAllFieldsForFullConstructor(); writer.println(" /** full constructor */"); ! String fullCons = " public " + classMapping.getGeneratedName() + StringHelper.OPEN_PAREN; --- 181,190 ---- ! public void doConstructors(String savedToClass, ClassMapping classMapping, Map class2classmap, PrintWriter writer) { // full constructor List allFieldsForFullConstructor = classMapping.getAllFieldsForFullConstructor(); writer.println(" /** full constructor */"); ! String fullCons = " public " + savedToClass + StringHelper.OPEN_PAREN; *************** *** 223,227 **** if (allFieldsForFullConstructor.size() > 0) { writer.println(" /** default constructor */"); ! writer.println(" public " + classMapping.getGeneratedName() + "() {"); writer.println(" }"); writer.println(); --- 225,229 ---- if (allFieldsForFullConstructor.size() > 0) { writer.println(" /** default constructor */"); ! writer.println(" public " + savedToClass + "() {"); writer.println(" }"); writer.println(); *************** *** 234,238 **** writer.println(" /** minimal constructor */"); ! String minCons = " public " + classMapping.getGeneratedName() + StringHelper.OPEN_PAREN; for (Iterator fields = allFieldsForMinimalConstructor.iterator(); fields.hasNext();) { Field field = (Field) fields.next(); --- 236,240 ---- writer.println(" /** minimal constructor */"); ! String minCons = " public " + savedToClass + "("; for (Iterator fields = allFieldsForMinimalConstructor.iterator(); fields.hasNext();) { Field field = (Field) fields.next(); *************** *** 294,302 **** } ! public void doEqualsAndHashCode(ClassMapping classMapping, PrintWriter writer) { 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();) { --- 296,304 ---- } ! public void doEqualsAndHashCode(String savedToClass, ClassMapping classMapping, PrintWriter writer) { if ( classMapping.mustImplementEquals() ) { writer.println(" public boolean equals(Object other) {"); ! writer.println(" if ( !(other instanceof " + savedToClass + ") ) return false;"); ! writer.println(" " + savedToClass + " castOther = (" + savedToClass + ") other;"); writer.println(" return new EqualsBuilder()"); for (Iterator fields = classMapping.getFields().iterator(); fields.hasNext();) { Index: Generator.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java/Generator.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** Generator.java 25 Mar 2003 08:08:02 -0000 1.8 --- Generator.java 5 Apr 2003 16:18:02 -0000 1.9 *************** *** 66,78 **** // 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."); ! } } --- 66,70 ---- // set lowerFirstLetter value = generateElement.getAttributeValue("lowerFirstLetter"); ! this.lowerFirstLetter = Boolean.valueOf(value).booleanValue(); } *************** *** 115,123 **** 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(classMapping, class2classmap, writer); writer.close(); } --- 107,115 ---- File dir = this.getDir(classMapping.getGeneratedPackageName()); File file = new File(dir, this.getFileName(classMapping.getGeneratedName())); ! log.info("Writing " + file); PrintWriter writer = new PrintWriter(new FileOutputStream(file)); ! renderer.render(this.packageName, getName(classMapping.getGeneratedName()), classMapping, class2classmap, writer); writer.close(); } Index: Renderer.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java/Renderer.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Renderer.java 25 Mar 2003 08:08:04 -0000 1.4 --- Renderer.java 5 Apr 2003 16:18:02 -0000 1.5 *************** *** 8,12 **** public interface Renderer { ! public void render(ClassMapping classMapping, Map class2classmap, PrintWriter writer) throws Exception; } --- 8,12 ---- public interface Renderer { ! public void render(String savedToPackage, String savedToClass, ClassMapping classMapping, Map class2classmap, PrintWriter writer) throws Exception; } |