Update of /cvsroot/xdoclet/xdoclet/modules/jdo/src/xdoclet/modules/jdo In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv5627/modules/jdo/src/xdoclet/modules/jdo
Modified Files: JdoObjectIdGeneratorTagsHandler.java Log Message: Modification by Marc Klinger: refined creation of serialVersionUID in generated ObjectID classes, added tag documentation Index: JdoObjectIdGeneratorTagsHandler.java =================================================================== RCS file: /cvsroot/xdoclet/xdoclet/modules/jdo/src/xdoclet/modules/jdo/JdoObjectIdGeneratorTagsHandler.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -r1.8 -r1.9 *** JdoObjectIdGeneratorTagsHandler.java 24 Jul 2007 17:45:07 -0000 1.8 --- JdoObjectIdGeneratorTagsHandler.java 25 Jul 2007 16:10:51 -0000 1.9 *************** *** 197,246 **** log.debug("enter method forAllPrimaryKeyFields..."); ! XClass clazz = getCurrentClass(); ! ! List pkFields = new ArrayList(); ! ! for (Iterator it = clazz.getFields().iterator(); it.hasNext(); ) { ! XField field = (XField) it.next(); ! XDoc fieldDoc = field.getDoc(); ! ! if (fieldDoc.hasTag("jdo.field")) { ! if ("true".equals(fieldDoc.getTag("jdo.field").getAttributeValue("primary-key"))) ! pkFields.add(field); ! } ! } ! ! // sort the pk-fields alphabetically by their name ! Collections.sort(pkFields, pkFieldComparator); ! ! // if there is a desired order specified, we respect it ! String fieldOrderStr = clazz.getDoc().getTagAttributeValue("jdo.create-objectid-class", "field-order"); ! ! if (fieldOrderStr != null && !"".equals(fieldOrderStr)) { ! String[] fieldOrder = fieldOrderStr.replaceAll(" ", "").split(","); ! int newIdx = 0; ! ! for (int i = 0; i < fieldOrder.length; ++i) { ! String field = fieldOrder[i]; ! int oldIdx = -1; ! ! for (int m = 0; m < pkFields.size(); ++m) { ! if (((XField) pkFields.get(m)).getName().equals(field)) { ! oldIdx = m; ! break; ! } ! } ! ! if (oldIdx >= 0) { ! XField f = (XField) pkFields.remove(oldIdx); ! ! pkFields.add(newIdx, f); ! ++newIdx; ! } ! else ! throw new XDocletException("Class \"" + clazz.getQualifiedName() + "\" has field \"" + field + "\" specified in '@jdo.create-objectid-class field-order', but this field does not exist or is not tagged as primary-key-field!"); ! } ! } ! // if (fieldsOrderStr != null && !"".equals(fieldsOrderStr)) { if (log.isDebugEnabled()) --- 197,201 ---- log.debug("enter method forAllPrimaryKeyFields..."); ! List pkFields = getAllPrimaryKeyFields(); if (log.isDebugEnabled()) *************** *** 314,317 **** --- 269,274 ---- public String serialVersionUID(Properties attributes) throws XDocletException { + Log log = LogUtil.getLog(this.getClass(), "serialVersionUID"); + XDoc classDoc = getCurrentClass().getDoc(); String serialVerisionUID = classDoc.getTagAttributeValue("jdo.create-objectid-class", "serial-version-uid"); *************** *** 328,346 **** else if ("auto".equals(serialVerisionUID)) { StringBuffer sb = new StringBuffer(); ! List fields = getCurrentClass().getFields(); for (Iterator iter = fields.iterator(); iter.hasNext(); ) { XField field = (XField) iter.next(); ! if (!field.isStatic() && !field.isTransient()) { ! sb.append(field.getModifiers()); ! sb.append(' '); ! sb.append(field.getType()); ! sb.append(' '); ! sb.append(field.getName()); ! sb.append('?'); ! } } - System.out.println("serial version suid String: " + sb.toString()); int splitIdx = sb.length() / 2; --- 285,298 ---- else if ("auto".equals(serialVerisionUID)) { StringBuffer sb = new StringBuffer(); ! List fields = getAllPrimaryKeyFields(); for (Iterator iter = fields.iterator(); iter.hasNext(); ) { XField field = (XField) iter.next(); ! sb.append(field.getType()); ! sb.append(' '); ! sb.append(field.getName()); ! sb.append(' '); } int splitIdx = sb.length() / 2; *************** *** 349,357 **** long hash = (long) hash1 | (((long) hash2) << 32); - System.out.println("serial version uid: " + hash); number = String.valueOf(hash) + "L"; } ! else ! number = serialVerisionUID; return "private static final long serialVersionUID = " + number + ";"; } --- 301,317 ---- long hash = (long) hash1 | (((long) hash2) << 32); number = String.valueOf(hash) + "L"; } ! else { ! number = serialVerisionUID.trim(); ! if (!number.matches("[+\\-]?\\d+L?")) ! throw new XDocletException("Invalid serial version id given: " + number); ! if (!number.endsWith("L")) ! number += "L"; ! } ! ! if (log.isDebugEnabled()) ! log.debug("Adding serial version uid: " + number); ! return "private static final long serialVersionUID = " + number + ";"; } *************** *** 524,526 **** --- 484,543 ---- // return buf.toString(); } + + /** + * Get all primary key fields for the current class. + * + * @return The List of primary key fields + * @throws XDocletException If the field order contains fields that do not exist + */ + private List getAllPrimaryKeyFields() throws XDocletException + { + XClass clazz = getCurrentClass(); + + List pkFields = new ArrayList(); + + for (Iterator it = clazz.getFields().iterator(); it.hasNext(); ) { + XField field = (XField) it.next(); + XDoc fieldDoc = field.getDoc(); + + if (fieldDoc.hasTag("jdo.field")) { + if ("true".equals(fieldDoc.getTag("jdo.field").getAttributeValue("primary-key"))) + pkFields.add(field); + } + } + + // sort the pk-fields alphabetically by their name + Collections.sort(pkFields, pkFieldComparator); + + // if there is a desired order specified, we respect it + String fieldOrderStr = clazz.getDoc().getTagAttributeValue("jdo.create-objectid-class", "field-order"); + + if (fieldOrderStr != null && !"".equals(fieldOrderStr)) { + String[] fieldOrder = fieldOrderStr.replaceAll(" ", "").split(","); + int newIdx = 0; + + for (int i = 0; i < fieldOrder.length; ++i) { + String field = fieldOrder[i]; + int oldIdx = -1; + + for (int m = 0; m < pkFields.size(); ++m) { + if (((XField) pkFields.get(m)).getName().equals(field)) { + oldIdx = m; + break; + } + } + + if (oldIdx >= 0) { + XField f = (XField) pkFields.remove(oldIdx); + + pkFields.add(newIdx, f); + ++newIdx; + } + else + throw new XDocletException("Class \"" + clazz.getQualifiedName() + "\" has field \"" + field + "\" specified in '@jdo.create-objectid-class field-order', but this field does not exist or is not tagged as primary-key-field!"); + } + } + // if (fieldsOrderStr != null && !"".equals(fieldsOrderStr)) { + return pkFields; + } } ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ xdoclet-devel mailing list xdoclet-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/xdoclet-devel