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

Reply via email to