Update of /cvsroot/xdoclet/xdoclet/modules/jdo/src/xdoclet/modules/jdo/resources In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2274/modules/jdo/src/xdoclet/modules/jdo/resources
Added Files: java_objectid.xdt Log Message: XDoclet finally supports the automatic creation of JDO objectid-classes! --- NEW FILE: java_objectid.xdt --- /* * This class has been auto-generated by XDoclet. * See http://xdoclet.sourceforge.net for details. * * Please DO NOT edit this file! Your changes will be lost * with the next run of XDoclet. */ package <XDtJdoObjectIdGenerator:getObjectIdPackage/>; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.net.URLDecoder; import java.net.URLEncoder; import java.text.ParseException; import java.util.StringTokenizer; /** * This JDO objectid-class has been created by XDoclet for * [EMAIL PROTECTED] <XDtPackage:packageName/>.<XDtClass:className/>}. */ public class <XDtJdoObjectIdGenerator:getObjectIdClass/> implements Serializable { /** * The values of all fields are url encoded in UTF-8. */ public static final String ENCODING="UTF-8"; protected static final String JDO_PREFIX = "jdo"; protected static final char JDO_PREFIX_SEPARATOR = '/'; protected static final char CLASS_SEPARATOR = '?'; protected static final String EMPTYSTRING = ""; protected static final String SEPARATORS_FOR_TOKENIZER = "/?=&"; protected static final String SEPARATOR_KEY_VALUE = "="; protected static final String SEPARATOR_ENTRY = "&"; protected static final Byte NULLBYTE = new Byte((byte)0); protected static final Character NULLCHAR = new Character((char)0); <XDtJdoObjectIdGenerator:forAllPrimaryKeyFields> public <XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldType/> <XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/>; </XDtJdoObjectIdGenerator:forAllPrimaryKeyFields> public <XDtJdoObjectIdGenerator:getObjectIdClass/>() { } /** * This constructor creates a new instance of <XDtJdoObjectIdGenerator:getObjectIdClass/> * by parsing the <code>keyStr</code> that has been created by [EMAIL PROTECTED] #toString()} * and setting all fields to the values from the string. * <p> * This means, the following code will create a copy of this class:<br/><br/> * <code><XDtJdoObjectIdGenerator:getObjectIdClass/> new<XDtJdoObjectIdGenerator:getObjectIdClass/> = new <XDtJdoObjectIdGenerator:getObjectIdClass/>(old<XDtJdoObjectIdGenerator:getObjectIdClass/>.toString());</code> * * @param keyStr A String formatted as "jdo/{className}?{field0}={value0}&{field1}={value1}...&{fieldN}={valueN}" * where all values are url encoded using [EMAIL PROTECTED] #ENCODING}. */ public <XDtJdoObjectIdGenerator:getObjectIdClass/>(String keyStr) throws ParseException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InstantiationException, InvocationTargetException { Class clazz = this.getClass(); StringTokenizer st = new StringTokenizer(keyStr, SEPARATORS_FOR_TOKENIZER, true); String jdoPrefix = st.nextToken(); if (!JDO_PREFIX.equals(jdoPrefix)) throw new ParseException("keyStr \""+keyStr+"\" does not start with jdo prefix \""+JDO_PREFIX+"\"!", 0); if (!st.hasMoreTokens() || st.nextToken().charAt(0) != JDO_PREFIX_SEPARATOR) throw new ParseException("keyStr \""+keyStr+"\" is missing separator \""+JDO_PREFIX_SEPARATOR+"\" after jdo prefix!", 0); String className = st.nextToken(); if (!className.equals(clazz.getName())) throw new ParseException("keyStr defines class \""+className+"\", but this is an instance of \""+clazz.getName()+"\"!", 0); if (!st.hasMoreTokens() || st.nextToken().charAt(0) != CLASS_SEPARATOR) throw new ParseException("keyStr \""+keyStr+"\" is missing separator \""+CLASS_SEPARATOR+"\" after class!", 0); while (st.hasMoreTokens()) { String key = st.nextToken(); String valStr = EMPTYSTRING; if (st.hasMoreTokens()) { String sep = st.nextToken(); if (!SEPARATOR_KEY_VALUE.equals(sep)) throw new ParseException("Expected \""+SEPARATOR_KEY_VALUE+"\", but found \""+sep+"\"!", 0); if (st.hasMoreTokens()) { valStr = st.nextToken(); if (SEPARATOR_ENTRY.equals(valStr)) { sep = valStr; valStr = EMPTYSTRING; } else try { valStr = URLDecoder.decode(valStr, ENCODING); } catch (UnsupportedEncodingException e) { e.printStackTrace(); throw new RuntimeException(e); } } if (!SEPARATOR_ENTRY.equals(sep)) { if (st.hasMoreTokens()) { sep = st.nextToken(); if (!SEPARATOR_ENTRY.equals(sep)) throw new ParseException("Expected \""+SEPARATOR_ENTRY+"\", but found \""+sep+"\"!", 0); } } // if (!SEPARATOR_ENTRY.equals(val)) { } // if (st.hasMoreTokens()) { Field field = clazz.getField(key); Class fieldType = field.getType(); if (valStr == null) { if (!fieldType.isPrimitive()) field.set(this, null); else { if (boolean.class.isAssignableFrom(fieldType)) field.set(this, Boolean.FALSE); if (char.class.isAssignableFrom(fieldType)) field.set(this, NULLCHAR); if (byte.class.isAssignableFrom(fieldType) || int.class.isAssignableFrom(fieldType) || float.class.isAssignableFrom(fieldType) || long.class.isAssignableFrom(fieldType)) field.set(this, NULLBYTE); } } else { Object val = null; if (String.class.isAssignableFrom(fieldType)) { val = valStr; } else if (Number.class.isAssignableFrom(fieldType)) { Constructor c = fieldType.getConstructor(new Class[] {String.class}); val = c.newInstance(new Object[] {valStr}); } else if (boolean.class.isAssignableFrom(fieldType)) { val = new Boolean(valStr); } else if (char.class.isAssignableFrom(fieldType)) { val = new Character(valStr.charAt(0)); } else if (byte.class.isAssignableFrom(fieldType)) { val = new Byte(valStr); } else if (int.class.isAssignableFrom(fieldType)) { val = new Integer(valStr); } else if (long.class.isAssignableFrom(fieldType)) { val = new Long(valStr); } else throw new IllegalArgumentException("Type "+fieldType.getName()+" of member "+key+" is not unsupported!"); field.set(this, val); } } } /** * JDO expects the result of this method to be compatible with the constructor * [EMAIL PROTECTED] #<XDtJdoObjectIdGenerator:getObjectIdClass/>(String)}. * This method takes all the primary-key-fields and encodes them with their name * and their value. * * @see java.lang.Object#toString() */ public String toString() { StringBuffer sb = new StringBuffer(JDO_PREFIX); sb.append(JDO_PREFIX_SEPARATOR); sb.append(this.getClass().getName()); sb.append(CLASS_SEPARATOR); try { <XDtJdoObjectIdGenerator:forAllPrimaryKeyFields> sb.append("<XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/>="); sb.append(URLEncoder.encode(String.valueOf(<XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/>), ENCODING)); <XDtJdoObjectIdGenerator:ifNotLastPrimaryKeyField> sb.append('&'); </XDtJdoObjectIdGenerator:ifNotLastPrimaryKeyField> </XDtJdoObjectIdGenerator:forAllPrimaryKeyFields> } catch (UnsupportedEncodingException e) { throw new RuntimeException("Why the hell goes encoding with " + ENCODING + " wrong?!", e); } return sb.toString(); } /** * This method compares all primary key fields (according to the JDO spec). * * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj) { if (obj == this) return true; if (!(obj instanceof <XDtJdoObjectIdGenerator:getObjectIdClass/>)) return false; <XDtJdoObjectIdGenerator:getObjectIdClass/> other = (<XDtJdoObjectIdGenerator:getObjectIdClass/>)obj; return <XDtJdoObjectIdGenerator:forAllPrimaryKeyFields> <XDtJdoObjectIdGenerator:ifCurrentPrimaryKeyFieldIsPrimitive> this.<XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/> == other.<XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/> </XDtJdoObjectIdGenerator:ifCurrentPrimaryKeyFieldIsPrimitive> <XDtJdoObjectIdGenerator:ifCurrentPrimaryKeyFieldIsNotPrimitive> ( (this.<XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/> == other.<XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/>) || (this.<XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/> != null && this.<XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/>.equals(other.<XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/>)) ) </XDtJdoObjectIdGenerator:ifCurrentPrimaryKeyFieldIsNotPrimitive> <XDtJdoObjectIdGenerator:ifNotLastPrimaryKeyField> && </XDtJdoObjectIdGenerator:ifNotLastPrimaryKeyField> </XDtJdoObjectIdGenerator:forAllPrimaryKeyFields>; } protected static int primitiveHashCode(boolean val) { return val ? 1231 : 1237; } protected static int primitiveHashCode(byte val) { return val; } protected static int primitiveHashCode(char val) { return val; } protected static int primitiveHashCode(double val) { long bits = Double.doubleToLongBits(val); return (int)(bits ^ (bits >>> 32)); } protected static int primitiveHashCode(float val) { return Float.floatToIntBits(val); } protected static int primitiveHashCode(int val) { return val; } protected static int primitiveHashCode(long val) { return (int)(val ^ (val >>> 32)); } protected static int primitiveHashCode(short val) { return val; } /** * @see java.lang.Object#hashCode() */ public int hashCode() { return <XDtJdoObjectIdGenerator:forAllPrimaryKeyFields> <XDtJdoObjectIdGenerator:ifCurrentPrimaryKeyFieldIsPrimitive> primitiveHashCode(<XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/>) </XDtJdoObjectIdGenerator:ifCurrentPrimaryKeyFieldIsPrimitive> <XDtJdoObjectIdGenerator:ifCurrentPrimaryKeyFieldIsNotPrimitive> <XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/>.hashCode() </XDtJdoObjectIdGenerator:ifCurrentPrimaryKeyFieldIsNotPrimitive> <XDtJdoObjectIdGenerator:ifNotLastPrimaryKeyField> ^ </XDtJdoObjectIdGenerator:ifNotLastPrimaryKeyField> </XDtJdoObjectIdGenerator:forAllPrimaryKeyFields>; } /** * @return Returns a newly created instance of <code><XDtJdoObjectIdGenerator:getObjectIdClass/></code> * with the primary-key fields set to the given parameters. */ public static <XDtJdoObjectIdGenerator:getObjectIdClass/> create( <XDtJdoObjectIdGenerator:forAllPrimaryKeyFields> <XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldType/> <XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/><XDtJdoObjectIdGenerator:ifNotLastPrimaryKeyField>,</XDtJdoObjectIdGenerator:ifNotLastPrimaryKeyField> </XDtJdoObjectIdGenerator:forAllPrimaryKeyFields> ) { <XDtJdoObjectIdGenerator:getObjectIdClass/> n = new <XDtJdoObjectIdGenerator:getObjectIdClass/>(); <XDtJdoObjectIdGenerator:forAllPrimaryKeyFields> n.<XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/> = <XDtJdoObjectIdGenerator:getCurrentPrimaryKeyFieldName/>; </XDtJdoObjectIdGenerator:forAllPrimaryKeyFields> return n; } } ------------------------------------------------------- SF.Net email is Sponsored by the Better Software Conference & EXPO September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf _______________________________________________ xdoclet-devel mailing list xdoclet-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/xdoclet-devel