You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by gb...@apache.org on 2012/07/28 10:36:33 UTC

svn commit: r1366609 [1/5] - in /pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox: parser/ schema/ type/

Author: gbailleul
Date: Sat Jul 28 08:36:32 2012
New Revision: 1366609

URL: http://svn.apache.org/viewvc?rev=1366609&view=rev
Log:
PDFBOX-1343 : add missing structured types and create missing field in namespaces

Added:
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/NSMapping.java
      - copied, changed from r1355678, pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/NSMapping.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/SchemaMapping.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/AbstractStructuredType.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ComplexProperty.java
      - copied, changed from r1355678, pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ComplexProperty.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ComplexPropertyContainer.java
      - copied, changed from r1355678, pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ComplexPropertyContainer.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/FieldDescription.java
      - copied, changed from r1355678, pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/FieldDescription.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/RenditionClassType.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeDescription.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeMapping.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ValueTypeDescription.java
      - copied, changed from r1355678, pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ValueTypeDescription.java
Removed:
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/JobParser.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XmpPropertyType.java
Modified:
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/PDFAExtentionSchemaPreprocessor.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/StructuredPropertyParser.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMLPropertiesDescriptionManager.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMLValueTypeDescriptionManager.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/AdobePDFSchema.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/DublinCoreSchema.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/PDFAExtensionSchema.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/PDFAFieldDescription.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/PDFAIdentificationSchema.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/PDFAPropertyDescription.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/PDFAValueTypeDescription.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/PhotoshopSchema.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/SchemaDescription.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/XMPBasicJobTicketSchema.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/XMPBasicSchema.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/XMPMediaManagementSchema.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/XMPRightsManagementSchema.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/XMPSchema.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/AbstractField.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/AbstractSimpleProperty.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/BooleanType.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/DateType.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/Elementable.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/IntegerType.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/JobType.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/LayerType.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/PropertyDescription.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/RealType.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ResourceEventType.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ResourceRefType.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TextType.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/ThumbnailType.java
    pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/VersionType.java

Copied: pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/NSMapping.java (from r1355678, pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/NSMapping.java)
URL: http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/NSMapping.java?p2=pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/NSMapping.java&p1=pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/NSMapping.java&r1=1355678&r2=1366609&rev=1366609&view=diff
==============================================================================
--- pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/NSMapping.java (original)
+++ pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/NSMapping.java Sat Jul 28 08:36:32 2012
@@ -21,8 +21,6 @@
 
 package org.apache.padaf.xmpbox.parser;
 
-import java.lang.reflect.Field;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -31,22 +29,13 @@ import java.util.Map.Entry;
 import javax.xml.namespace.QName;
 
 import org.apache.padaf.xmpbox.XMPMetadata;
-import org.apache.padaf.xmpbox.schema.AdobePDFSchema;
-import org.apache.padaf.xmpbox.schema.DublinCoreSchema;
-import org.apache.padaf.xmpbox.schema.PDFAExtensionSchema;
 import org.apache.padaf.xmpbox.schema.PDFAFieldDescription;
-import org.apache.padaf.xmpbox.schema.PDFAIdentificationSchema;
 import org.apache.padaf.xmpbox.schema.PDFAPropertyDescription;
 import org.apache.padaf.xmpbox.schema.PDFAValueTypeDescription;
-import org.apache.padaf.xmpbox.schema.PhotoshopSchema;
-import org.apache.padaf.xmpbox.schema.PropertyAttributesAnnotation;
-import org.apache.padaf.xmpbox.schema.PropertyType;
 import org.apache.padaf.xmpbox.schema.SchemaDescription;
-import org.apache.padaf.xmpbox.schema.XMPBasicJobTicketSchema;
-import org.apache.padaf.xmpbox.schema.XMPBasicSchema;
-import org.apache.padaf.xmpbox.schema.XMPMediaManagementSchema;
-import org.apache.padaf.xmpbox.schema.XMPRightsManagementSchema;
+import org.apache.padaf.xmpbox.schema.SchemaMapping;
 import org.apache.padaf.xmpbox.schema.XMPSchema;
+import org.apache.padaf.xmpbox.type.TypeMapping;
 
 
 /**
@@ -57,462 +46,324 @@ import org.apache.padaf.xmpbox.schema.XM
  */
 public class NSMapping {
 
-    public static final List<String> BASIC_TYPES;
-    public static final Map<String, String> COMPLEX_BASIC_TYPES;
+	private Map<String, XMPSchemaFactory> definedNamespaces;
 
-    static {
-        BASIC_TYPES = new ArrayList<String>();
-        BASIC_TYPES.add("Text");
-        BASIC_TYPES.add("ProperName");
-        BASIC_TYPES.add("Integer");
-        BASIC_TYPES.add("Boolean");
-        BASIC_TYPES.add("Date");
-        BASIC_TYPES.add("URI");
-        BASIC_TYPES.add("URL");
-        BASIC_TYPES.add("bag Text");
-        BASIC_TYPES.add("bag ProperName");
-        BASIC_TYPES.add("bag Xpath");
-        BASIC_TYPES.add("seq Text");
-        BASIC_TYPES.add("seq Field");
-        BASIC_TYPES.add("seq Date");
-        BASIC_TYPES.add("Lang Alt");
-
-        COMPLEX_BASIC_TYPES = new HashMap<String, String>();
-        COMPLEX_BASIC_TYPES.put("http://ns.adobe.com/xap/1.0/g/img/",
-        "Thumbnail");
-        COMPLEX_BASIC_TYPES.put(PhotoshopSchema.PHOTOSHOPURI,
-        "TextLayers");
-        COMPLEX_BASIC_TYPES.put(XMPBasicJobTicketSchema.JOB_TICKET_URI, "Job");
-    }
-
-    protected Map<String, XMPSchemaFactory> nsMaps;
-    protected Map<String, String> complexBasicTypesDeclarationEntireXMPLevel;
-    protected Map<String, String> complexBasicTypesDeclarationSchemaLevel;
-    protected Map<String, String> complexBasicTypesDeclarationPropertyLevel;
-
-    /**
-     * Constructor of the NameSpace mapping
-     * 
-     * @throws XmpSchemaException
-     *             When could not read a property data in a Schema Class given
-     */
-    public NSMapping() throws XmpSchemaException {
-        nsMaps = new HashMap<String, XMPSchemaFactory>();
-        complexBasicTypesDeclarationEntireXMPLevel = new HashMap<String, String>();
-        complexBasicTypesDeclarationSchemaLevel = new HashMap<String, String>();
-        complexBasicTypesDeclarationPropertyLevel = new HashMap<String, String>();
-        //  Add mapping of common schemas
-        addNameSpace("http://ns.adobe.com/xap/1.0/", XMPBasicSchema.class);
-        addNameSpace("http://purl.org/dc/elements/1.1/", DublinCoreSchema.class);
-        addNameSpace("http://www.aiim.org/pdfa/ns/extension/", PDFAExtensionSchema.class);
-        addNameSpace("http://ns.adobe.com/xap/1.0/mm/", XMPMediaManagementSchema.class);
-        addNameSpace("http://ns.adobe.com/pdf/1.3/", AdobePDFSchema.class);
-        addNameSpace("http://www.aiim.org/pdfa/ns/id/", PDFAIdentificationSchema.class);
-        addNameSpace("http://ns.adobe.com/xap/1.0/rights/",     XMPRightsManagementSchema.class);
-        addNameSpace(PhotoshopSchema.PHOTOSHOPURI,      PhotoshopSchema.class);
-        addNameSpace(XMPBasicJobTicketSchema.JOB_TICKET_URI,XMPBasicJobTicketSchema.class);
-
-
-    }
-
-
-    /**
-     * Import an NSMapping content.
-     * @param imp
-     */
-    public void importNSMapping(NSMapping imp) throws XmpSchemaException {
-        mergeNSMap(imp.nsMaps);
-        mergeComplexBasicTypesDeclarationEntireXMPLevel(imp.complexBasicTypesDeclarationEntireXMPLevel);
-        mergeComplexBasicTypesDeclarationSchemaLevel(imp.complexBasicTypesDeclarationSchemaLevel);
-        mergeComplexBasicTypesDeclarationPropertyLevel(imp.complexBasicTypesDeclarationPropertyLevel);
-    }
-
-    protected void mergeNSMap(Map<String, XMPSchemaFactory> map) throws XmpSchemaException {
-        for (Entry<String, XMPSchemaFactory> entry : map.entrySet() ) {
-            if (this.nsMaps.containsKey(entry.getKey())) {
-                this.nsMaps.get(entry.getKey()).importXMPSchemaFactory(entry.getValue());
-            } else {
-                this.nsMaps.put(entry.getKey(), entry.getValue());
-            }
-        }
-    }
-
-    private void mergeComplexBasicTypesDeclarationEntireXMPLevel(Map<String, String> external) {
-        for (Entry<String, String> entry : external.entrySet()) {
-            if(!complexBasicTypesDeclarationEntireXMPLevel.containsKey(entry.getKey())) {
-                complexBasicTypesDeclarationEntireXMPLevel.put(entry.getKey(), entry.getValue());
-            }
-        }
-    }
-
-    private void mergeComplexBasicTypesDeclarationSchemaLevel(Map<String, String> external) {
-        for (Entry<String, String> entry : external.entrySet()) {
-            if(!complexBasicTypesDeclarationSchemaLevel.containsKey(entry.getKey())) {
-                complexBasicTypesDeclarationSchemaLevel.put(entry.getKey(), entry.getValue());
-            }
-        }
-    }
-
-    private void mergeComplexBasicTypesDeclarationPropertyLevel(Map<String, String> external) {
-        for (Entry<String, String> entry : external.entrySet()) {
-            if(!complexBasicTypesDeclarationPropertyLevel.containsKey(entry.getKey())) {
-                complexBasicTypesDeclarationPropertyLevel.put(entry.getKey(), entry.getValue());
-            }
-        }
-    }
-
-    /**
-     * Add a namespace declaration and Schema factory associated
-     * 
-     * @param ns
-     *            the Namespace URI
-     * @param classSchem
-     *            The class representation of the schema linked to the namespace
-     * @throws XmpSchemaException
-     *             When could not read property name in Schema Class given
-     */
-    private void addNameSpace(String ns, Class<? extends XMPSchema> classSchem)
-    throws XmpSchemaException {
-        nsMaps.put(ns, new XMPSchemaFactory(ns, classSchem,	initializePropMapping(ns, classSchem)));
-    }
-
-    /**
-     * 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 PropMapping initializePropMapping(String ns,
-            Class<? extends XMPSchema> classSchem) throws XmpSchemaException {
-        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 XmpSchemaException(
-                            "couldn't read one type declaration, please check accessibility and declaration of fields annoted in "
-                            + classSchem.getName(), e);
-                }
-                // System.out.println("nameField:"+propName);
-                propType = field.getAnnotation(PropertyType.class);
-                // System.out.println("Type '"+propInfo.propertyType()+"' defined for "+propName);
-                if (!field
-                        .isAnnotationPresent(PropertyAttributesAnnotation.class)) {
-                    propMap.addNewProperty(propName, propType.propertyType(),
-                            null);
-                } else {
-                    // TODO 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;
-    }
-
-    /**
-     * see if a specific type is known as a basic XMP type
-     * 
-     * @param type
-     *            Type to check
-     * @return True if type is a simple basic type
-     */
-    private boolean isBasicType(String type) {
-        return BASIC_TYPES.contains(type);
-
-    }
-
-    /**
-     * Say if a specific namespace is known
-     * 
-     * @param namespace
-     *            The namespace URI checked
-     * @return True if namespace URI is known
-     */
-    public boolean isContainedNamespace(String namespace) {
-        return nsMaps.containsKey(namespace);
-    }
-
-    /**
-     * Give type of specified property in specified schema (given by its
-     * namespaceURI)
-     * 
-     * @param namespace
-     *            The namespaceURI to explore
-     * @param prop
-     *            the property Qualified Name
-     * @return Property type declared for namespace specified, null if unknown
-     */
-    public String getSpecifiedPropertyType(String namespace, QName prop) {
-        if (nsMaps.containsKey(namespace)) {
-            return nsMaps.get(namespace).getPropertyType(prop.getLocalPart());
-        }
-        // check if its a complexbasicValueType and if it's has been declared
-        return getComplexBasicValueTypeEffectiveType(prop.getPrefix());
-
-    }
-
-    /**
-     * Check if a non basic value type used is describes in the schema which
-     * inlude a property with a such type
-     * 
-     * @param desc
-     *            The schema description associated to the schema which declare
-     *            a property with specific value type
-     * @param definedValueType
-     *            The value type name to find in value types descriptions
-     * @return The description of this specific value type
-     * @throws XmpUnknownValueTypeException
-     *             If no declaration found
-     */
-    private PDFAValueTypeDescription findValueTypeDescription(
-            SchemaDescription desc, String definedValueType)
-    throws XmpUnknownValueTypeException {
-        List<PDFAValueTypeDescription> values = desc.getValueTypes();
-        for (PDFAValueTypeDescription val : values) {
-            if (definedValueType.equals(val.getTypeNameValue())) {
-                return val;
-            }
-        }
-        throw new XmpUnknownValueTypeException("ValueType '" + definedValueType
-                + "' is unknown. no declaration found in this schema");
-    }
-
-    /**
-     * Check if valueType used for a specified property description is known (in
-     * case where it's a normal value type or if a value type which has been
-     * defined in PDF/A Extension schema)
-     * 
-     * @param desc
-     *            The schema description associated to the schema which declare
-     *            a property with specific value type
-     * @param definedValueType
-     *            The value type name to find in value types descriptions
-     * @return value type equivalence (value type which can be treat (orginal
-     *         basic value type or specific value type decomposed to find basic
-     *         types)
-     * @throws XmpUnknownValueTypeException
-     *             When Value Type is unknown
-     * 
-     */
-    private String getValueTypeEquivalence(SchemaDescription desc,
-            String definedValueType) throws XmpUnknownValueTypeException {
-        if (isBasicType(definedValueType)) {
-            return definedValueType;
-        }
-        PDFAValueTypeDescription val = findValueTypeDescription(desc,
-                definedValueType);
-        if (val.getFields().isEmpty()) {
-            // if fields value are note defined we suppose the property is a
-            // Text type
-            return "Text";
-        }
-        return "Field";
-    }
-
-    /**
-     * . For a specific valuetype declared in this schema. This method decompose
-     * it if field are present. and add types expected
-     * 
-     * @param desc
-     *            The schema description associated to the schema which declare
-     *            a property with specific value type
-     * @param valueType
-     *            valueType to analyze
-     * @param prop
-     *            Expected properties types representation
-     * @throws XmpUnknownValueTypeException
-     *             When a Value Type associated is unknown
-     */
-    private void declareAssociatedFieldType(SchemaDescription desc,
-            String valueType, PropMapping prop)
-    throws XmpUnknownValueTypeException {
-
-        PDFAValueTypeDescription val = findValueTypeDescription(desc, valueType);
-        for (PDFAFieldDescription field : val.getFields()) {
-            // TODO case where a field call another nspace property ???
-            String fieldType = getValueTypeEquivalence(desc, field
-                    .getValueTypeValue());
-            if (fieldType.equals("Field")) {
-                throw new XmpUnknownValueTypeException(
-                "ValueType Field reference a valuetype unknown");
-            }
-            prop.addNewProperty(field.getNameValue(), fieldType, null);
-
-        }
-    }
-
-    /**
-     * Add a new namespace Mapping for specific schema declared in PDF/A
-     * Extension schema
-     * 
-     * @param desc
-     *            The schemaDescription associated to the schema
-     * @throws XmpUnknownValueTypeException
-     *             When a Value Type associated is unknown
-     */
-    public void setNamespaceDefinition(SchemaDescription desc)
-    throws XmpUnknownValueTypeException {
-        PropMapping propMap = new PropMapping(desc.getNameSpaceURI());
-        List<PDFAPropertyDescription> props = desc.getProperties();
-        for (int i = 0; i < props.size(); i++) {
-            String type = getValueTypeEquivalence(desc, props.get(i).getValueTypeValue());
-            propMap.addNewProperty(props.get(i).getNameValue(), type, null);
-            if (type.equals("Field")) {
-                declareAssociatedFieldType(desc, props.get(i).getValueTypeValue(), propMap);
-            }
-        }
-        String nsName = desc.getPrefix();
-        String ns = desc.getNameSpaceURI();
-        nsMaps.put(ns, new XMPSchemaFactory(nsName, ns, XMPSchema.class, propMap));
-    }
-
-    /**
-     * Return the specialized schema class representation if it's known (create
-     * and add it to metadata). In other cases, return null
-     * 
-     * @param metadata
-     *            Metadata to link the new schema
-     * @param namespace
-     *            The namespace URI
-     * @return Schema representation
-     * @throws XmpSchemaException
-     *             When Instancing specified Object Schema failed
-     */
-    public XMPSchema getAssociatedSchemaObject(XMPMetadata metadata, String namespace, String prefix) throws XmpSchemaException {
-        if (!nsMaps.containsKey(namespace)) {
-            return null;
-        }
-        XMPSchemaFactory factory = nsMaps.get(namespace);
-        return factory.createXMPSchema(metadata, prefix);
-    }
-
-    /**
-     * 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 isComplexBasicTypes(String namespace) {
-        return COMPLEX_BASIC_TYPES.containsKey(namespace);
-    }
-
-    /**
-     * Check if a namespace declaration for a complex basic type has been found
-     * and if its valid for the entire XMP stream
-     * 
-     * @param namespace
-     *            the namespace URI
-     * @param prefix
-     *            the prefix associated to this namespace
-     */
-    public void setComplexBasicTypesDeclarationForLevelXMP(String namespace,
-            String prefix) {
-        if (isComplexBasicTypes(namespace)) {
-            complexBasicTypesDeclarationEntireXMPLevel.put(prefix, namespace);
-        }
-    }
-
-    /**
-     * Check if a namespace declaration for a complex basic type has been found
-     * and if its valid for the current schema description (at level of
-     * rdf:Description)
-     * 
-     * @param namespace
-     *            the namespace URI
-     * @param prefix
-     *            the prefix associated to this namespace
-     */
-    public void setComplexBasicTypesDeclarationForLevelSchema(String namespace,
-            String prefix) {
-        if (isComplexBasicTypes(namespace)) {
-            complexBasicTypesDeclarationSchemaLevel.put(prefix, namespace);
-        }
-
-    }
-
-    /**
-     * Check if a namespace declaration for a complex basic type has been found
-     * and if its valid for the current property description
-     * 
-     * @param namespace
-     *            the namespace URI
-     * @param prefix
-     *            the prefix associated to this namespace
-     */
-    public void setComplexBasicTypesDeclarationForLevelProperty(
-            String namespace, String prefix) {
-        if (isComplexBasicTypes(namespace)) {
-            complexBasicTypesDeclarationPropertyLevel.put(prefix, namespace);
-        }
-    }
-
-    /**
-     * Check for all XMP level if a complexBasicValueType prefix has been
-     * declared
-     * 
-     * @param prefix
-     *            The prefix which may design the namespace URI of the complex
-     *            basic type
-     * @return The type if it is known, else null.
-     */
-    public String getComplexBasicValueTypeEffectiveType(String prefix) {
-        if (complexBasicTypesDeclarationPropertyLevel.containsKey(prefix)) {
-            return COMPLEX_BASIC_TYPES
-            .get(complexBasicTypesDeclarationPropertyLevel.get(prefix));
-        }
-        if (complexBasicTypesDeclarationSchemaLevel.containsKey(prefix)) {
-            return COMPLEX_BASIC_TYPES
-            .get(complexBasicTypesDeclarationSchemaLevel.get(prefix));
-        }
-        if (complexBasicTypesDeclarationEntireXMPLevel.containsKey(prefix)) {
-            return COMPLEX_BASIC_TYPES
-            .get(complexBasicTypesDeclarationEntireXMPLevel.get(prefix));
-        }
-        return null;
-    }
-
-    /**
-     * Reset complex Basic types declaration for property level
-     */
-    public void resetComplexBasicTypesDeclarationInPropertyLevel() {
-        complexBasicTypesDeclarationPropertyLevel.clear();
-    }
-
-    /**
-     * Reset complex Basic types declaration for schema level
-     */
-    public void resetComplexBasicTypesDeclarationInSchemaLevel() {
-        complexBasicTypesDeclarationSchemaLevel.clear();
-    }
-
-    /**
-     * Reset complex Basic types declaration for Entire XMP level
-     */
-    public void resetComplexBasicTypesDeclarationInEntireXMPLevel() {
-        complexBasicTypesDeclarationEntireXMPLevel.clear();
-    }
 
+	private Map<String, String> complexBasicTypesDeclarationEntireXMPLevel;
+	
+	private Map<String, String> complexBasicTypesDeclarationSchemaLevel;
+	
+	private Map<String, String> complexBasicTypesDeclarationPropertyLevel;
+
+	/**
+	 * Constructor of the NameSpace mapping
+	 * 
+	 * @throws XmpSchemaException
+	 *             When could not read a property data in a Schema Class given
+	 */
+	public NSMapping() throws XmpSchemaException {
+		complexBasicTypesDeclarationEntireXMPLevel = new HashMap<String, String>();
+		complexBasicTypesDeclarationSchemaLevel = new HashMap<String, String>();
+		complexBasicTypesDeclarationPropertyLevel = new HashMap<String, String>();
+		definedNamespaces = new HashMap<String, XMPSchemaFactory>();
+	}
+
+
+	/**
+	 * Import an NSMapping content.
+	 * @param imp
+	 */
+	public void importNSMapping(NSMapping imp) throws XmpSchemaException {
+		// merge name sapce maps
+		for (Entry<String, XMPSchemaFactory> entry : imp.definedNamespaces.entrySet() ) {
+			if (this.definedNamespaces.containsKey(entry.getKey())) {
+				this.definedNamespaces.get(entry.getKey()).importXMPSchemaFactory(entry.getValue());
+			} else {
+				this.definedNamespaces.put(entry.getKey(), entry.getValue());
+			}
+		}
+		// merge complex basic types declaration entire xmp level
+		for (Entry<String, String> entry : imp.complexBasicTypesDeclarationEntireXMPLevel.entrySet()) {
+			if(!complexBasicTypesDeclarationEntireXMPLevel.containsKey(entry.getKey())) {
+				complexBasicTypesDeclarationEntireXMPLevel.put(entry.getKey(), entry.getValue());
+			}
+		}
+		// merge complex basic types declaration schema level
+		for (Entry<String, String> entry : imp.complexBasicTypesDeclarationSchemaLevel.entrySet()) {
+			if(!complexBasicTypesDeclarationSchemaLevel.containsKey(entry.getKey())) {
+				complexBasicTypesDeclarationSchemaLevel.put(entry.getKey(), entry.getValue());
+			}
+		}
+		// merger complex basic types declaration property level
+		for (Entry<String, String> entry : imp.complexBasicTypesDeclarationPropertyLevel.entrySet()) {
+			if(!complexBasicTypesDeclarationPropertyLevel.containsKey(entry.getKey())) {
+				complexBasicTypesDeclarationPropertyLevel.put(entry.getKey(), entry.getValue());
+			}
+		}
+	}
+
+
+
+	/**
+	 * Say if a specific namespace is known
+	 * 
+	 * @param namespace
+	 *            The namespace URI checked
+	 * @return True if namespace URI is known
+	 */
+	public boolean isContainedNamespace(String namespace) {
+		boolean found = SchemaMapping.isContainedNamespace(namespace);
+		if (!found) {
+			found = definedNamespaces.containsKey(namespace);
+		}
+		return found;
+	}
+
+	/**
+	 * Give type of specified property in specified schema (given by its
+	 * namespaceURI)
+	 * 
+	 * @param namespace
+	 *            The namespaceURI to explore
+	 * @param prop
+	 *            the property Qualified Name
+	 * @return Property type declared for namespace specified, null if unknown
+	 */
+	public String getSpecifiedPropertyType(String namespace, QName prop) {
+		XMPSchemaFactory factory = SchemaMapping.getSchemaFactory(namespace);
+		if (factory==null) {
+			factory = definedNamespaces.get(namespace);
+		}
+		if (factory!=null) {
+			return factory.getPropertyType(prop.getLocalPart());
+		} else {
+			// check if its a complexbasicValueType and if it's has been declared
+			return getComplexBasicValueTypeEffectiveType(prop.getPrefix());
+		}
+	}
+
+	/**
+	 * Check if a non basic value type used is describes in the schema which
+	 * inlude a property with a such type
+	 * 
+	 * @param desc
+	 *            The schema description associated to the schema which declare
+	 *            a property with specific value type
+	 * @param definedValueType
+	 *            The value type name to find in value types descriptions
+	 * @return The description of this specific value type
+	 * @throws XmpUnknownValueTypeException
+	 *             If no declaration found
+	 */
+	private PDFAValueTypeDescription findValueTypeDescription(
+			SchemaDescription desc, String definedValueType)
+					throws XmpUnknownValueTypeException {
+		List<PDFAValueTypeDescription> values = desc.getValueTypes();
+		for (PDFAValueTypeDescription val : values) {
+			if (definedValueType.equals(val.getTypeNameValue())) {
+				return val;
+			}
+		}
+		throw new XmpUnknownValueTypeException("ValueType '" + definedValueType
+				+ "' is unknown. no declaration found in this schema");
+	}
+
+	/**
+	 * Check if valueType used for a specified property description is known (in
+	 * case where it's a normal value type or if a value type which has been
+	 * defined in PDF/A Extension schema)
+	 * 
+	 * @param desc
+	 *            The schema description associated to the schema which declare
+	 *            a property with specific value type
+	 * @param definedValueType
+	 *            The value type name to find in value types descriptions
+	 * @return value type equivalence (value type which can be treat (orginal
+	 *         basic value type or specific value type decomposed to find basic
+	 *         types)
+	 * @throws XmpUnknownValueTypeException
+	 *             When Value Type is unknown
+	 * 
+	 */
+	private String getValueTypeEquivalence(SchemaDescription desc,
+			String definedValueType) throws XmpUnknownValueTypeException {
+		if (TypeMapping.isSimpleType(definedValueType) || TypeMapping.isArrayOfSimpleType(definedValueType)) {
+			return definedValueType;
+		}
+		PDFAValueTypeDescription val = findValueTypeDescription(desc,
+				definedValueType);
+		if (val.getFields().isEmpty()) {
+			// if fields value are note defined we suppose the property is a
+			// Text type
+			return "Text";
+		}
+		return "Field";
+	}
+
+
+	/**
+	 * Add a new namespace Mapping for specific schema declared in PDF/A
+	 * Extension schema
+	 * 
+	 * @param desc
+	 *            The schemaDescription associated to the schema
+	 * @throws XmpUnknownValueTypeException
+	 *             When a Value Type associated is unknown
+	 */
+	public void setNamespaceDefinition(SchemaDescription desc)
+			throws XmpUnknownValueTypeException {
+		PropMapping propMap = new PropMapping(desc.getNameSpaceURI());
+		List<PDFAPropertyDescription> props = desc.getProperties();
+		for (int i = 0; i < props.size(); i++) {
+			String type = getValueTypeEquivalence(desc, props.get(i).getValueTypeValue());
+			propMap.addNewProperty(props.get(i).getNameValue(), type, null);
+			if (type.equals("Field")) {
+				String valueType = props.get(i).getValueTypeValue();
+				PDFAValueTypeDescription val = findValueTypeDescription(desc, valueType);
+				for (PDFAFieldDescription field : val.getFields()) {
+					// XXX case where a field call another nspace property ???
+					String fieldType = getValueTypeEquivalence(desc, field
+							.getValueTypeValue());
+					if (fieldType.equals("Field")) {
+						throw new XmpUnknownValueTypeException(
+								"ValueType Field reference a valuetype unknown");
+					}
+					propMap.addNewProperty(field.getNameValue(), fieldType, null);
+
+				}
+
+				
+			}
+		}
+		String nsName = desc.getPrefix();
+		String ns = desc.getNameSpaceURI();
+		definedNamespaces.put(ns, new XMPSchemaFactory(nsName, ns, XMPSchema.class, propMap));
+	}
+
+	/**
+	 * Check if a namespace declaration for a complex basic type has been found
+	 * and if its valid for the entire XMP stream
+	 * 
+	 * @param namespace
+	 *            the namespace URI
+	 * @param prefix
+	 *            the prefix associated to this namespace
+	 */
+	public void setComplexBasicTypesDeclarationForLevelXMP(String namespace,
+			String prefix) {
+		if (TypeMapping.isStructuredTypeNamespace(namespace)) {
+			complexBasicTypesDeclarationEntireXMPLevel.put(prefix, namespace);
+		}
+	}
+
+	/**
+	 * Check if a namespace declaration for a complex basic type has been found
+	 * and if its valid for the current schema description (at level of
+	 * rdf:Description)
+	 * 
+	 * @param namespace
+	 *            the namespace URI
+	 * @param prefix
+	 *            the prefix associated to this namespace
+	 */
+	public void setComplexBasicTypesDeclarationForLevelSchema(String namespace,
+			String prefix) {
+		if (TypeMapping.isStructuredTypeNamespace(namespace)) {
+			complexBasicTypesDeclarationSchemaLevel.put(prefix, namespace);
+		}
+
+	}
+
+	/**
+	 * Check if a namespace declaration for a complex basic type has been found
+	 * and if its valid for the current property description
+	 * 
+	 * @param namespace
+	 *            the namespace URI
+	 * @param prefix
+	 *            the prefix associated to this namespace
+	 */
+	public void setComplexBasicTypesDeclarationForLevelProperty(
+			String namespace, String prefix) {
+		if (TypeMapping.isStructuredTypeNamespace(namespace)) {
+			complexBasicTypesDeclarationPropertyLevel.put(prefix, namespace);
+		}
+	}
+
+
+	/**
+	 * Reset complex Basic types declaration for property level
+	 */
+	public void resetComplexBasicTypesDeclarationInPropertyLevel() {
+		complexBasicTypesDeclarationPropertyLevel.clear();
+	}
+
+	/**
+	 * Reset complex Basic types declaration for schema level
+	 */
+	public void resetComplexBasicTypesDeclarationInSchemaLevel() {
+		complexBasicTypesDeclarationSchemaLevel.clear();
+	}
+
+	/**
+	 * Reset complex Basic types declaration for Entire XMP level
+	 */
+	public void resetComplexBasicTypesDeclarationInEntireXMPLevel() {
+		complexBasicTypesDeclarationEntireXMPLevel.clear();
+	}
+
+	/**
+	 * Check for all XMP level if a complexBasicValueType prefix has been
+	 * declared
+	 * 
+	 * @param prefix
+	 *            The prefix which may design the namespace URI of the complex
+	 *            basic type
+	 * @return The type if it is known, else null.
+	 */
+	public String getComplexBasicValueTypeEffectiveType(String prefix) {
+		// stop when found in first map
+		String tmp = complexBasicTypesDeclarationPropertyLevel.get(prefix);
+		if (tmp==null) {
+			tmp = complexBasicTypesDeclarationSchemaLevel.get(prefix);
+		}
+		if (tmp ==null) {
+			tmp = complexBasicTypesDeclarationEntireXMPLevel.get(prefix);
+		}
+		// return complex basic type
+		if (tmp!=null) {
+			return TypeMapping.getStructuredTypeName(tmp).getType();
+		} else {
+			// 
+			return null;
+		}
+	}
+
+	/**
+	 * Return the specialized schema class representation if it's known (create
+	 * and add it to metadata). In other cases, return null
+	 * 
+	 * @param metadata
+	 *            Metadata to link the new schema
+	 * @param namespace
+	 *            The namespace URI
+	 * @return Schema representation
+	 * @throws XmpSchemaException
+	 *             When Instancing specified Object Schema failed
+	 */
+	public XMPSchema getAssociatedSchemaObject(XMPMetadata metadata, String namespace, String prefix) throws XmpSchemaException {
+		XMPSchema found = SchemaMapping.getAssociatedSchemaObject(metadata, namespace, prefix);
+		if (found!=null) {
+			return found;
+		} else {
+			// look in local
+			if (!definedNamespaces.containsKey(namespace)) {
+				return null;
+			}
+			XMPSchemaFactory factory = definedNamespaces.get(namespace);
+			return factory.createXMPSchema(metadata, prefix);
+		}
+	}
+
+	
 }

Modified: pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/PDFAExtentionSchemaPreprocessor.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/PDFAExtentionSchemaPreprocessor.java?rev=1366609&r1=1366608&r2=1366609&view=diff
==============================================================================
--- pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/PDFAExtentionSchemaPreprocessor.java (original)
+++ pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/PDFAExtentionSchemaPreprocessor.java Sat Jul 28 08:36:32 2012
@@ -29,6 +29,7 @@ import javax.xml.stream.XMLStreamReader;
 import org.apache.padaf.xmpbox.XMPMetadata;
 import org.apache.padaf.xmpbox.schema.PDFAExtensionSchema;
 import org.apache.padaf.xmpbox.type.BadFieldValueException;
+import org.apache.padaf.xmpbox.type.TypeMapping;
 
 public class PDFAExtentionSchemaPreprocessor extends XMPDocumentBuilder implements XMPDocumentPreprocessor {
 
@@ -39,7 +40,7 @@ public class PDFAExtentionSchemaPreproce
 	public NSMapping process(byte[] xmp) throws XmpParsingException, XmpSchemaException, 
 		XmpUnknownValueTypeException, XmpExpectedRdfAboutAttribute, XmpXpacketEndException, BadFieldValueException {
 		parse(xmp);
-		return this.nsMap;
+		return this.getNsMap();
 	}
 
 	protected void parseDescription(XMPMetadata metadata)
@@ -47,15 +48,16 @@ public class PDFAExtentionSchemaPreproce
 	XmpUnknownValueTypeException, XmpExpectedRdfAboutAttribute,
 	BadFieldValueException {
 
+		NSMapping nsMap = getNsMap();
+		XMLStreamReader reader = getReader();
 		nsMap.resetComplexBasicTypesDeclarationInSchemaLevel();
-		int cptNS = reader.get().getNamespaceCount();
+		int cptNS = reader.getNamespaceCount();
 		HashMap<String, String> namespaces = new HashMap<String, String>();
 		for (int i = 0; i < cptNS; i++) {
-			namespaces.put(reader.get().getNamespacePrefix(i), reader.get().getNamespaceURI(i));
-			if (nsMap.isComplexBasicTypes(reader.get().getNamespaceURI(i))) {
+			namespaces.put(reader.getNamespacePrefix(i), reader.getNamespaceURI(i));
+			if (TypeMapping.isStructuredTypeNamespace(reader.getNamespaceURI(i))) {
 				nsMap.setComplexBasicTypesDeclarationForLevelSchema(reader
-						.get().getNamespaceURI(i), reader.get()
-						.getNamespacePrefix(i));
+						.getNamespaceURI(i), reader.getNamespacePrefix(i));
 			}
 		}
 
@@ -81,10 +83,10 @@ public class PDFAExtentionSchemaPreproce
 
 		} else {
 			int openedTag = 0;
-			while (reader.get().nextTag() == XMLStreamReader.START_ELEMENT) {
+			while (reader.nextTag() == XMLStreamReader.START_ELEMENT) {
 				openedTag=1;
 				do {
-					int tag = reader.get().next();
+					int tag = reader.next();
 					if (tag == XMLStreamReader.START_ELEMENT) {
 						openedTag++;
 					} else if (tag == XMLStreamReader.END_ELEMENT) {

Modified: pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/StructuredPropertyParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/StructuredPropertyParser.java?rev=1366609&r1=1366608&r2=1366609&view=diff
==============================================================================
--- pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/StructuredPropertyParser.java (original)
+++ pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/StructuredPropertyParser.java Sat Jul 28 08:36:32 2012
@@ -21,25 +21,218 @@
 
 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.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
 
 import org.apache.padaf.xmpbox.XMPMetadata;
+import org.apache.padaf.xmpbox.schema.PropertyType;
+import org.apache.padaf.xmpbox.type.AbstractField;
+import org.apache.padaf.xmpbox.type.AbstractSimpleProperty;
+import org.apache.padaf.xmpbox.type.AbstractStructuredType;
 import org.apache.padaf.xmpbox.type.ComplexPropertyContainer;
+import org.apache.padaf.xmpbox.type.TypeDescription;
+import org.apache.padaf.xmpbox.type.TypeMapping;
+
+public class StructuredPropertyParser {
 
-public abstract class StructuredPropertyParser {
+	private XMPDocumentBuilder builder = null;
+	
+	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,String.class};
+	private static Class<?> [] propertyConstructorParams = new Class [] {XMPMetadata.class};
+
+	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
+		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);
+		}
+
+			}
+
+	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);
+		}
+	}
+
+	
+//	private String retrieveNamespacePrefix (XMLStreamReader reader, String namespace) {
+//		int na = reader.getNamespaceCount();
+//		for (int i=0; i < na; i++) {
+//			if (reader.getNamespaceURI(i).equals(namespace)) {
+//				return reader.getNamespacePrefix(i);
+//			}
+//		}
+//		// no namespace for prefix
+//		return null;
+//	}
+//	
+//	private String getStructuredClassNamespace (Class<? extends AbstractStructuredType> clz) throws XmpUnexpectedTypeException {
+//		try {
+//			return (String)typeClass.getField("ELEMENT_NS").get(null);
+//		} catch (IllegalArgumentException e) {
+//			throw new XmpUnexpectedTypeException("Failed to find Structured type namespace ("+clz.getName()+")",e);
+//		} catch (SecurityException e) {
+//			throw new XmpUnexpectedTypeException("Failed to find Structured type namespace ("+clz.getName()+")",e);
+//		} catch (IllegalAccessException e) {
+//			throw new XmpUnexpectedTypeException("Failed to find Structured type namespace ("+clz.getName()+")",e);
+//		} catch (NoSuchFieldException e) {
+//			throw new XmpUnexpectedTypeException("Failed to find Structured type namespace ("+clz.getName()+")",e);
+//		}
+//		
+//	}
+	
+	
+	public void parse(XMPMetadata metadata, QName altName,
+			ComplexPropertyContainer container)
+					throws XmpUnexpectedTypeException, XmpParsingException,
+					XMLStreamException, XmpUnknownPropertyTypeException,
+					XmpPropertyFormatException {
+		builder.expectCurrentLocalName("li");
+		// create property
+//		String fieldPrefix = retrieveNamespacePrefix(
+//				builder.reader.get(), 
+//				getStructuredClassNamespace(typeClass));
+//		ComplexPropertyContainer property = instanciateProperty(metadata, fieldPrefix );
+		ComplexPropertyContainer property = instanciateProperty(metadata);
+		XMLStreamReader reader = builder.getReader();
+		int elmtType = reader.nextTag();
+		QName eltName;
+		while (!((elmtType == XMLStreamReader.END_ELEMENT) && reader.getName().getLocalPart().equals("li"))) {
+			// read element name, then text content
+			eltName = reader.getName();
+			String eltContent = reader.getElementText();
+			// check if property is expected
+			String localPart = eltName.getLocalPart();
+			if (propDesc.containsKey(localPart)) {
+				PropertyDescription description = propDesc.get(localPart);
+
+				AbstractField a = instanciateSimple(
+						description.propertyType.propertyType(), 
+						metadata, 
+						eltName.getPrefix(),
+						localPart,
+						eltContent);
+
+				property.addProperty(a);
+			} else {
+				// expect only defined properties are accepted
+				// XXX : really the good choice ? 
+				// XXX : should we create text properties for unknown types ?
+				throw new XmpParsingException(
+						"Unknown property name for a job element : "
+								+ eltName.getLocalPart());
+			}
+			elmtType = reader.nextTag();
+		}
+		container.addProperty(property);
+
+	}
+
+
+
+
+	private AbstractSimpleProperty instanciateSimple (
+			String type, 
+			XMPMetadata metadata, 
+			String prefix, 
+			String propertyName,
+			String valueAsString) 
+					throws XmpParsingException {
+		TypeDescription description = TypeMapping.getTypeDescription(type);
+		Object value = null;
+		switch (description.getBasic()) {
+		case Boolean : 
+			value =  Boolean.parseBoolean(valueAsString);
+			break;
+		case Date :
+			try {
+				value = DateConverter.toCalendar(valueAsString);
+			} catch (IOException e) {
+				throw new XmpParsingException("Failed to parse date property",e);
+			} 
+			break;
+		case Integer :
+			try {
+				value = Integer.parseInt(valueAsString);
+			} catch (NumberFormatException e) {
+				throw new XmpParsingException("Failed to parse integer property",e);
+			} 
+			break;
+		case Real :
+			try {
+				value = Float.parseFloat(valueAsString);
+			} catch (NumberFormatException e) {
+				throw new XmpParsingException("Failed to parse real type property",e);
+			} 
+			break;
+		case Text :
+			value = valueAsString;
+		}
+
+		return TypeMapping.instanciateSimpleProperty(metadata, null, prefix, propertyName, value, type);
+	}
+
+
+
+	protected class PropertyDescription {
+
+//		private String fieldName;
+//
+		private String propertyName;
 
+		private PropertyType propertyType;
 
-    protected XMPDocumentBuilder builder = null;
+	}
 
-    public StructuredPropertyParser (XMPDocumentBuilder builder) {
-        this.builder = builder;
-    };
 
-    public abstract void parse(XMPMetadata metadata, QName altName,
-            ComplexPropertyContainer container)
-    throws XmpUnexpectedTypeException, XmpParsingException,
-    XMLStreamException, XmpUnknownPropertyTypeException,
-    XmpPropertyFormatException;
 
 }

Modified: pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMLPropertiesDescriptionManager.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMLPropertiesDescriptionManager.java?rev=1366609&r1=1366608&r2=1366609&view=diff
==============================================================================
--- pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMLPropertiesDescriptionManager.java (original)
+++ pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMLPropertiesDescriptionManager.java Sat Jul 28 08:36:32 2012
@@ -46,8 +46,9 @@ import com.thoughtworks.xstream.io.xml.D
  */
 public class XMLPropertiesDescriptionManager {
 
-	protected List<PropertyDescription> propDescs;
-	protected XStream xstream;
+	private List<PropertyDescription> propDescs;
+	
+	private XStream xstream;
 
 	/**
 	 * Create new XMLPropertiesDescriptionManager

Modified: pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMLValueTypeDescriptionManager.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMLValueTypeDescriptionManager.java?rev=1366609&r1=1366608&r2=1366609&view=diff
==============================================================================
--- pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMLValueTypeDescriptionManager.java (original)
+++ pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMLValueTypeDescriptionManager.java Sat Jul 28 08:36:32 2012
@@ -48,8 +48,9 @@ import com.thoughtworks.xstream.io.xml.D
  */
 public class XMLValueTypeDescriptionManager {
 
-	protected List<ValueTypeDescription> vTypes;
-	protected XStream xstream;
+	private List<ValueTypeDescription> vTypes;
+	
+	private XStream xstream;
 
 	/**
 	 * Create a new XMLValueTypeDescriptionManager