Hi, This is a patch on Serp -- originally written by my erstwhile colleague Abe White. A singular change was necessary to get it working for some annotation arrays. I had written to Abe to integrate this change into Serp -- but so far it has not happened. That is why the code appears in here -- but this is a transient.
PS: it is Pinaki, but I have seen lot of variations on that moniker :) Bernd Fondermann wrote: > > Hi Pina, > > please could you clarify the origins of the code below? > > Thanks, > > Bernd > > ppod...@apache.org wrote: >> Added: labs/fluid/src/main/java/serp/bytecode/Annotation.java >> URL: >> http://svn.apache.org/viewvc/labs/fluid/src/main/java/serp/bytecode/Annotation.java?rev=886691&view=auto >> ============================================================================== >> --- labs/fluid/src/main/java/serp/bytecode/Annotation.java (added) >> +++ labs/fluid/src/main/java/serp/bytecode/Annotation.java Thu Dec 3 >> 07:41:56 2009 >> @@ -0,0 +1,1010 @@ >> +package serp.bytecode; >> + >> +import java.io.*; >> +import java.lang.reflect.*; >> +import java.util.*; >> + >> +import serp.bytecode.lowlevel.*; >> +import serp.bytecode.visitor.*; >> +import serp.util.*; >> + >> +/** >> + * A declared annotation. >> + * >> + * @author Abe White >> + */ >> +public class Annotation implements BCEntity, VisitAcceptor { >> + private static Method ENUM_VALUEOF = null; >> + private static Method ENUM_NAME = null; >> + static { >> + try { >> + Class c = Class.forName("java.lang.Enum"); >> + ENUM_VALUEOF = c.getMethod("valueOf", new Class[] { >> + Class.class, String.class }); >> + ENUM_NAME = c.getMethod("name", (Class[]) null); >> + } catch (Throwable t) { >> + // pre-1.5 JDK >> + } >> + } >> + >> + private BCEntity _owner = null; >> + private int _typeIndex = 0; >> + private List _properties = null; >> + >> + Annotation(BCEntity owner) { >> + _owner = owner; >> + } >> + >> + /** >> + * Annotations are stored in an {...@link Annotations} table or as >> + * part of an {...@link Annotation} property value. >> + */ >> + public BCEntity getOwner() { >> + return _owner; >> + } >> + >> + void invalidate() { >> + _owner = null; >> + } >> + >> + /** >> + * The index in the class {...@link ConstantPool} of the >> + * {...@link UTF8Entry} holding the type of this annotation. >> + */ >> + public int getTypeIndex() { >> + return _typeIndex; >> + } >> + >> + /** >> + * The index in the class {...@link ConstantPool} of the >> + * {...@link UTF8Entry} holding the type of this annotation. >> + */ >> + public void setTypeIndex(int index) { >> + _typeIndex = index; >> + } >> + >> + /** >> + * The name of this annotation's type. >> + */ >> + public String getTypeName() { >> + String desc = ((UTF8Entry) >> getPool().getEntry(_typeIndex)).getValue(); >> + return getProject().getNameCache().getExternalForm(desc, false); >> + } >> + >> + /** >> + * The {...@link Class} object for this annotation's type. >> + */ >> + public Class getType() { >> + return Strings.toClass(getTypeName(), getClassLoader()); >> + } >> + >> + /** >> + * The bytecode for the type of this annotation. >> + */ >> + public BCClass getTypeBC() { >> + return getProject().loadClass(getTypeName(), getClassLoader()); >> + } >> + >> + /** >> + * This annotation's type. >> + */ >> + public void setType(String type) { >> + type = getProject().getNameCache().getInternalForm(type, true); >> + _typeIndex = getPool().findUTF8Entry(type, true); >> + } >> + >> + /** >> + * This annotation's type. >> + */ >> + public void setType(Class type) { >> + setType(type.getName()); >> + } >> + >> + /** >> + * This annotation's type. >> + */ >> + public void setType(BCClass type) { >> + setType(type.getName()); >> + } >> + >> + /** >> + * All declared properties. >> + */ >> + public Property[] getProperties() { >> + if (_properties == null) >> + return new Property[0]; >> + return (Property[]) _properties.toArray >> + (new Property[_properties.size()]); >> + } >> + >> + /** >> + * Set the annotation properties. This method is useful when >> + * importing properties from another instance. >> + */ >> + public void setProperties(Property[] props) { >> + clearProperties(); >> + if (props != null) >> + for (int i = 0; i < props.length; i++) >> + addProperty(props[i]); >> + } >> + >> + /** >> + * Return the property with the given name, or null if none. >> + */ >> + public Property getProperty(String name) { >> + if (_properties == null) >> + return null; >> + Property prop; >> + for (int i = 0; i < _properties.size(); i++) { >> + prop = (Property) _properties.get(i); >> + if (prop.getName().equals(name)) >> + return prop; >> + } >> + return null; >> + } >> + >> + /** >> + * Import a property from another instance. >> + * >> + * @return the newly added property >> + */ >> + public Property addProperty(Property p) { >> + Property prop = addProperty(p.getName()); >> + prop.setValue(p.getValue()); >> + return prop; >> + } >> + >> + /** >> + * Add a new property. >> + */ >> + public Property addProperty(String name) { >> + Property prop = new Property(this); >> + prop.setName(name); >> + if (_properties == null) >> + _properties = new ArrayList(); >> + _properties.add(prop); >> + return prop; >> + } >> + >> + /** >> + * Clear all annotation properties. >> + */ >> + public void clearProperties() { >> + if (_properties == null) >> + return; >> + for (int i = 0; i < _properties.size(); i++) >> + ((Property) _properties.get(i)).invalidate(); >> + _properties.clear(); >> + } >> + >> + /** >> + * Remove the given property. >> + * >> + * @return true if an property was removed, false otherwise >> + */ >> + public boolean removeProperty(Property prop) { >> + return prop != null && removeProperty(prop.getName()); >> + } >> + >> + /** >> + * Remove the property with the given name. >> + * >> + * @return true if a property was removed, false otherwise >> + */ >> + public boolean removeProperty(String name) { >> + if (name == null || _properties == null) >> + return false; >> + Property prop; >> + for (int i = 0; i < _properties.size(); i++) { >> + prop = (Property) _properties.get(i); >> + if (prop.getName().equals(name)) { >> + prop.invalidate(); >> + _properties.remove(i); >> + return true; >> + } >> + } >> + return false; >> + } >> + >> + public Project getProject() { >> + return _owner.getProject(); >> + } >> + >> + public ConstantPool getPool() { >> + return _owner.getPool(); >> + } >> + >> + public ClassLoader getClassLoader() { >> + return _owner.getClassLoader(); >> + } >> + >> + public boolean isValid() { >> + return _owner != null; >> + } >> + >> + public void acceptVisit(BCVisitor visit) { >> + visit.enterAnnotation(this); >> + if (_properties != null) >> + for (int i = 0; i < _properties.size(); i++) >> + ((Property) _properties.get(i)).acceptVisit(visit); >> + visit.exitAnnotation(this); >> + } >> + >> + int getLength() { >> + int len = 4; >> + if (_properties != null) >> + for (int i = 0; i < _properties.size(); i++) >> + len += ((Property) _properties.get(i)).getLength(); >> + return len; >> + } >> + >> + void read(DataInput in) throws IOException { >> + _typeIndex = in.readUnsignedShort(); >> + clearProperties(); >> + int props = in.readUnsignedShort(); >> + if (props > 0) { >> + if (_properties == null) >> + _properties = new ArrayList(props); >> + Property prop; >> + for (int i = 0; i < props; i++) { >> + prop = new Property(this); >> + prop.read(in); >> + _properties.add(prop); >> + } >> + } >> + } >> + >> + void write(DataOutput out) throws IOException { >> + out.writeShort(_typeIndex); >> + out.writeShort((_properties == null) ? 0 : _properties.size()); >> + if (_properties != null) { >> + for (int i = 0; i < _properties.size(); i++) >> + ((Property) _properties.get(i)).write(out); >> + } >> + } >> + >> + /** >> + * An annotation property. >> + */ >> + public static class Property implements BCEntity, VisitAcceptor { >> + private Annotation _owner = null; >> + private int _nameIndex = 0; >> + private final Value _value = new Value(); >> + private Value[] _values = null; >> + >> + Property(Annotation owner) { >> + _owner = owner; >> + } >> + >> + /** >> + * The owning annotation. >> + */ >> + public Annotation getAnnotation() { >> + return _owner; >> + } >> + >> + void invalidate() { >> + _owner = null; >> + } >> + >> + /** >> + * Return the index in the class {...@link ConstantPool} of the >> + * {...@link UTF8Entry} holding the name of this property. >> + */ >> + public int getNameIndex() { >> + return _nameIndex; >> + } >> + >> + /** >> + * Set the index in the class {...@link ConstantPool} of the >> + * {...@link UTF8Entry} holding the name of this property. >> + */ >> + public void setNameIndex(int index) { >> + _nameIndex = index; >> + } >> + >> + /** >> + * Return the name of this property. >> + */ >> + public String getName() { >> + return ((UTF8Entry) >> getPool().getEntry(_nameIndex)).getValue(); >> + } >> + >> + /** >> + * Set the name of this property. >> + */ >> + public void setName(String name) { >> + _nameIndex = getPool().findUTF8Entry(name, true); >> + } >> + >> + /** >> + * Return the value of the property as its wrapper type. >> + * Returns class values as the class name. >> + */ >> + public Object getValue() { >> + if (_values == null) >> + return getValue(_value); >> + Object[] vals = new Object[_values.length]; >> + for (int i = 0; i < vals.length; i++) >> + vals[i] = getValue(_values[i]); >> + return vals; >> + } >> + >> + /** >> + * Extract the Java value. >> + */ >> + private Object getValue(Value val) { >> + if (val.index == -1) >> + return val.value; >> + >> + Object o = ((ConstantEntry) getPool().getEntry(val.index)). >> + getConstant(); >> + if (val.index2 != -1) { >> + // enum value >> + String e = getProject().getNameCache(). >> + getExternalForm((String) o, false); >> + String name = ((UTF8Entry) >> getPool().getEntry(val.index2)). >> + getValue(); >> + try { >> + Class cls = Class.forName(e, true, >> getClassLoader()); >> + return ENUM_VALUEOF.invoke(null, new Object[] {cls, >> name}); >> + } catch (Throwable t) { >> + return e + "." + name; >> + } >> + } >> + if (val.type == null) >> + return o; >> + >> + switch (val.type.getName().charAt(0)) { >> + case 'b': >> + if (val.type == boolean.class) >> + return (((Number) o).intValue() != 0) ? Boolean.TRUE >> + : Boolean.FALSE; >> + return new Byte(((Number) o).byteValue()); >> + case 'c': >> + return new Character((char) ((Number) o).intValue()); >> + case 'j': // java.lang.Class >> + return >> getProject().getNameCache().getExternalForm((String) o, >> + false); >> + case 's': >> + return new Short(((Number) o).shortValue()); >> + default: >> + return o; >> + } >> + } >> + >> + /** >> + * Set value of this property. The value should be an instance >> of any >> + * primitive wrapper type, String, Class, BCClass, an enum >> constant, >> + * an annotation, or an array of any of these types. >> + */ >> + public void setValue(Object value) { >> + if (!value.getClass().isArray()) { >> + _values = null; >> + setValue(_value, value); >> + } else { >> + _value.value = null; >> + _values = new Value[Array.getLength(value)]; >> + for (int i = 0; i < _values.length; i++) { >> + _values[i] = new Value(); >> + setValue(_values[i], Array.get(value, i)); >> + } >> + } >> + } >> + >> + /** >> + * Set the given value. >> + */ >> + private void setValue(Value val, Object o) { >> + if (o instanceof String) >> + setValue(val, (String) o); >> + else if (o instanceof Boolean) >> + setValue(val, ((Boolean) o).booleanValue()); >> + else if (o instanceof Byte) >> + setValue(val, ((Byte) o).byteValue()); >> + else if (o instanceof Character) >> + setValue(val, ((Character) o).charValue()); >> + else if (o instanceof Double) >> + setValue(val, ((Double) o).doubleValue()); >> + else if (o instanceof Float) >> + setValue(val, ((Float) o).floatValue()); >> + else if (o instanceof Integer) >> + setValue(val, ((Integer) o).intValue()); >> + else if (o instanceof Long) >> + setValue(val, ((Long) o).longValue()); >> + else if (o instanceof Short) >> + setValue(val, ((Short) o).shortValue()); >> + else if (o instanceof Class) >> + setClassNameValue(val, ((Class) o).getName()); >> + else if (o instanceof BCClass) >> + setClassNameValue(val, ((BCClass) o).getName()); >> + else if (o instanceof Annotation) >> + setValue(val, (Annotation) o); >> + else { >> + String name = getEnumName(o); >> + if (name != null) { >> + String type = getProject().getNameCache(). >> + getInternalForm(o.getClass().getName(), true); >> + val.index = getPool().findUTF8Entry(type, true); >> + val.index2 = getPool().findUTF8Entry(name, true); >> + val.value = null; >> + val.type = null; >> + } else { >> + val.index = -1; >> + val.index2 = -1; >> + val.value = o; >> + val.type = o.getClass(); >> + } >> + } >> + } >> + >> + /** >> + * Return the name of this enum value, or null if not an enum. >> + */ >> + private static String getEnumName(Object o) { >> + for (Class c = o.getClass(); true; c = c.getSuperclass()) { >> + if (c == Object.class || c == null) >> + return null; >> + if ("java.lang.Enum".equals(c.getName())) >> + break; >> + } >> + try { >> + return (String) ENUM_NAME.invoke(o, (Object[]) null); >> + } catch (Throwable t) { >> + return o.toString(); >> + } >> + } >> + >> + /** >> + * Return the string value of this property, or null if not set. >> + */ >> + public String getStringValue() { >> + return (String) getValue(); >> + } >> + >> + /** >> + * Return the boolean value of this property, or false if not >> set. >> + */ >> + public boolean getBooleanValue() { >> + Object value = getValue(); >> + return (value == null) ? false : ((Boolean) >> value).booleanValue(); >> + } >> + >> + /** >> + * Return the byte value of this property, or false if not set. >> + */ >> + public byte getByteValue() { >> + Object value = getValue(); >> + return (value == null) ? (byte) 0 : ((Number) >> value).byteValue(); >> + } >> + >> + /** >> + * Return the int value of this property, or 0 if not set. >> + */ >> + public int getIntValue() { >> + Object value = getValue(); >> + return (value == null) ? 0 : ((Number) value).intValue(); >> + } >> + >> + /** >> + * Return the long value of this property, or 0 if not set. >> + */ >> + public long getLongValue() { >> + Object value = getValue(); >> + return (value == null) ? 0L : ((Number) value).longValue(); >> + } >> + >> + /** >> + * Return the float value of this property, or 0 if not set. >> + */ >> + public float getFloatValue() { >> + Object value = getValue(); >> + return (value == null) ? 0F : ((Number) value).floatValue(); >> + } >> + >> + /** >> + * Return the double value of this property, or 0 if not set. >> + */ >> + public double getDoubleValue() { >> + Object value = getValue(); >> + return (value == null) ? 0D : ((Number) >> value).doubleValue(); >> + } >> + >> + /** >> + * Return the short value of this property, or 0 if not set. >> + */ >> + public short getShortValue() { >> + Object value = getValue(); >> + return (value == null) ? (short) 0 : ((Number) >> value).shortValue(); >> + } >> + >> + /** >> + * Return the class value of this property, or null if not set. >> + */ >> + public String getClassNameValue() { >> + return (String) getValue(); >> + } >> + >> + /** >> + * Return the annotation value of this property, or null if not >> set. >> + */ >> + public Annotation getAnnotationValue() { >> + return (Annotation) getValue(); >> + } >> + >> + /** >> + * Set the string value of this property. >> + */ >> + public void setValue(String value) { >> + _values = null; >> + setValue(_value, value); >> + } >> + >> + /** >> + * Set the string value of this property. >> + */ >> + private void setValue(Value val, String o) { >> + val.index = getPool().findUTF8Entry(o, true); >> + val.index2 = -1; >> + val.value = null; >> + val.type = null; >> + } >> + >> + /** >> + * Set the boolean value of this property. >> + */ >> + public void setValue(boolean value) { >> + _values = null; >> + setValue(_value, value); >> + } >> + >> + /** >> + * Set the boolean value of this property. >> + */ >> + private void setValue(Value val, boolean o) { >> + setValue(val, (o) ? 1 : 0); >> + val.type = boolean.class; >> + } >> + >> + /** >> + * Set the byte value of this property. >> + */ >> + public void setValue(byte value) { >> + _values = null; >> + setValue(_value, value); >> + } >> + >> + /** >> + * Set the byte value of this property. >> + */ >> + private void setValue(Value val, byte o) { >> + setValue(val, (int) o); >> + val.type = byte.class; >> + } >> + >> + /** >> + * Set the int value of this property. >> + */ >> + public void setValue(int value) { >> + _values = null; >> + setValue(_value, value); >> + } >> + >> + /** >> + * Set the int value of this property. >> + */ >> + private void setValue(Value val, int o) { >> + val.index = getPool().findIntEntry(o, true); >> + val.index2 = -1; >> + val.value = null; >> + val.type = null; >> + } >> + >> + /** >> + * Set the long value of this property. >> + */ >> + public void setValue(long value) { >> + _values = null; >> + setValue(_value, value); >> + } >> + >> + /** >> + * Set the long value of this property. >> + */ >> + private void setValue(Value val, long o) { >> + val.index = getPool().findLongEntry(o, true); >> + val.index2 = -1; >> + val.value = null; >> + val.type = null; >> + } >> + >> + /** >> + * Set the float value of this property. >> + */ >> + public void setValue(float value) { >> + _values = null; >> + setValue(_value, value); >> + } >> + >> + /** >> + * Set the float value of this property. >> + */ >> + private void setValue(Value val, float o) { >> + val.index = getPool().findFloatEntry(o, true); >> + val.index2 = -1; >> + val.value = null; >> + val.type = null; >> + } >> + >> + /** >> + * Set the double value of this property. >> + */ >> + public void setValue(double value) { >> + _values = null; >> + setValue(_value, value); >> + } >> + >> + /** >> + * Set the double value of this property. >> + */ >> + private void setValue(Value val, double o) { >> + val.index = getPool().findDoubleEntry(o, true); >> + val.index2 = -1; >> + val.value = null; >> + val.type = null; >> + } >> + >> + /** >> + * Set the short value of this property. >> + */ >> + public void setValue(short value) { >> + _values = null; >> + setValue(_value, value); >> + } >> + >> + /** >> + * Set the short value of this property. >> + */ >> + private void setValue(Value val, short o) { >> + setValue(val, (int) o); >> + val.type = short.class; >> + } >> + >> + /** >> + * Set the class value of this property. >> + */ >> + public void setValue(Class value) { >> + setClassNameValue(value.getName()); >> + } >> + >> + /** >> + * Set the class value of this property. >> + */ >> + public void setValue(BCClass value) { >> + setClassNameValue(value.getName()); >> + } >> + >> + /** >> + * Set the class value of this property. >> + */ >> + public void setClassNameValue(String value) { >> + _values = null; >> + setClassNameValue(_value, value); >> + } >> + >> + /** >> + * Set the class value of this property. >> + */ >> + private void setClassNameValue(Value val, String o) { >> + o = getProject().getNameCache().getInternalForm(o, true); >> + val.index = getPool().findUTF8Entry(o, true); >> + val.index2 = -1; >> + val.value = null; >> + val.type = Class.class; >> + } >> + >> + /** >> + * Set the annotation value of this property by importing the >> given >> + * annotation from another instance. >> + */ >> + public Annotation setValue(Annotation value) { >> + _values = null; >> + return setValue(_value, value); >> + } >> + >> + /** >> + * Set the annotation value of this property by importing the >> given >> + * annotation from another instance. >> + */ >> + private Annotation setValue(Value val, Annotation o) { >> + Annotation anno = new Annotation(this); >> + anno.setType(o.getTypeName()); >> + anno.setProperties(o.getProperties()); >> + val.index = -1; >> + val.index2 = -1; >> + val.value = anno; >> + val.type = null; >> + return anno; >> + } >> + >> + /** >> + * Set the annotation value of this property by importing the >> given >> + * annotation from another instance. >> + */ >> + public Annotation[] setValue(Annotation[] value) { >> + _value.value = null; >> + _values = new Value[value.length]; >> + Annotation[] ret = new Annotation[value.length]; >> + for (int i = 0; i < _values.length; i++) { >> + _values[i] = new Value(); >> + ret[i] = setValue(_values[i], value[i]); >> + } >> + return ret; >> + } >> + >> + /** >> + * Set this property value to a new annotation of the given >> type, >> + * returning the annotation for manipulation. >> + */ >> + public Annotation newAnnotationValue(Class type) { >> + return newAnnotationValue(type.getName()); >> + } >> + >> + /** >> + * Set this property value to a new annotation of the given >> type, >> + * returning the annotation for manipulation. >> + */ >> + public Annotation newAnnotationValue(BCClass type) { >> + return newAnnotationValue(type.getName()); >> + } >> + >> + /** >> + * Set this property value to a new annotation of the given >> type, >> + * returning the annotation for manipulation. >> + */ >> + public Annotation newAnnotationValue(String type) { >> + Annotation anno = new Annotation(this); >> + anno.setType(type); >> + _values = null; >> + _value.index = -1; >> + _value.index2 = -1; >> + _value.value = anno; >> + _value.type = null; >> + return anno; >> + } >> + >> + /** >> + * Set this property value to a new annotation array of the >> given type >> + * and length, returning the annotations for manipulation. >> + */ >> + public Annotation[] newAnnotationArrayValue(Class type, int >> length) { >> + return newAnnotationArrayValue(type.getName(), length); >> + } >> + >> + /** >> + * Set this property value to a new annotation array of the >> given type >> + * and length, returning the annotations for manipulation. >> + */ >> + public Annotation[] newAnnotationArrayValue(BCClass type, int >> length) { >> + return newAnnotationArrayValue(type.getName(), length); >> + } >> + >> + /** >> + * Set this property value to a new annotation array of the >> given type >> + * and length, returning the annotations for manipulation. >> + */ >> + public Annotation[] newAnnotationArrayValue(String type, int >> length) { >> + _value.value = null; >> + _values = new Value[length]; >> + Annotation[] ret = new Annotation[length]; >> + for (int i = 0; i < length; i++) { >> + ret[i] = new Annotation(this); >> + ret[i].setType(type); >> + _values[i] = new Value(); >> + _values[i].index = -1; >> + _values[i].index2 = -1; >> + _values[i].value = ret[i]; >> + _values[i].type = null; >> + } >> + return ret; >> + } >> + >> + public Project getProject() { >> + return _owner.getProject(); >> + } >> + >> + public ConstantPool getPool() { >> + return _owner.getPool(); >> + } >> + >> + public ClassLoader getClassLoader() { >> + return _owner.getClassLoader(); >> + } >> + >> + public boolean isValid() { >> + return _owner != null && (_values != null || _value.index != >> -1 >> + || _value.value != null); >> + } >> + >> + public void acceptVisit(BCVisitor visit) { >> + visit.enterAnnotationProperty(this); >> + visit.exitAnnotationProperty(this); >> + } >> + >> + int getLength() { >> + if (!isValid()) >> + throw new IllegalStateException(); >> + >> + int len = 2; // name >> + if (_values == null) >> + len += getLength(_value); >> + else { >> + len += 3; // arr length + tag >> + for (int i = 0; i < _values.length; i++) >> + len += getLength(_values[i]); >> + } >> + return len; >> + } >> + >> + /** >> + * Return the length of the given value. >> + */ >> + private int getLength(Value val) { >> + if (val.index2 != -1) >> + return 5; // tag + enum type + enum name >> + if (val.index != -1) >> + return 3; // tag + constant or class >> + return 1 + ((Annotation) val.value).getLength(); // tag + >> anno >> + } >> + >> + void read(DataInput in) throws IOException { >> + _nameIndex = in.readUnsignedShort(); >> + int tag = in.readByte(); >> + if (tag == '[') { >> + int len = in.readUnsignedShort(); >> + _values = new Value[len]; >> + for (int i = 0; i < len; i++) { >> + _values[i] = new Value(); >> + read(_values[i], in.readByte(), in); >> + } >> + } else >> + read(_value, tag, in); >> + } >> + >> + /** >> + * Read data into the given value. >> + */ >> + private void read(Value val, int tag, DataInput in) throws >> IOException { >> + switch (tag) { >> + case 'B': >> + val.index = in.readUnsignedShort(); >> + val.index2 = -1; >> + val.value = null; >> + val.type = byte.class; >> + break; >> + case 'C': >> + val.index = in.readUnsignedShort(); >> + val.index2 = -1; >> + val.value = null; >> + val.type = char.class; >> + break; >> + case 'D': >> + case 'F': >> + case 'I': >> + case 'J': >> + case 'S': >> + case 's': >> + val.index = in.readUnsignedShort(); >> + val.index2 = -1; >> + val.value = null; >> + val.type = null; >> + break; >> + case 'Z': >> + val.index = in.readUnsignedShort(); >> + val.index2 = -1; >> + val.value = null; >> + val.type = boolean.class; >> + break; >> + case 'c': >> + val.index = in.readUnsignedShort(); >> + val.index2 = -1; >> + val.value = null; >> + val.type = Class.class; >> + break; >> + case 'e': >> + val.index = in.readUnsignedShort(); >> + val.index2 = in.readUnsignedShort(); >> + val.value = null; >> + val.type = null; >> + break; >> + case '@': >> + Annotation anno = new Annotation(this); >> + anno.read(in); >> + val.index = -1; >> + val.index2 = -1; >> + val.value = anno; >> + val.type = null; >> + break; >> + default: >> + throw new IllegalStateException(String.valueOf(tag)); >> + } >> + } >> + >> + void write(DataOutput out) throws IOException { >> + if (!isValid()) >> + throw new IllegalStateException(); >> + >> + out.writeShort(_nameIndex); >> + if (_values == null) >> + write(_value, out); >> + else { >> + out.writeByte('['); >> + out.writeShort(_values.length); >> + for (int i = 0; i < _values.length; i++) >> + write(_values[i], out); >> + } >> + } >> + >> + /** >> + * Write the data for the given value to the stream. >> + */ >> + private void write(Value val, DataOutput out) throws IOException >> { >> + if (val.index2 != -1) { >> + out.writeByte('e'); >> + out.writeShort(val.index); >> + out.writeShort(val.index2); >> + } else if (val.index != -1) { >> + if (val.type != null) { >> + switch (val.type.getName().charAt(0)) { >> + case 'b': >> + if (val.type == byte.class) >> + out.writeByte('B'); >> + else >> + out.writeByte('Z'); >> + break; >> + case 'c': >> + out.writeByte('C'); >> + break; >> + case 'j': // java.lang.Class >> + out.writeByte('c'); >> + break; >> + case 's': >> + out.writeByte('S'); >> + break; >> + default: >> + throw new >> IllegalStateException(val.type.getName()); >> + } >> + } else { >> + Entry entry = getPool().getEntry(val.index); >> + if (entry instanceof DoubleEntry) >> + out.writeByte('D'); >> + else if (entry instanceof FloatEntry) >> + out.writeByte('F'); >> + else if (entry instanceof IntEntry) >> + out.writeByte('I'); >> + else if (entry instanceof LongEntry) >> + out.writeByte('J'); >> + else if (entry instanceof UTF8Entry) >> + out.writeByte('s'); >> + else >> + throw new >> IllegalStateException(entry.getClass(). >> + getName()); >> + } >> + out.writeShort(val.index); >> + } else { >> + out.writeByte('@'); >> + ((Annotation) val.value).write(out); >> + } >> + } >> + >> + /** >> + * Property value struct. >> + */ >> + private static class Value { >> + public int index = -1; >> + public int index2 = -1; >> + public Class type = null; >> + public Object value = null; >> + } >> + } >> +} >> >> Propchange: labs/fluid/src/main/java/serp/bytecode/Annotation.java >> ------------------------------------------------------------------------------ >> svn:eol-style = native >> >> Modified: >> labs/fluid/src/main/resources/org/apache/openjpa/sdo/localizer.properties >> URL: >> http://svn.apache.org/viewvc/labs/fluid/src/main/resources/org/apache/openjpa/sdo/localizer.properties?rev=886691&r1=886690&r2=886691&view=diff >> ============================================================================== >> --- >> labs/fluid/src/main/resources/org/apache/openjpa/sdo/localizer.properties >> (original) >> +++ >> labs/fluid/src/main/resources/org/apache/openjpa/sdo/localizer.properties >> Thu Dec 3 07:41:56 2009 >> @@ -1,3 +1,8 @@ >> +generate-unenhanced: Generating dynamic Java class {0} using classloader >> {1} child of {2}. >> +generate-enhanced: Enhancing dynamic Java class {0} using classloader >> {1} child of {2}. >> +load-enhanced: Loaded dynamic, enhanced Java class {0} into JVM using >> classloader {1} child of {2}. >> +load-enhanced-error: Error while loading dynamic, enhanced Java class >> {0} into JVM using classloader {1} child of {2}. >> + >> type-mapping-new: Creating new SDO Type Mapping for "{0}" mapped to >> "{1}" >> type-mapping-resolve: Resolving SDO Type Mapping for "{0}" mapped to >> "{1}" >> resolve-mapping-failed: No cached metadata found for "{0}" in "{1}" >> >> Modified: labs/fluid/src/test/java/example/basic/TestCRUD.java >> URL: >> http://svn.apache.org/viewvc/labs/fluid/src/test/java/example/basic/TestCRUD.java?rev=886691&r1=886690&r2=886691&view=diff >> ============================================================================== >> --- labs/fluid/src/test/java/example/basic/TestCRUD.java (original) >> +++ labs/fluid/src/test/java/example/basic/TestCRUD.java Thu Dec 3 >> 07:41:56 2009 >> @@ -13,8 +13,7 @@ >> import test.common.AbstractSDOTest; >> >> /** >> - * Test basic CRUD operation with a simpleton Type that has no relation >> but >> - * primitive properties. >> + * Test basic CRUD operation with a simpleton SDO Type that has no >> relation but primitive properties. >> * >> * @author Pinaki Poddar >> * >> @@ -99,9 +98,10 @@ >> dataObject.setString("firstName", "Ron"); >> em.getTransaction().begin(); >> DataObject merged = em.merge(dataObject); >> - int v1 = ImplHelper.getVersion(merged); >> - assertTrue(v1>v0); >> + assertNotSame(merged, dataObject); >> em.getTransaction().commit(); >> + int v1 = ImplHelper.getVersion(merged); >> + assertTrue(v1>v0); >> assertEquals("Ron", merged.getString("firstName")); >> int after = count("Person"); >> assertEquals(before, after); >> @@ -138,7 +138,7 @@ >> */ >> // START SNIPPET:createPerson >> DataObject createPerson(String ssn, String first, String last, int age) >> { >> - Type type = getType("Person"); >> + Type type = getSDOType("Person"); >> DataObject data = DataFactory.INSTANCE.create(type); >> data.set("ssn", ssn); >> data.setString("firstName", first); >> >> Added: labs/fluid/src/test/java/example/basic/TestConfiguration.java >> URL: >> http://svn.apache.org/viewvc/labs/fluid/src/test/java/example/basic/TestConfiguration.java?rev=886691&view=auto >> ============================================================================== >> --- labs/fluid/src/test/java/example/basic/TestConfiguration.java (added) >> +++ labs/fluid/src/test/java/example/basic/TestConfiguration.java Thu Dec >> 3 07:41:56 2009 >> @@ -0,0 +1,27 @@ >> +package example.basic; >> + >> +import javax.persistence.EntityManager; >> + >> +import org.apache.openjpa.persistence.test.SingleEMFTestCase; >> +import org.apache.openjpa.sdo.SDODynamicClassResolver; >> +import org.apache.openjpa.sdo.SDOEntityManager; >> +import org.apache.openjpa.sdo.SDOEntityManagerFactory; >> + >> +import test.common.AbstractSDOTest; >> + >> +public class TestConfiguration extends AbstractSDOTest { >> + public void testEntityManagerFactory() { >> + assertNotNull(emf); >> + assertTrue(emf instanceof SDOEntityManagerFactory); >> + } >> + >> + public void testEntityManager() { >> + EntityManager em = emf.createEntityManager(); >> + assertNotNull(em); >> + assertTrue(em instanceof SDOEntityManager); >> + } >> + >> + public void testClassResolver() { >> + assertTrue(emf.getConfiguration().getClassResolverInstance() >> instanceof SDODynamicClassResolver); >> + } >> +} >> >> Propchange: labs/fluid/src/test/java/example/basic/TestConfiguration.java >> ------------------------------------------------------------------------------ >> svn:eol-style = native >> >> Modified: labs/fluid/src/test/java/example/basic/TestRelation.java >> URL: >> http://svn.apache.org/viewvc/labs/fluid/src/test/java/example/basic/TestRelation.java?rev=886691&r1=886690&r2=886691&view=diff >> ============================================================================== >> --- labs/fluid/src/test/java/example/basic/TestRelation.java (original) >> +++ labs/fluid/src/test/java/example/basic/TestRelation.java Thu Dec 3 >> 07:41:56 2009 >> @@ -149,8 +149,7 @@ >> * >> */ >> DataObject createPurchaseOrder() { >> - DataObject purchaseOrder = DataFactory.INSTANCE.create( >> - getType("PurchaseOrderType")); >> + DataObject purchaseOrder = >> DataFactory.INSTANCE.create(getSDOType("PurchaseOrderType")); >> >> purchaseOrder.setString("orderDate", "1999-10-20"); >> >> >> Modified: labs/fluid/src/test/java/org/apache/openjpa/sdo/TestSDO.java >> URL: >> http://svn.apache.org/viewvc/labs/fluid/src/test/java/org/apache/openjpa/sdo/TestSDO.java?rev=886691&r1=886690&r2=886691&view=diff >> ============================================================================== >> --- labs/fluid/src/test/java/org/apache/openjpa/sdo/TestSDO.java >> (original) >> +++ labs/fluid/src/test/java/org/apache/openjpa/sdo/TestSDO.java Thu Dec >> 3 07:41:56 2009 >> @@ -37,20 +37,20 @@ >> public class TestSDO extends AbstractSDOTest { >> >> public void testPackage() { >> - Type addressType = getType("USAddress"); >> + Type addressType = getSDOType("USAddress"); >> assertNotNull(addressType); >> String pkg = ImplHelper.getPackageName(addressType); >> assertEquals("example.domain",pkg); >> } >> >> public void testInstanceClassIsNullForUserType() { >> - Type addressType = getType("USAddress"); >> + Type addressType = getSDOType("USAddress"); >> assertFalse(addressType.isDataType()); >> assertNull(addressType.getInstanceClass()); >> } >> >> public void testIdentityType() { >> - Type poType = getType("PurchaseOrderType"); >> + Type poType = getSDOType("PurchaseOrderType"); >> assertNotNull(poType); >> Property id2 = ImplHelper.getIdentityProperty(poType); >> assertNotNull(id2); >> @@ -64,8 +64,7 @@ >> * >> */ >> public void testCreateModel() { >> - DataObject purchaseOrder = DataFactory.INSTANCE.create( >> - getType("PurchaseOrderType")); >> + DataObject purchaseOrder = >> DataFactory.INSTANCE.create(getSDOType("PurchaseOrderType")); >> >> purchaseOrder.setString("orderDate", "1999-10-20"); >> >> >> Modified: >> labs/fluid/src/test/java/org/apache/openjpa/sdo/TestSourceCode.java >> URL: >> http://svn.apache.org/viewvc/labs/fluid/src/test/java/org/apache/openjpa/sdo/TestSourceCode.java?rev=886691&r1=886690&r2=886691&view=diff >> ============================================================================== >> --- labs/fluid/src/test/java/org/apache/openjpa/sdo/TestSourceCode.java >> (original) >> +++ labs/fluid/src/test/java/org/apache/openjpa/sdo/TestSourceCode.java >> Thu Dec 3 07:41:56 2009 >> @@ -90,20 +90,20 @@ >> } >> } >> >> - public void testDuplicateMethod() { >> - SourceCode code = new SourceCode("some.pkg", "SomeClass"); >> - try { >> - code.addMethod("add", "int") >> - .makePublic() >> - .makeStatic() >> - .addArgument("int", "a") >> - .addArgument("int", "b"); >> - code.addMethod("add", "float") >> - .addArgument("int", "a") >> - .addArgument("int", "b"); >> - fail("Expected DuplicateField exception"); >> - } catch (IllegalArgumentException e) { >> - //good >> - } >> - } >> +// public void testDuplicateMethod() { >> +// SourceCode code = new SourceCode("some.pkg", "SomeClass"); >> +// try { >> +// code.addMethod("add", "int") >> +// .makePublic() >> +// .makeStatic() >> +// .addArgument("int", "a") >> +// .addArgument("int", "b"); >> +// code.addMethod("add", "float") >> +// .addArgument("int", "a") >> +// .addArgument("int", "b"); >> +// fail("Expected DuplicateField exception"); >> +// } catch (IllegalArgumentException e) { >> +// //good >> +// } >> +// } >> } >> >> Modified: labs/fluid/src/test/java/test/common/AbstractSDOTest.java >> URL: >> http://svn.apache.org/viewvc/labs/fluid/src/test/java/test/common/AbstractSDOTest.java?rev=886691&r1=886690&r2=886691&view=diff >> ============================================================================== >> --- labs/fluid/src/test/java/test/common/AbstractSDOTest.java (original) >> +++ labs/fluid/src/test/java/test/common/AbstractSDOTest.java Thu Dec 3 >> 07:41:56 2009 >> @@ -25,16 +25,15 @@ >> import junit.framework.TestCase; >> >> import org.apache.openjpa.meta.MetaDataFactory; >> -import org.apache.openjpa.meta.MetaDataRepository; >> import org.apache.openjpa.persistence.OpenJPAEntityManager; >> import org.apache.openjpa.sdo.SDOEntityManagerFactory; >> -import org.apache.openjpa.sdo.SDOMappingRepository; >> import org.apache.openjpa.sdo.SDOMetaDataFactory; >> +import org.apache.openjpa.sdo.SDOTypeParser; >> >> import commonj.sdo.Type; >> >> /** >> - * Abstract Test case sets up JPA persitence unt and SDO metadata from >> XML >> + * Abstract Test case sets up JPA persistence unit and SDO meta data >> from XML >> * schema. >> * >> * @author Pinaki Poddar >> @@ -42,7 +41,7 @@ >> */ >> public abstract class AbstractSDOTest extends TestCase { >> protected static SDOEntityManagerFactory emf; >> - protected static SDOMappingRepository repos; >> + protected static SDOMetaDataFactory repos; >> >> /** >> * Obtain a EntityManagerFactory and initialize SDO Types. >> @@ -54,26 +53,24 @@ >> assertNotNull(tmp); >> assertTrue(tmp instanceof SDOEntityManagerFactory); >> emf = (SDOEntityManagerFactory)tmp; >> + emf.createEntityManager(); >> } >> } >> >> - SDOMappingRepository getRepos() { >> + SDOMetaDataFactory getRepos() { >> if (repos == null) { >> MetaDataFactory mdf = emf.getConfiguration() >> .getMetaDataRepositoryInstance().getMetaDataFactory(); >> assertTrue(mdf instanceof SDOMetaDataFactory); >> - repos = >> ((SDOMetaDataFactory)mdf).getSDOMappingRepository(); >> + repos = (SDOMetaDataFactory)mdf; >> } >> return repos; >> } >> >> >> - /** >> - * Gets the type of given name. >> - */ >> - protected Type getType(String name) { >> - return getRepos().getType(name); >> - } >> + protected Type getSDOType(String name) { >> + return SDOTypeParser.findType(name); >> + } >> >> /** >> * Count number of persistent instances of the given alias. >> @@ -88,6 +85,6 @@ >> * Get the name of the persistence unit to be used by this receiver. >> */ >> protected String getPersistenceUnitName() { >> - return System.getProperty("persistence.unit", "test"); >> + return System.getProperty("persistence.unit", "sdo"); >> } >> } >> >> Modified: labs/fluid/src/test/resources/META-INF/persistence.xml >> URL: >> http://svn.apache.org/viewvc/labs/fluid/src/test/resources/META-INF/persistence.xml?rev=886691&r1=886690&r2=886691&view=diff >> ============================================================================== >> --- labs/fluid/src/test/resources/META-INF/persistence.xml (original) >> +++ labs/fluid/src/test/resources/META-INF/persistence.xml Thu Dec 3 >> 07:41:56 2009 >> @@ -1,19 +1,29 @@ >> <?xml version="1.0" encoding="UTF-8"?> >> <persistence xmlns="http://java.sun.com/xml/ns/persistence" >> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" >> xsi:schemaLocation="http://java.sun.com/xml/ns/persistence >> http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> >> - <persistence-unit name="test"> >> >> + <persistence-unit name="sdo"> >> + <description> >> + Persistence unit for testing Fluid. >> + The configuration properties are essentially same as any >> other >> JPA application except >> + i) openjpa.EntityManagerFactory must be set to "sdo" >> + and ii) openjpa.MetaDataFactory must be set as shown with XML >> schema definitions. >> + >> + Also set openjpa.DynamicEnhancementAgent to "false" because >> Fluid generates the >> + enhanced bytecode for SDO Types dynamically. >> + </description> >> <properties> >> - <property name="openjpa.EntityManagerFactory" >> value="sdo"/> >> - <property name="openjpa.MetaDataFactory" >> value="sdo(Resources=META-INF/person.xsd)"/> >> + <property name="openjpa.EntityManagerFactory" >> value="sdo"/> >> + <property name="openjpa.MetaDataFactory" >> value="sdo(Resources=META-INF/person.xsd;META-INF/po.xsd)"/> >> + <property name="openjpa.DynamicEnhancementAgent" >> value="false"/> >> + >> <property name="openjpa.ConnectionDriverName" >> value="com.mysql.jdbc.Driver"/> >> - <property name="openjpa.ConnectionURL" >> value="jdbc:mysql://localhost/SDO2"/> >> - <property name="openjpa.ConnectionUserName" >> value="root"/> >> - <property name="openjpa.ConnectionPassword" >> value="hello"/> >> + <property name="openjpa.ConnectionURL" >> value="jdbc:mysql://localhost/fluid"/> >> + <property name="openjpa.ConnectionUserName" >> value="root"/> >> + <property name="openjpa.ConnectionPassword" value=""/> >> + >> <property name="openjpa.jdbc.SynchronizeMappings" >> value="buildSchema"/> >> - <property name="openjpa.QueryCompilationCache" >> value="false"/> >> - <property name="openjpa.Log" value="DefaultLevel=TRACE, >> SQL=TRACE, >> Query=TRACE"/> >> - <property name="openjpa.BrokerImpl" >> value="non-finalizing"/> >> - >> + <property name="openjpa.QueryCompilationCache" >> value="false"/> >> + <property name="openjpa.Log" >> value="DefaultLevel=WARN, SQL=TRACE, Query=TRACE"/> >> </properties> >> </persistence-unit> >> </persistence> >> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: commits-unsubscr...@labs.apache.org >> For additional commands, e-mail: commits-h...@labs.apache.org >> >> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: labs-unsubscr...@labs.apache.org > For additional commands, e-mail: labs-h...@labs.apache.org > > > -- View this message in context: http://old.nabble.com/Re%3A-svn-commit%3A-r886691--3-3----in--labs-fluid%3A-example--example-domain--src-main-java-org-apache-openjpa-sdo--src-main-java-org-apache-openjpa-sdo-mapping--src-main-java-serp--src-main-java-serp-bytecode--src-main-resources-org-apache-openjpa-sdo--src-tes...-tp26682324p26713724.html Sent from the Apache Labs mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: labs-unsubscr...@labs.apache.org For additional commands, e-mail: labs-h...@labs.apache.org