Couldn't find those upload thing. Maybe, because this RFE is already assigned to you?
Anyway here comes the patch. In addition to changing the BasicRenderer it fixes something I consider a bug(typo) in ClassName, where some misplaced brace lets remain the name null if the type is a primitive. regards Klaus
? test ? test ? target Index: src/net/sf/hibernate/tool/hbm2java/BasicRenderer.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java/BasicRenderer.java,v retrieving revision 1.9 diff -u -r1.9 BasicRenderer.java --- src/net/sf/hibernate/tool/hbm2java/BasicRenderer.java 2 Feb 2003 17:34:09 -0000 1.9 +++ src/net/sf/hibernate/tool/hbm2java/BasicRenderer.java 10 Feb 2003 22:40:59 -0000 @@ -16,6 +16,10 @@ import org.apache.commons.logging.LogFactory; public class BasicRenderer implements Renderer { + + static final protected int ORDINARY = 0; + static final protected int BOUND = 1; + static final protected int CONSTRAINT = 3;//any constraint properties are bound as well static private Log log = LogFactory.getLog(BasicRenderer.class); /** @@ -40,6 +44,17 @@ return name; } + private String makeSupportField(String fieldName, List fieldList) { + String suffix=""; + boolean needSuffix=false; + for( Iterator fields = fieldList.iterator(); fields.hasNext();) { + String name = ((Field)fields.next()).getName(); + if(name.equals(fieldName)) needSuffix=true; + suffix+=name; + } + return needSuffix ? fieldName+"_"+suffix : fieldName; + } + String getTrueTypeName(ClassName cn, Map class2classmap) { String name = cn.getFullyQualifiedName(); ClassMapping cmap = (ClassMapping) class2classmap.get(name); @@ -116,19 +131,31 @@ writer.println(" {"); writer.println(); - - doFields(classMapping, writer); - doConstructors(classMapping, class2classmap, writer); + // switch to another writer to be able to insert the + // veto- and changeSupport fields + StringWriter strPropWriter = new StringWriter(); + PrintWriter propWriter = new PrintWriter(strPropWriter); + + doFields(classMapping, propWriter); + + doConstructors(classMapping, class2classmap, propWriter); - doFieldAccessors(classMapping, class2classmap, writer); + String vetoSupport = makeSupportField("vetos", classMapping.getAllFields()); + String changeSupport = makeSupportField("changes", classMapping.getAllFields()); + int fieldTypes = doFieldAccessors(classMapping, class2classmap, propWriter, vetoSupport, changeSupport); + doSupportMethods(fieldTypes, vetoSupport, changeSupport, propWriter); - doToString(classMapping, writer); + doToString(classMapping, propWriter); - doEqualsAndHashCode(classMapping, writer); + doEqualsAndHashCode(classMapping, propWriter); - writer.println("}"); + propWriter.println("}"); + + //insert change and VetoSupport + doSupports(fieldTypes, classMapping, vetoSupport, changeSupport, writer); + writer.print(strPropWriter.toString()); // finally write the imports doImports(classMapping, mainwriter); @@ -137,6 +164,67 @@ } + /** + * Method doSupportMethods. + * @param fieldTypes + * @param vetoSupport + * @param changeSupport + * @param propWriter + */ + private void doSupportMethods( + int fieldTypes, + String vetoSupport, + String changeSupport, + PrintWriter writer) { + if((fieldTypes&CONSTRAINT)==CONSTRAINT) { + writer.println(" public void addVetoableChangeListener( VetoableChangeListener l ) {"); + writer.println(" "+vetoSupport+".addVetoableChangeListener(l);"); + writer.println(" }"); + writer.println(" public void removeVetoableChangeListener( VetoableChangeListener l ) {"); + writer.println(" "+vetoSupport+".removeVetoableChangeListener(l);"); + writer.println(" }"); + writer.println(); + } + if((fieldTypes&BOUND)==BOUND) { + writer.println(" public void addPropertyChangeListener( PropertyChangeListener l ) {"); + writer.println(" "+changeSupport+".addPropertyChangeListener(l);"); + writer.println(" }"); + writer.println(" public void removePropertyChangeListener( PropertyChangeListener l ) {"); + writer.println(" "+changeSupport+".removePropertyChangeListener(l);"); + writer.println(" }"); + writer.println(); + } + } + + + /** + * Method doSupports. + * @param vetoSupport + * @param changeSupport + * @param writer + */ + private void doSupports( int fieldTypes, + ClassMapping classMapping, + String vetoSupport, + String changeSupport, + PrintWriter writer) { + if((fieldTypes&CONSTRAINT)==CONSTRAINT) { + writer.println( " private VetoableChangeSupport "+vetoSupport+ + " = new VetoableChangeSupport(this);" ); + classMapping.getImports().add("java.beans.VetoableChangeSupport"); + classMapping.getImports().add("java.beans.PropertyVetoException"); + classMapping.getImports().add("java.beans.VetoableChangeListener"); + } + if((fieldTypes&BOUND)==BOUND) { + writer.println( " private PropertyChangeSupport "+changeSupport+ + " = new PropertyChangeSupport(this);" ); + writer.println(); + classMapping.getImports().add("java.beans.PropertyChangeSupport"); + classMapping.getImports().add("java.beans.PropertyChangeListener"); + } + } + + public void doConstructors(ClassMapping classMapping, Map class2classmap, PrintWriter writer) { // full constructor List allFieldsForFullConstructor = classMapping.getAllFieldsForFullConstructor(); @@ -292,8 +380,24 @@ writer.println(); } + + private String getFieldAsObject(boolean prependThis, Field field) { + ClassName type = field.getClassType(); + if(type != null && type.isPrimitive()) { + String typeName = type.getName(); + typeName = "new "+typeName.substring(0,1).toUpperCase()+typeName.substring(1)+"( "; + typeName += prependThis ? "this." : ""; + return typeName+field.getName()+" )"; + } + return field.getName(); + } - public void doFieldAccessors(ClassMapping classMapping, Map class2classmap, PrintWriter writer) { + public int doFieldAccessors(ClassMapping classMapping, + Map class2classmap, + PrintWriter writer, + String vetoSupport, + String changeSupport) { + int fieldTypes=ORDINARY; // field accessors for (Iterator fields = classMapping.getFields().iterator(); fields.hasNext();) { Field field = (Field) fields.next(); @@ -311,9 +415,32 @@ writer.println(); // setter + int fieldType=0; + if(field.getMeta("beans-property-type")!=null) { + String beansPropertyType = field.getMetaAsString("beans-property-type").toLowerCase(); + if(beansPropertyType.equals("constraint") ) { + fieldTypes = (fieldTypes | CONSTRAINT); + fieldType = CONSTRAINT; + } + else if(beansPropertyType.equals("bound") ) { + fieldTypes = (fieldTypes | BOUND); + fieldType = BOUND; + } + } String setAccessScope = getFieldScope(field, "scope-set", "public"); - writer.println(" " + setAccessScope + " void set" + field.getAsSuffix() + StringHelper.OPEN_PAREN + getTrueTypeName(field, class2classmap) + " " + field.getName() + ") {"); + writer.print(" " + setAccessScope + " void set" + field.getAsSuffix() + StringHelper.OPEN_PAREN + getTrueTypeName(field, class2classmap) + " " + field.getName() + ")"); + writer.println((fieldType&CONSTRAINT)==CONSTRAINT ? " throws PropertyVetoException {" : " {"); + if((fieldType&CONSTRAINT)==CONSTRAINT) { + writer.println(" "+vetoSupport+".fireVetoableChange(\""+field.getName()+"\","); + writer.println(" "+getFieldAsObject(true, field)+","); + writer.println(" "+getFieldAsObject(false, field)+");"); + } writer.println(" this." + field.getName() + " = " + field.getName() + ";"); + if((fieldType&BOUND)==BOUND) { + writer.println(" "+changeSupport+".firePropertyChange(\""+field.getName()+"\","); + writer.println(" "+getFieldAsObject(true, field)+","); + writer.println(" "+getFieldAsObject(false, field)+");"); + } writer.println(" }"); writer.println(); @@ -352,6 +479,7 @@ } */ } + return fieldTypes; } Index: src/net/sf/hibernate/tool/hbm2java/ClassName.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/tool/hbm2java/ClassName.java,v retrieving revision 1.4 diff -u -r1.4 ClassName.java --- src/net/sf/hibernate/tool/hbm2java/ClassName.java 16 Jan 2003 20:52:38 -0000 1.4 +++ src/net/sf/hibernate/tool/hbm2java/ClassName.java 10 Feb 2003 22:40:58 -0000 @@ -30,10 +30,10 @@ packageName = fullyQualifiedName.substring(0, lastDot); } } - else { - name = fullyQualifiedName; - packageName = null; - } + } + else { + name = fullyQualifiedName; + packageName = null; } }