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

Reply via email to