Author: gbailleul
Date: Fri Aug 24 14:32:47 2012
New Revision: 1376944

URL: http://svn.apache.org/viewvc?rev=1376944&view=rev
Log:
PDFBOX-1343: remove class introspection where not necessary, reduced complexity 
on property init

Added:
    
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/PropMapping.java
      - copied, changed from r1370327, 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/PropMapping.java
    
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ReflectHelper.java
Removed:
    
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/PropMapping.java
    
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/PropertyAttributesAnnotation.java
Modified:
    
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/StructuredPropertyParser.java
    
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java
    
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPSchemaFactory.java
    
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/SchemaMapping.java
    
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/AbstractStructuredType.java
    
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeDescription.java
    
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeMapping.java
    
pdfbox/branches/xmpbox-refactoring/xmpbox/src/test/java/org/apache/padaf/xmpbox/parser/PropMappingTest.java

Modified: 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/StructuredPropertyParser.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/StructuredPropertyParser.java?rev=1376944&r1=1376943&r2=1376944&view=diff
==============================================================================
--- 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/StructuredPropertyParser.java
 (original)
+++ 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/StructuredPropertyParser.java
 Fri Aug 24 14:32:47 2012
@@ -22,11 +22,6 @@
 package org.apache.padaf.xmpbox.parser;
 
 import java.io.IOException;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.Map;
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamConstants;
@@ -40,7 +35,8 @@ import org.apache.padaf.xmpbox.type.Abst
 import org.apache.padaf.xmpbox.type.ArrayProperty;
 import org.apache.padaf.xmpbox.type.ComplexPropertyContainer;
 import org.apache.padaf.xmpbox.type.DefinedStructuredType;
-import org.apache.padaf.xmpbox.type.PropertyType;
+import org.apache.padaf.xmpbox.type.PropMapping;
+import org.apache.padaf.xmpbox.type.ReflectHelper;
 import org.apache.padaf.xmpbox.type.TypeDescription;
 
 public class StructuredPropertyParser {
@@ -49,64 +45,21 @@ public class StructuredPropertyParser {
 
        private Class<? extends AbstractStructuredType> typeClass = null;
 
-       private Constructor<? extends AbstractStructuredType> typeConstructor = 
null;
-
-       private Map<String,PropertyDescription> propDesc = null;
-
-       private static Class<?> [] propertyConstructorParams = new Class [] 
{XMPMetadata.class};
+       private PropMapping propDesc = null;
+       
+       private boolean isDefinedStructureType = false;
 
        public StructuredPropertyParser(XMPDocumentBuilder builder,Class<? 
extends AbstractStructuredType> propertyTypeClass) 
                        throws XmpPropertyFormatException {
                this.builder = builder;
                this.typeClass = propertyTypeClass;
-               this.propDesc = new HashMap<String, PropertyDescription>();
                // retrieve xmp properties
-               Field [] fields = typeClass.getFields();
-               for (Field field : fields) {
-                       if (field.getAnnotation(PropertyType.class)!=null) {
-                               PropertyDescription pd = new 
PropertyDescription();
-                               pd.propertyType = 
field.getAnnotation(PropertyType.class);
-                               //                              pd.fieldName = 
field.getName();
-                               try {
-                                       pd.propertyName = 
field.get(null).toString();
-                               } catch (IllegalArgumentException e1) {
-                                       throw new 
XmpPropertyFormatException("Failed to parse structured type : 
"+typeClass.getName(),e1);
-                               } catch (IllegalAccessException e1) {
-                                       throw new 
XmpPropertyFormatException("Failed to parse structured type : 
"+typeClass.getName(),e1);
-                               }
-                               propDesc.put(pd.propertyName, pd);
-                       }
-               }
-               // retrieve constructor
-               if (DefinedStructuredType.class.isAssignableFrom(typeClass)) {
-                       // specific case from DefinedStructured type
-                       typeConstructor = null;
-               } else {
-                       // reflection to find constructor
-                       try {
-                               typeConstructor = 
typeClass.getConstructor(propertyConstructorParams);
-                       } catch (SecurityException e) {
-                               throw new XmpPropertyFormatException("Failed to 
initialize structured type parser : "+typeClass.getName(),e);
-                       } catch (NoSuchMethodException e) {
-                               throw new XmpPropertyFormatException("Failed to 
initialize structured type parser : "+typeClass.getName(),e);
-                       }
-               }
-
+               this.propDesc = ReflectHelper.initializePropMapping(null, 
propertyTypeClass); // TODO GBL GBA
+               this.isDefinedStructureType = 
DefinedStructuredType.class.isAssignableFrom(typeClass); 
        }
 
        private AbstractStructuredType instanciateProperty (XMPMetadata 
metadata) throws XmpParsingException {
-               try {
-                       //                      return 
typeConstructor.newInstance(metadata,prefix);
-                       return typeConstructor.newInstance(metadata);
-               } catch (IllegalArgumentException e) {
-                       throw new XmpParsingException("Failed to instanciate 
structured type : "+typeClass.getName(),e);
-               } catch (InstantiationException e) {
-                       throw new XmpParsingException("Failed to instanciate 
structured type : "+typeClass.getName(),e);
-               } catch (IllegalAccessException e) {
-                       throw new XmpParsingException("Failed to instanciate 
structured type : "+typeClass.getName(),e);
-               } catch (InvocationTargetException e) {
-                       throw new XmpParsingException("Failed to instanciate 
structured type : "+typeClass.getName(),e);
-               }
+               return 
builder.getTypeMapping().instanciateStructuredType(metadata, typeClass);
        }
 
 
@@ -151,7 +104,7 @@ public class StructuredPropertyParser {
                        elmtType = reader.nextTag();
                }
                AbstractStructuredType property = null;
-               if (typeConstructor==null) {
+               if (isDefinedStructureType) {
                        // defined type
                        property = new DefinedStructuredType(metadata, null, 
null);// TODO
                } else {
@@ -198,10 +151,10 @@ public class StructuredPropertyParser {
                                // check if property is expected
                                String localPart = eltName.getLocalPart();
                                if (propDesc.containsKey(localPart)) {
-                                       PropertyDescription description = 
propDesc.get(localPart);
+                                       String ptype = 
propDesc.getPropertyType(localPart);
 
                                        AbstractField a = instanciateSimple(
-                                                       
description.propertyType.propertyType(), 
+                                                       ptype, 
                                                        metadata, 
                                                        eltName.getPrefix(),
                                                        localPart,
@@ -326,16 +279,4 @@ public class StructuredPropertyParser {
                return 
builder.getTypeMapping().instanciateSimpleProperty(metadata, null, prefix, 
propertyName, value, type);
        }
 
-
-
-       protected class PropertyDescription {
-
-               private String propertyName;
-
-               private PropertyType propertyType;
-
-       }
-
-
-
 }

Modified: 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java?rev=1376944&r1=1376943&r2=1376944&view=diff
==============================================================================
--- 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java
 (original)
+++ 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java
 Fri Aug 24 14:32:47 2012
@@ -25,8 +25,6 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -154,7 +152,7 @@ public class XMPDocumentBuilder {
 
                XMPDocumentBuilder preproc = new XMPDocumentBuilder();
                XMPMetadata xmpPreproc = preproc.doParsingParsing(xmp,true);
-               populateSchemaMapping(schemaMapping, xmpPreproc);
+               populateSchemaMapping(xmpPreproc);
 
 
                return doParsingParsing(xmp,false);
@@ -251,7 +249,7 @@ public class XMPDocumentBuilder {
                }
        }
 
-       private void populateSchemaMapping (SchemaMapping sm, XMPMetadata meta) 
+       private void populateSchemaMapping (XMPMetadata meta) 
                        throws 
XmpRequiredPropertyException,XmpUnknownValueTypeException,XmpUnexpectedNamespacePrefixException
 {
                List<XMPSchema> schems = meta.getAllSchemas();
                for (XMPSchema xmpSchema : schems) {
@@ -344,7 +342,7 @@ public class XMPDocumentBuilder {
                                                                        throw 
new XmpUnknownValueTypeException("Type not defined : "+ptype);
                                                                }
                                                                // load the 
property
-                                                               
xsf.getPropertyDefinition().addNewProperty(pname, ptype, null);
+                                                               
xsf.getPropertyDefinition().addNewProperty(pname, ptype);
                                                        } // TODO unmanaged ?
                                                }
                                        } // TODO unmanaged ?
@@ -807,12 +805,8 @@ public class XMPDocumentBuilder {
                                                .getAttributeLocalName(i), 
reader.get()
                                                .getAttributeValue(i)));
                        }
-                       Class<?> [] constParams = new Class<?> [] 
{XMPMetadata.class,String.class,String.class,String.class,Object.class};
-                       Constructor<? extends AbstractSimpleProperty> 
constructor = tclass.getConstructor(constParams);
-
-                       prop = constructor.newInstance(metadata, 
null,propertyName.getPrefix(),
-                                       propertyName.getLocalPart(), 
reader.get()
-                                       .getElementText());
+                       prop = typeMapping.instanciateSimpleProperty(metadata, 
null, propertyName.getPrefix(), 
+                                       propertyName.getLocalPart(), 
reader.get().getElementText(),typeMapping.getType(tclass));
                        if (prop != null) {
                                container.addProperty(prop);
                                // ADD ATTRIBUTES
@@ -829,14 +823,6 @@ public class XMPDocumentBuilder {
                                                        + 
propertyName.getLocalPart() + "'", e);
                } catch (SecurityException e) {
                        throw new XmpPropertyFormatException("Failed to create 
property",e);
-               } catch (NoSuchMethodException e) {
-                       throw new XmpPropertyFormatException("Failed to create 
property",e);
-               } catch (InstantiationException e) {
-                       throw new XmpPropertyFormatException("Failed to create 
property",e);
-               } catch (IllegalAccessException e) {
-                       throw new XmpPropertyFormatException("Failed to create 
property",e);
-               } catch (InvocationTargetException e) {
-                       throw new XmpPropertyFormatException("Failed to create 
property",e);
                }
        }
 
@@ -938,55 +924,49 @@ public class XMPDocumentBuilder {
                                                .getNamespacePrefix(i));
                        }
                }
-               try {
-                       String type = 
getPropertyDeclarationInNamespaces(schema, propertyName);
-                       // found type, manage it
-                       if (type.equals("Lang Alt")) {
-                               parseSimplePropertyArray(metadata, 
propertyName, ArrayProperty.ALTERNATIVE_ARRAY, TextType.class, 
schema.getContent());
-                       } else if (typeMapping.isSimpleType(type)) {
-                               TypeDescription tclass = 
typeMapping.getTypeDescription(type);
-                               Class<? extends AbstractSimpleProperty> tcn = 
(Class<? extends AbstractSimpleProperty>)tclass.getTypeClass();
-                               parseSimpleProperty(metadata, propertyName, 
tcn, schema.getContent());
-                       } else if (typeMapping.isStructuredType(type)) {
-                               TypeDescription tclass = 
typeMapping.getTypeDescription(type);
+               String type = getPropertyDeclarationInNamespaces(schema, 
propertyName);
+               // found type, manage it
+               if (type.equals("Lang Alt")) {
+                       parseSimplePropertyArray(metadata, propertyName, 
ArrayProperty.ALTERNATIVE_ARRAY, TextType.class, schema.getContent());
+               } else if (typeMapping.isSimpleType(type)) {
+                       TypeDescription tclass = 
typeMapping.getTypeDescription(type);
+                       Class<? extends AbstractSimpleProperty> tcn = (Class<? 
extends AbstractSimpleProperty>)tclass.getTypeClass();
+                       parseSimpleProperty(metadata, propertyName, tcn, 
schema.getContent());
+               } else if (typeMapping.isStructuredType(type)) {
+                       TypeDescription tclass = 
typeMapping.getTypeDescription(type);
+                       StructuredPropertyParser parser = new 
StructuredPropertyParser(
+                                       this, (Class<? extends 
AbstractStructuredType>)tclass.getTypeClass());
+                       parseStructuredProperty(metadata, parser, 
schema.getContent());
+               } else if (typeMapping.getArrayType(type)!=null) {
+                       // retrieve array type and content type
+                       int pos = type.indexOf(' ');
+                       String arrayType = typeMapping.getArrayType(type);
+                       String typeInArray = type.substring(pos+1);
+                       TypeDescription tclass = 
typeMapping.getTypeDescription(typeInArray);
+                       Class<? extends AbstractField> tcn = 
tclass.getTypeClass();
+
+                       if (AbstractSimpleProperty.class.isAssignableFrom(tcn)) 
{
+                               // array of simple
+                               parseSimplePropertyArray(
+                                               metadata, 
+                                               propertyName, 
+                                               arrayType, 
+                                               (Class<? extends 
AbstractSimpleProperty>)tcn,
+                                               schema.getContent());
+                       } else if 
(AbstractStructuredType.class.isAssignableFrom(tcn)) {
+                               // array of structured
                                StructuredPropertyParser parser = new 
StructuredPropertyParser(
-                                               this, (Class<? extends 
AbstractStructuredType>)tclass.getTypeClass());
-                               parseStructuredProperty(metadata, parser, 
schema.getContent());
-                       } else if (typeMapping.getArrayType(type)!=null) {
-                               // retrieve array type and content type
-                               int pos = type.indexOf(' ');
-                               String arrayType = 
typeMapping.getArrayType(type);
-                               String typeInArray = type.substring(pos+1);
-                               TypeDescription tclass = 
typeMapping.getTypeDescription(typeInArray);
-                               Class<? extends AbstractField> tcn = 
tclass.getTypeClass();
-
-                               if 
(AbstractSimpleProperty.class.isAssignableFrom(tcn)) {
-                                       // array of simple
-                                       parseSimplePropertyArray(
-                                                       metadata, 
-                                                       propertyName, 
-                                                       arrayType, 
-                                                       (Class<? extends 
AbstractSimpleProperty>)tcn,
-                                                       schema.getContent());
-                               } else if 
(AbstractStructuredType.class.isAssignableFrom(tcn)) {
-                                       // array of structured
-                                       StructuredPropertyParser parser = new 
StructuredPropertyParser(
-                                                       this, (Class<? extends 
AbstractStructuredType>)tcn);
-                                       parseStructuredPropertyArray(metadata, 
propertyName, arrayType, parser, schema.getContent());
-                               } else {
-                                       // invalid case
-                                       throw new 
XmpUnknownPropertyTypeException("Unknown type : "+type);
-                               }
-                               //                      } else if 
(type.equals("Field")) {
-                               //                              
parseFieldProperty(metadata, propertyName, schema);
+                                               this, (Class<? extends 
AbstractStructuredType>)tcn);
+                               parseStructuredPropertyArray(metadata, 
propertyName, arrayType, parser, schema.getContent());
                        } else {
-                               throw new 
XmpUnknownPropertyTypeException("Unknown type : " + type);
+                               // invalid case
+                               throw new 
XmpUnknownPropertyTypeException("Unknown type : "+type);
                        }
-
-               } catch (XmpUnknownPropertyException e) {
-                       throw e;
+                       //                      } else if 
(type.equals("Field")) {
+                       //                              
parseFieldProperty(metadata, propertyName, schema);
+               } else {
+                       throw new XmpUnknownPropertyTypeException("Unknown type 
: " + type);
                }
-
        }
 
 

Modified: 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPSchemaFactory.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPSchemaFactory.java?rev=1376944&r1=1376943&r2=1376944&view=diff
==============================================================================
--- 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPSchemaFactory.java
 (original)
+++ 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPSchemaFactory.java
 Fri Aug 24 14:32:47 2012
@@ -27,6 +27,7 @@ import java.util.List;
 
 import org.apache.padaf.xmpbox.XMPMetadata;
 import org.apache.padaf.xmpbox.schema.XMPSchema;
+import org.apache.padaf.xmpbox.type.PropMapping;
 
 
 /**
@@ -103,26 +104,6 @@ public class XMPSchemaFactory {
        }
 
        /**
-        * Get attributes declared for a property (NOT USED YET)
-        * 
-        * @param name
-        *            The property Name
-        * @return List of all attributes defined for this property
-        */
-       public List<String> getPropertyAttributes(String name) {
-               List<String> result = propDef.getPropertyAttributes(name);
-               if (result == null) {
-                       for (PropMapping mapping : importedPropertyMapping) {
-                               result = mapping.getPropertyAttributes(name);
-                               if (result != null) {
-                                       break;
-                               }
-                       }
-               }
-               return result;
-       }
-
-       /**
         * Create a schema that corresponding to this factory and add it to 
metadata
         * 
         * @param metadata

Modified: 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/SchemaMapping.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/SchemaMapping.java?rev=1376944&r1=1376943&r2=1376944&view=diff
==============================================================================
--- 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/SchemaMapping.java
 (original)
+++ 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/SchemaMapping.java
 Fri Aug 24 14:32:47 2012
@@ -21,17 +21,14 @@
 
 package org.apache.padaf.xmpbox.schema;
 
-import java.lang.reflect.Field;
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import org.apache.padaf.xmpbox.XMPMetadata;
-import org.apache.padaf.xmpbox.parser.PropMapping;
 import org.apache.padaf.xmpbox.parser.XMPSchemaFactory;
 import org.apache.padaf.xmpbox.parser.XmpSchemaException;
-import org.apache.padaf.xmpbox.type.PropertyType;
+import org.apache.padaf.xmpbox.type.PropMapping;
+import org.apache.padaf.xmpbox.type.ReflectHelper;
 
 public final class SchemaMapping {
 
@@ -66,7 +63,7 @@ public final class SchemaMapping {
         *             When could not read property name in Schema Class given
         */
        private static void addNameSpace(String ns, Class<? extends XMPSchema> 
classSchem) {
-               nsMaps.put(ns, new XMPSchemaFactory(ns, classSchem,     
initializePropMapping(ns, classSchem)));
+               nsMaps.put(ns, new XMPSchemaFactory(ns, classSchem,     
ReflectHelper.initializePropMapping(ns, classSchem)));
        }
 
        public void addNewNameSpace(String ns) {
@@ -75,61 +72,6 @@ public final class SchemaMapping {
        }
        
        
-       
-       
-       /**
-        * Initialize the Property Mapping for a given schema
-        * 
-        * @param ns
-        *            Namespace URI
-        * @param classSchem
-        *            The class representation of the schema linked to the 
namespace
-        * @return Construct expected properties types representation
-        * @throws XmpSchemaException
-        *             When could not read property name in field with 
properties
-        *             annotations
-        */
-       private static PropMapping initializePropMapping(String ns,
-                       Class<? extends XMPSchema> classSchem) {
-               PropertyType propType;
-               PropertyAttributesAnnotation propAtt;
-               Field[] fields;
-               PropMapping propMap = new PropMapping(ns);
-               fields = classSchem.getFields();
-               String propName = null;
-               for (Field field : fields) {
-                       if (field.isAnnotationPresent(PropertyType.class)) {
-                               try {
-                                       propName = (String) field.get(propName);
-                               } catch (Exception e) {
-                                       throw new IllegalArgumentException(
-                                                       "couldn't read one type 
declaration, please check accessibility and declaration of fields annoted in "
-                                                                       + 
classSchem.getName(), e);
-                               }
-                               propType = 
field.getAnnotation(PropertyType.class);
-                               if 
(!field.isAnnotationPresent(PropertyAttributesAnnotation.class)) {
-                                       propMap.addNewProperty(propName, 
propType.propertyType(),
-                                                       null);
-                               } else {
-                                       // XXX Case where a special annotation 
is used to specify
-                                       // attributes
-                                       // NOT IMPLEMENTED YET, JUST TO GIVE A 
CLUE TO MAKE THIS
-                                       propAtt = field
-                                                       
.getAnnotation(PropertyAttributesAnnotation.class);
-                                       List<String> attributes = new 
ArrayList<String>();
-                                       for (String att : 
propAtt.expectedAttributes()) {
-                                               attributes.add(att);
-                                       }
-                                       propMap.addNewProperty(propName, 
propType.propertyType(),
-                                                       attributes);
-                               }
-                       }
-               }
-               return propMap;
-       }
-
-
-       
        /**
         * Return the specialized schema class representation if it's known 
(create
         * and add it to metadata). In other cases, return null
@@ -160,4 +102,5 @@ public final class SchemaMapping {
        }
 
        
+       
 }

Modified: 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/AbstractStructuredType.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/AbstractStructuredType.java?rev=1376944&r1=1376943&r2=1376944&view=diff
==============================================================================
--- 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/AbstractStructuredType.java
 (original)
+++ 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/AbstractStructuredType.java
 Fri Aug 24 14:32:47 2012
@@ -22,7 +22,6 @@
 package org.apache.padaf.xmpbox.type;
 
 import java.util.Calendar;
-import java.util.List;
 
 import org.apache.padaf.xmpbox.XMPMetadata;
 

Copied: 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/PropMapping.java
 (from r1370327, 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/PropMapping.java)
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/PropMapping.java?p2=pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/PropMapping.java&p1=pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/PropMapping.java&r1=1370327&r2=1376944&rev=1376944&view=diff
==============================================================================
--- 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/PropMapping.java
 (original)
+++ 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/PropMapping.java
 Fri Aug 24 14:32:47 2012
@@ -19,7 +19,7 @@
  * 
  ****************************************************************************/
 
-package org.apache.padaf.xmpbox.parser;
+package org.apache.padaf.xmpbox.type;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -39,8 +39,9 @@ import java.util.Map;
 public class PropMapping {
 
        private String namespace;
+
        private Map<String, String> types;
-       private Map<String, List<String>> attributes;
+
 
        /**
         * Build PropMapping for specified namespace
@@ -51,8 +52,6 @@ public class PropMapping {
        public PropMapping(String namespace) {
                this.namespace = namespace;
                types = new HashMap<String, String>();
-               attributes = new HashMap<String, List<String>>();
-
        }
 
        /**
@@ -84,11 +83,8 @@ public class PropMapping {
         *            A list of attribute (put null while attribute management 
is
         *            not implemented)
         */
-       public void addNewProperty(String name, String type, List<String> attr) 
{
+       public void addNewProperty(String name, String type) {
                types.put(name, type);
-               if (attr != null) {
-                       attributes.put(name, attr);
-               }
        }
 
        /**
@@ -102,15 +98,8 @@ public class PropMapping {
                return types.get(name);
        }
 
-       /**
-        * Return an unmodifiable list of property attributes from its 
qualifiedName
-        * 
-        * @param name
-        *            LocalName of the property
-        * @return List of all attributes declared for this property
-        */
-       public List<String> getPropertyAttributes(String name) {
-               return attributes.get(name);
+       public boolean containsKey (String name) {
+               return types.containsKey(name);
        }
-
+       
 }

Added: 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ReflectHelper.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ReflectHelper.java?rev=1376944&view=auto
==============================================================================
--- 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ReflectHelper.java
 (added)
+++ 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ReflectHelper.java
 Fri Aug 24 14:32:47 2012
@@ -0,0 +1,68 @@
+/*****************************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ ****************************************************************************/
+
+package org.apache.padaf.xmpbox.type;
+
+import java.lang.reflect.Field;
+
+
+public final class ReflectHelper {
+
+       private ReflectHelper () {
+       }
+
+       /**
+        * Initialize the Property Mapping for a given schema
+        * 
+        * @param ns
+        *            Namespace URI
+        * @param classSchem
+        *            The class representation of the schema linked to the 
namespace
+        * @return Construct expected properties types representation
+        * @throws XmpSchemaException
+        *             When could not read property name in field with 
properties
+        *             annotations
+        */
+       public final static PropMapping initializePropMapping(String ns,
+                       Class<?> classSchem) {
+               PropMapping propMap = new PropMapping(ns);
+               Field [] fields = classSchem.getFields();
+               String propName = null;
+               for (Field field : fields) {
+                       if (field.isAnnotationPresent(PropertyType.class)) {
+                               try {
+                                       propName = (String) field.get(propName);
+                               } catch (Exception e) {
+                                       throw new IllegalArgumentException(
+                                                       "couldn't read one type 
declaration, please check accessibility and declaration of fields annoted in "
+                                                                       + 
classSchem.getName(), e);
+                               }
+                               PropertyType propType = 
field.getAnnotation(PropertyType.class);
+                               propMap.addNewProperty(propName, 
propType.propertyType());
+                       }
+               }
+               return propMap;
+       }
+
+
+       
+       
+}

Modified: 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeDescription.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeDescription.java?rev=1376944&r1=1376943&r2=1376944&view=diff
==============================================================================
--- 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeDescription.java
 (original)
+++ 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeDescription.java
 Fri Aug 24 14:32:47 2012
@@ -21,7 +21,6 @@
 
 package org.apache.padaf.xmpbox.type;
 
-import org.apache.padaf.xmpbox.parser.PropMapping;
 
 
 public class TypeDescription {
@@ -36,7 +35,6 @@ public class TypeDescription {
        
        private DefinedStructuredType definedStructuredType;
        
-       // TODO PropMapping should be in package Type
        private PropMapping properties = null;
 
        public TypeDescription(String type, BasicType basic,Class<? extends 
AbstractField> clz) {

Modified: 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeMapping.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeMapping.java?rev=1376944&r1=1376943&r2=1376944&view=diff
==============================================================================
--- 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeMapping.java
 (original)
+++ 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeMapping.java
 Fri Aug 24 14:32:47 2012
@@ -22,121 +22,111 @@
 package org.apache.padaf.xmpbox.type;
 
 import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
 import org.apache.padaf.xmpbox.XMPMetadata;
-import org.apache.padaf.xmpbox.parser.PropMapping;
-import org.apache.padaf.xmpbox.schema.PropertyAttributesAnnotation;
+import org.apache.padaf.xmpbox.parser.XmpParsingException;
 import org.apache.padaf.xmpbox.type.TypeDescription.BasicType;
 
 public final class TypeMapping {
 
 
-       
-    private static final Map<String,TypeDescription> BASIC_TYPES;
 
-    private static final Map<Class<? extends AbstractField>,TypeDescription> 
BASIC_CLASSES;
+       private Map<String,TypeDescription> BASIC_TYPES;
 
-    private static final Map<String,TypeDescription> DERIVED_TYPES;
-  
-    private static final Map<Class<? extends AbstractField>,TypeDescription> 
DERIVED_CLASSES;
+       private Map<Class<? extends AbstractField>,TypeDescription> 
BASIC_CLASSES;
 
-    private static final Map<String, TypeDescription> STRUCTURED_TYPES;
+       private Map<String,TypeDescription> DERIVED_TYPES;
 
-    private static final Map<Class<? extends AbstractField>,TypeDescription> 
STRUCTURED_CLASSES;
+       private Map<Class<? extends AbstractField>,TypeDescription> 
DERIVED_CLASSES;
 
-    private static final Map<String,TypeDescription> STRUCTURED_NAMESPACES;
-    
-       private static Map<Class<?>, Map<String,String>> structuredTypes = new 
HashMap<Class<?>, Map<String,String>>();
+       private Map<String, TypeDescription> STRUCTURED_TYPES;
+
+       private Map<Class<? extends AbstractField>,TypeDescription> 
STRUCTURED_CLASSES;
+
+       private Map<String,TypeDescription> STRUCTURED_NAMESPACES;
 
-    
        public TypeMapping() {
-               
+               initialize();
        }
-    
 
-    private static Class<?> [] simplePropertyConstParams = new Class<?> [] {
-       XMPMetadata.class,
-       String.class,
+
+       private static Class<?> [] simplePropertyConstParams = new Class<?> [] {
+               XMPMetadata.class,
+               String.class,
                String.class,
                String.class,
                Object.class
-    };
+       };
+
+       private void initialize () {
+               // basic
+               BASIC_TYPES = new HashMap<String,TypeDescription>();
+               BASIC_CLASSES = new HashMap<Class<? extends AbstractField>, 
TypeDescription>();
+               addToBasicMaps(new 
TypeDescription("Text",BasicType.Text,TextType.class));
+               addToBasicMaps(new 
TypeDescription("Date",BasicType.Date,DateType.class));
+               addToBasicMaps(new 
TypeDescription("Boolean",BasicType.Boolean,BooleanType.class));
+               addToBasicMaps(new 
TypeDescription("Integer",BasicType.Integer,IntegerType.class));
+               addToBasicMaps(new 
TypeDescription("Real",BasicType.Real,RealType.class));
+
+               // derived
+               DERIVED_TYPES = new HashMap<String,TypeDescription>();
+               DERIVED_CLASSES = new HashMap<Class<? extends AbstractField>, 
TypeDescription>();
+               addToDerivedMaps(new 
TypeDescription("AgentName",BasicType.Text,AgentNameType.class));
+               addToDerivedMaps(new 
TypeDescription("Choice",BasicType.Text,ChoiceType.class));
+               addToDerivedMaps(new 
TypeDescription("GUID",BasicType.Text,GUIDType.class));
+               addToDerivedMaps(new TypeDescription("Lang 
Alt",BasicType.Text,TextType.class));
+               addToDerivedMaps(new 
TypeDescription("Locale",BasicType.Text,LocaleType.class));
+               addToDerivedMaps(new 
TypeDescription("MIMEType",BasicType.Text,MIMEType.class));
+               addToDerivedMaps(new 
TypeDescription("ProperName",BasicType.Text,ProperNameType.class));
+               addToDerivedMaps(new 
TypeDescription("RenditionClass",BasicType.Text,RenditionClassType.class));
+               addToDerivedMaps(new 
TypeDescription("URL",BasicType.Text,URLType.class));
+               addToDerivedMaps(new 
TypeDescription("URI",BasicType.Text,URIType.class));
+               addToDerivedMaps(new 
TypeDescription("XPath",BasicType.Text,XPathType.class));
+               addToDerivedMaps(new 
TypeDescription("Part",BasicType.Text,PartType.class));
+
+               // structured types
+               STRUCTURED_TYPES = new HashMap<String, TypeDescription>();
+               STRUCTURED_CLASSES = new HashMap<Class<? extends 
AbstractField>, TypeDescription>();
+               STRUCTURED_NAMESPACES = new HashMap<String, TypeDescription>();
+               addToStructuredMaps(new 
TypeDescription("Thumbnail",null,ThumbnailType.class));
+               addToStructuredMaps(new 
TypeDescription("Layer",null,LayerType.class));
+               addToStructuredMaps(new 
TypeDescription("ResourceEvent",null,ResourceEventType.class));
+               addToStructuredMaps(new 
TypeDescription("Job",null,JobType.class));
+               addToStructuredMaps(new 
TypeDescription("ResourceRef",null,ResourceRefType.class));
+               addToStructuredMaps(new 
TypeDescription("Version",null,VersionType.class));
+               // PDF/A structured types
+               addToStructuredMaps(new 
TypeDescription("PDFAField",null,PDFAFieldType.class));
+               addToStructuredMaps(new 
TypeDescription("PDFAProperty",null,PDFAPropertyType.class));
+               addToStructuredMaps(new 
TypeDescription("PDFAType",null,PDFATypeType.class));
+               addToStructuredMaps(new 
TypeDescription("PDFASchema",null,PDFASchemaType.class));
+       }
+
+       private void addToBasicMaps (TypeDescription td) {
+               BASIC_TYPES.put(td.getType(),td);
+               BASIC_CLASSES.put(td.getTypeClass(), td);
+       }
 
-    static {
-       // basic
-        BASIC_TYPES = new HashMap<String,TypeDescription>();
-        BASIC_CLASSES = new HashMap<Class<? extends AbstractField>, 
TypeDescription>();
-        addToBasicMaps(new 
TypeDescription("Text",BasicType.Text,TextType.class));
-        addToBasicMaps(new 
TypeDescription("Date",BasicType.Date,DateType.class));
-        addToBasicMaps(new 
TypeDescription("Boolean",BasicType.Boolean,BooleanType.class));
-        addToBasicMaps(new 
TypeDescription("Integer",BasicType.Integer,IntegerType.class));
-        addToBasicMaps(new 
TypeDescription("Real",BasicType.Real,RealType.class));
-
-        // derived
-        DERIVED_TYPES = new HashMap<String,TypeDescription>();
-        DERIVED_CLASSES = new HashMap<Class<? extends AbstractField>, 
TypeDescription>();
-        addToDerivedMaps(new 
TypeDescription("AgentName",BasicType.Text,AgentNameType.class));
-        addToDerivedMaps(new 
TypeDescription("Choice",BasicType.Text,ChoiceType.class));
-        addToDerivedMaps(new 
TypeDescription("GUID",BasicType.Text,GUIDType.class));
-        addToDerivedMaps(new TypeDescription("Lang 
Alt",BasicType.Text,TextType.class));
-        addToDerivedMaps(new 
TypeDescription("Locale",BasicType.Text,LocaleType.class));
-        addToDerivedMaps(new 
TypeDescription("MIMEType",BasicType.Text,MIMEType.class));
-        addToDerivedMaps(new 
TypeDescription("ProperName",BasicType.Text,ProperNameType.class));
-        addToDerivedMaps(new 
TypeDescription("RenditionClass",BasicType.Text,RenditionClassType.class));
-        addToDerivedMaps(new 
TypeDescription("URL",BasicType.Text,URLType.class));
-        addToDerivedMaps(new 
TypeDescription("URI",BasicType.Text,URIType.class));
-        addToDerivedMaps(new 
TypeDescription("XPath",BasicType.Text,XPathType.class));
-        addToDerivedMaps(new 
TypeDescription("Part",BasicType.Text,PartType.class));
-
-        // structured types
-        STRUCTURED_TYPES = new HashMap<String, TypeDescription>();
-        STRUCTURED_CLASSES = new HashMap<Class<? extends AbstractField>, 
TypeDescription>();
-        STRUCTURED_NAMESPACES = new HashMap<String, TypeDescription>();
-        addToStructuredMaps(new 
TypeDescription("Thumbnail",null,ThumbnailType.class));
-        addToStructuredMaps(new TypeDescription("Layer",null,LayerType.class));
-        addToStructuredMaps(new 
TypeDescription("ResourceEvent",null,ResourceEventType.class));
-        addToStructuredMaps(new TypeDescription("Job",null,JobType.class));
-        addToStructuredMaps(new 
TypeDescription("ResourceRef",null,ResourceRefType.class));
-        addToStructuredMaps(new 
TypeDescription("Version",null,VersionType.class));
-        // PDF/A structured types
-        addToStructuredMaps(new 
TypeDescription("PDFAField",null,PDFAFieldType.class));
-        addToStructuredMaps(new 
TypeDescription("PDFAProperty",null,PDFAPropertyType.class));
-        addToStructuredMaps(new 
TypeDescription("PDFAType",null,PDFATypeType.class));
-        addToStructuredMaps(new 
TypeDescription("PDFASchema",null,PDFASchemaType.class));
-    }
-
-    private static void addToBasicMaps (TypeDescription td) {
-        BASIC_TYPES.put(td.getType(),td);
-        BASIC_CLASSES.put(td.getTypeClass(), td);
-    }
-
-    public static void addToDerivedMaps (TypeDescription td) {
-        DERIVED_TYPES.put(td.getType(),td);
-        DERIVED_CLASSES.put(td.getTypeClass(), td);
-    }
-
-    public static void addToStructuredMaps (TypeDescription td) {
-        STRUCTURED_TYPES.put(td.getType(),td);
-        STRUCTURED_CLASSES.put(td.getTypeClass(), td);
-        
-        try {
-               String ns = 
(String)td.getTypeClass().getField("ELEMENT_NS").get(null);
-                       STRUCTURED_NAMESPACES.put(ns, td);
+       public void addToDerivedMaps (TypeDescription td) {
+               DERIVED_TYPES.put(td.getType(),td);
+               DERIVED_CLASSES.put(td.getTypeClass(), td);
+       }
+
+       public void addToStructuredMaps (TypeDescription td) {
+               try {
+                       String ns = 
(String)td.getTypeClass().getField("ELEMENT_NS").get(null);
                        Class<? extends AbstractStructuredType> clz = (Class<? 
extends AbstractStructuredType>)td.getTypeClass();
                        if (clz!=null) {
-                       PropMapping pm = initializePropMapping(ns, clz);
-                       td.setProperties(pm);
+                               PropMapping pm = 
ReflectHelper.initializePropMapping(ns, clz);
+                               td.setProperties(pm);
                        } else {
-                       PropMapping pm = initializePropMapping(ns, 
td.getDefinedStructure());
-                       td.setProperties(pm);
+                               PropMapping pm = initializePropMapping(ns, 
td.getDefinedStructure());
+                               td.setProperties(pm);
                        }
+                       addToStructuredMaps(td, ns);
                } catch (IllegalArgumentException e) {
                        throw new IllegalArgumentException("Failed to init 
structured maps for "+td.getTypeClass(), e);
                } catch (SecurityException e) {
@@ -145,235 +135,178 @@ public final class TypeMapping {
                        throw new IllegalArgumentException("Failed to init 
structured maps for "+td.getTypeClass(), e);
                } catch (NoSuchFieldException e) {
                        throw new IllegalArgumentException("Failed to init 
structured maps for "+td.getTypeClass(), e);
-               }  
-    }
+               }
+       }
 
-    public void addToStructuredMaps (TypeDescription td, String ns) {
-        STRUCTURED_TYPES.put(td.getType(),td);
-        STRUCTURED_CLASSES.put(td.getTypeClass(), td);
+       public void addToStructuredMaps (TypeDescription td, String ns) {
+               STRUCTURED_TYPES.put(td.getType(),td);
+               STRUCTURED_CLASSES.put(td.getTypeClass(), td);
                STRUCTURED_NAMESPACES.put(ns, td);
-    }
+       }
+
 
-    
-    public String getType (Class<?> clz) {
-       // search in basic
-       TypeDescription td = BASIC_CLASSES.get(clz);
-       // search in derived
-       if (td==null) {
-               td = DERIVED_CLASSES.get(clz);
-       }
-       // search in structured
-       if (td==null) {
-               td = STRUCTURED_CLASSES.get(clz);
-       }
-       // return type if exists
-       return (td!=null)?td.getType():null;
-    }
-    
-    /**
-     * Return the type description linked the specified paramater. If the type
-     * parameter is an array, the TypeDescription of the elements of the array
-     * will be returned
-     * 
-     * @param type
-     * @return
-     */
-    public TypeDescription getTypeDescription (String type) {
-       if (BASIC_TYPES.containsKey(type)) {
-               return BASIC_TYPES.get(type);
-       } else if (DERIVED_TYPES.containsKey(type)) {
-               return DERIVED_TYPES.get(type);
-       } else if (STRUCTURED_TYPES.containsKey(type)) { 
-               return STRUCTURED_TYPES.get(type);
-       } else {
-               int pos = type.indexOf(' ');
-               if (pos>0) {
-                       return getTypeDescription(type.substring(pos+1));
-               } else {
-                       // unknown type
-                       return null;
-               }
-       }
-    }
-    
-    public AbstractSimpleProperty instanciateSimpleProperty (XMPMetadata 
xmp,String nsuri, String prefix, String name, Object value, String type) {
-       // constructor parameters
-       Object [] params = new Object [] {
-               xmp,    
-               nsuri,
-               prefix,
-               name,
-               value
-       };
-       // type 
-       try {
+       public String getType (Class<?> clz) {
+               // search in basic
+               TypeDescription td = BASIC_CLASSES.get(clz);
+               // search in derived
+               if (td==null) {
+                       td = DERIVED_CLASSES.get(clz);
+               }
+               // search in structured
+               if (td==null) {
+                       td = STRUCTURED_CLASSES.get(clz);
+               }
+               // return type if exists
+               return (td!=null)?td.getType():null;
+       }
+
+       /**
+        * Return the type description linked the specified paramater. If the 
type
+        * parameter is an array, the TypeDescription of the elements of the 
array
+        * will be returned
+        * 
+        * @param type
+        * @return
+        */
+       public TypeDescription getTypeDescription (String type) {
+               if (BASIC_TYPES.containsKey(type)) {
+                       return BASIC_TYPES.get(type);
+               } else if (DERIVED_TYPES.containsKey(type)) {
+                       return DERIVED_TYPES.get(type);
+               } else if (STRUCTURED_TYPES.containsKey(type)) { 
+                       return STRUCTURED_TYPES.get(type);
+               } else {
+                       int pos = type.indexOf(' ');
+                       if (pos>0) {
+                               return 
getTypeDescription(type.substring(pos+1));
+                       } else {
+                               // unknown type
+                               return null;
+                       }
+               }
+       }
+
+       public AbstractStructuredType instanciateStructuredType (XMPMetadata 
metadata, Class<? extends AbstractStructuredType> propertyTypeClass) throws 
XmpParsingException {
+               try {
+                       Constructor<? extends AbstractStructuredType> construct 
= propertyTypeClass.getConstructor(new Class<?> [] {XMPMetadata.class});
+                       return construct.newInstance(metadata);
+               } catch (InvocationTargetException e) {
+                       throw new XmpParsingException("Failed to instanciate 
structured type : "+propertyTypeClass,e);
+               } catch (IllegalArgumentException e) {
+                       throw new XmpParsingException("Failed to instanciate 
structured type : "+propertyTypeClass,e);
+               } catch (InstantiationException e) {
+                       throw new XmpParsingException("Failed to instanciate 
structured type : "+propertyTypeClass,e);
+               } catch (IllegalAccessException e) {
+                       throw new XmpParsingException("Failed to instanciate 
structured type : "+propertyTypeClass,e);
+               } catch (SecurityException e) {
+                       throw new XmpParsingException("Failed to instanciate 
structured type : "+propertyTypeClass,e);
+               } catch (NoSuchMethodException e) {
+                       throw new XmpParsingException("Failed to instanciate 
structured type : "+propertyTypeClass,e);
+               } 
+       }
+
+       public AbstractSimpleProperty instanciateSimpleProperty (XMPMetadata 
xmp,String nsuri, String prefix, String name, Object value, String type) {
+               // constructor parameters
+               Object [] params = new Object [] {
+                               xmp,    
+                               nsuri,
+                               prefix,
+                               name,
+                               value
+               };
+               // type 
+               try {
                        TypeDescription description = getTypeDescription(type);
                        Class<? extends AbstractSimpleProperty> clz = (Class<? 
extends AbstractSimpleProperty>)description.getTypeClass();
                        Constructor<? extends AbstractSimpleProperty> cons = 
clz.getConstructor(simplePropertyConstParams);
                        return cons.newInstance(params);
-       } catch (NoSuchMethodError e) {
-               throw new IllegalArgumentException("Failed to instanciate 
property", e);
-       } catch (IllegalArgumentException e) {
-               throw new IllegalArgumentException("Failed to instanciate 
property", e);
+               } catch (NoSuchMethodError e) {
+                       throw new IllegalArgumentException("Failed to 
instanciate property", e);
+               } catch (IllegalArgumentException e) {
+                       throw new IllegalArgumentException("Failed to 
instanciate property", e);
                } catch (InstantiationException e) {
-               throw new IllegalArgumentException("Failed to instanciate 
property", e);
+                       throw new IllegalArgumentException("Failed to 
instanciate property", e);
                } catch (IllegalAccessException e) {
-               throw new IllegalArgumentException("Failed to instanciate 
property", e);
+                       throw new IllegalArgumentException("Failed to 
instanciate property", e);
                } catch (InvocationTargetException e) {
-               throw new IllegalArgumentException("Failed to instanciate 
property", e);
+                       throw new IllegalArgumentException("Failed to 
instanciate property", e);
                } catch (SecurityException e) {
-               throw new IllegalArgumentException("Failed to instanciate 
property", e);
+                       throw new IllegalArgumentException("Failed to 
instanciate property", e);
                } catch (NoSuchMethodException e) {
-               throw new IllegalArgumentException("Failed to instanciate 
property", e);
+                       throw new IllegalArgumentException("Failed to 
instanciate property", e);
                }
-    }
-   
+       }
+
        public  AbstractSimpleProperty instanciateSimpleField (Class<?> clz, 
XMPMetadata xmp, String nsuri, String prefix,String propertyName, Object value) 
{
-               Map<String, String> fields = getStructuredTypeFields(clz);
-               String fieldName = fields.get(propertyName);
-               try {
-                       Field f= clz.getField(fieldName);
-                       PropertyType pt = f.getAnnotation(PropertyType.class);
-                       String simpleType = pt.propertyType();
-                       return instanciateSimpleProperty(xmp, nsuri, prefix, 
propertyName, value, simpleType);
-               } catch (SecurityException e) {
-                       throw new IllegalArgumentException("Failed to 
instanciate",e);
-               } catch (NoSuchFieldException e) {
-                       throw new IllegalArgumentException("Failed to 
instanciate",e);
-               }
+               PropMapping pm = ReflectHelper.initializePropMapping(null, clz);
+               String simpleType = pm.getPropertyType(propertyName);
+               return instanciateSimpleProperty(xmp, nsuri, prefix, 
propertyName, value, simpleType);
        }
 
-    
-    
-       private static Map<String,String> getStructuredTypeFields (Class<?> 
clz) throws IllegalArgumentException {
-               Map<String,String> result = structuredTypes.get(clz);
-               if (result==null) {
-                       result = new HashMap<String, String>();
-                       Field [] fields = clz.getFields();
-                       for (Field field : fields) {
-                               PropertyType pt = 
field.getAnnotation(PropertyType.class);
-                               if (pt!=null) {
-                                       String name = field.getName();
-                                       String value;
-                                       try {
-                                               value = 
field.get(null).toString();
-                                               result.put(value, name);
-                                       } catch (IllegalAccessException e) {
-                                               throw new 
IllegalArgumentException("Cannot parse this class", e);
-                                       }
-                               }
-                       }
-                       structuredTypes.put(clz, result);
-               }
-               return result;
+       public TypeDescription getStructuredTypeName (String namespace) {
+               return STRUCTURED_NAMESPACES.get(namespace);
        }
 
-    
+       /**
+        * Check if a namespace used reference a complex basic types (like
+        * Thumbnails)
+        * 
+        * @param namespace
+        *            The namespace URI to check
+        * @return True if namespace URI is a reference for a complex basic type
+        */
+       public boolean isStructuredTypeNamespace(String namespace) {
+               return STRUCTURED_NAMESPACES.containsKey(namespace);
+       }
 
-    
-    public TypeDescription getStructuredTypeName (String namespace) {
-       return STRUCTURED_NAMESPACES.get(namespace);
-    }
-  
-    /**
-     * Check if a namespace used reference a complex basic types (like
-     * Thumbnails)
-     * 
-     * @param namespace
-     *            The namespace URI to check
-     * @return True if namespace URI is a reference for a complex basic type
-     */
-    public boolean isStructuredTypeNamespace(String namespace) {
-       return STRUCTURED_NAMESPACES.containsKey(namespace);
-    }
-
-
-    public boolean isArrayOfSimpleType (String type) {
-       int pos = type.indexOf(' ');
-       if (pos<0) {
-               // not array
-               return false;
-       } else {
-               String second = type.substring(pos+1);
-               return isSimpleType(second);
-       }
-       
-    }
-    
-    public String  getArrayType (String type) {
-       int pos = type.indexOf(' ');
-       if (pos<0) {
-               // not array
-               return null;
-       } else {
-               String first = type.substring(0,pos);
-               if (first.equalsIgnoreCase(ArrayProperty.UNORDERED_ARRAY)) {
-                       return ArrayProperty.UNORDERED_ARRAY;
-               } else if (first.equalsIgnoreCase(ArrayProperty.ORDERED_ARRAY)) 
{
-                       return ArrayProperty.ORDERED_ARRAY;
-               } else if 
(first.equalsIgnoreCase(ArrayProperty.ALTERNATIVE_ARRAY)) {
-                       return ArrayProperty.ALTERNATIVE_ARRAY;
-               } else {
-                       // else not an array
-                       return null;
-               }
-       }
-    }
-    
-    public boolean isSimpleType(String type) {
-       return (BASIC_TYPES.containsKey(type) || 
DERIVED_TYPES.containsKey(type));
-    }
-
-    public boolean isStructuredType(String type) {
-       return STRUCTURED_TYPES.containsKey(type);
-    }
 
-       private static PropMapping initializePropMapping(String ns,
-                       Class<? extends AbstractStructuredType> classSchem) {
-               PropertyType propType;
-               PropertyAttributesAnnotation propAtt;
-               Field[] fields;
-               PropMapping propMap = new PropMapping(ns);
-               fields = classSchem.getFields();
-               String propName = null;
-               for (Field field : fields) {
-                       if (field.isAnnotationPresent(PropertyType.class)) {
-                               try {
-                                       propName = (String) field.get(propName);
-                               } catch (Exception e) {
-                                       throw new IllegalArgumentException(
-                                                       "couldn't read one type 
declaration, please check accessibility and declaration of fields annoted in "
-                                                                       + 
classSchem.getName(), e);
-                               }
-                               propType = 
field.getAnnotation(PropertyType.class);
-                               if 
(!field.isAnnotationPresent(PropertyAttributesAnnotation.class)) {
-                                       propMap.addNewProperty(propName, 
propType.propertyType(),
-                                                       null);
-                               } else {
-                                       // XXX Case where a special annotation 
is used to specify
-                                       // attributes
-                                       // NOT IMPLEMENTED YET, JUST TO GIVE A 
CLUE TO MAKE THIS
-                                       propAtt = field
-                                                       
.getAnnotation(PropertyAttributesAnnotation.class);
-                                       List<String> attributes = new 
ArrayList<String>();
-                                       for (String att : 
propAtt.expectedAttributes()) {
-                                               attributes.add(att);
-                                       }
-                                       propMap.addNewProperty(propName, 
propType.propertyType(),
-                                                       attributes);
-                               }
+       public boolean isArrayOfSimpleType (String type) {
+               int pos = type.indexOf(' ');
+               if (pos<0) {
+                       // not array
+                       return false;
+               } else {
+                       String second = type.substring(pos+1);
+                       return isSimpleType(second);
+               }
+
+       }
+
+       public String  getArrayType (String type) {
+               int pos = type.indexOf(' ');
+               if (pos<0) {
+                       // not array
+                       return null;
+               } else {
+                       String first = type.substring(0,pos);
+                       if 
(first.equalsIgnoreCase(ArrayProperty.UNORDERED_ARRAY)) {
+                               return ArrayProperty.UNORDERED_ARRAY;
+                       } else if 
(first.equalsIgnoreCase(ArrayProperty.ORDERED_ARRAY)) {
+                               return ArrayProperty.ORDERED_ARRAY;
+                       } else if 
(first.equalsIgnoreCase(ArrayProperty.ALTERNATIVE_ARRAY)) {
+                               return ArrayProperty.ALTERNATIVE_ARRAY;
+                       } else {
+                               // else not an array
+                               return null;
                        }
                }
-               return propMap;
+       }
+
+       public boolean isSimpleType(String type) {
+               return (BASIC_TYPES.containsKey(type) || 
DERIVED_TYPES.containsKey(type));
+       }
+
+       public boolean isStructuredType(String type) {
+               return STRUCTURED_TYPES.containsKey(type);
        }
 
        private static PropMapping initializePropMapping(String ns,
                        DefinedStructuredType dst) {
                PropMapping propMap = new PropMapping(ns);
                for (Entry<String, String> entry: 
dst.getDefinedProperties().entrySet()) {
-                               propMap.addNewProperty(entry.getKey(), 
entry.getValue(), null);
+                       propMap.addNewProperty(entry.getKey(), 
entry.getValue());
                }
                return propMap;
        }
-    
+
 }

Modified: 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/test/java/org/apache/padaf/xmpbox/parser/PropMappingTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/test/java/org/apache/padaf/xmpbox/parser/PropMappingTest.java?rev=1376944&r1=1376943&r2=1376944&view=diff
==============================================================================
--- 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/test/java/org/apache/padaf/xmpbox/parser/PropMappingTest.java
 (original)
+++ 
pdfbox/branches/xmpbox-refactoring/xmpbox/src/test/java/org/apache/padaf/xmpbox/parser/PropMappingTest.java
 Fri Aug 24 14:32:47 2012
@@ -26,7 +26,7 @@ import java.util.List;
 
 import junit.framework.Assert;
 
-import org.apache.padaf.xmpbox.parser.PropMapping;
+import org.apache.padaf.xmpbox.type.PropMapping;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -50,10 +50,10 @@ public class PropMappingTest {
                String name = "propName";
                String type = "PropType";
 
-               propMap.addNewProperty(name, type, null);
+               propMap.addNewProperty(name, type);
                Assert.assertEquals(1, propMap.getPropertiesName().size());
                Assert.assertEquals(name, propMap.getPropertiesName().get(0));
-               Assert.assertNull(propMap.getPropertyAttributes(name));
+//             Assert.assertNull(propMap.getPropertyAttributes(name));
                Assert.assertEquals(type, propMap.getPropertyType(name));
 
        }
@@ -62,13 +62,8 @@ public class PropMappingTest {
        public void testPropMapAttr() {
                String name = "propName";
                String type = "PropType";
-               List<String> attr = new ArrayList<String>();
-               String att1 = "attr1";
-               String att2 = "attr2";
-               attr.add(att1);
-               attr.add(att2);
 
-               propMap.addNewProperty(name, type, attr);
-               Assert.assertEquals(attr, propMap.getPropertyAttributes(name));
+               propMap.addNewProperty(name, type);
+//             Assert.assertEquals(attr, propMap.getPropertyAttributes(name));
        }
 }


Reply via email to