Author: leleueri
Date: Sun Sep  4 17:11:38 2011
New Revision: 1165078

URL: http://svn.apache.org/viewvc?rev=1165078&view=rev
Log:
[PDFBOX-1102] Attributes management : Detect XMP properties defined as XMP 
attributes.
When a XMP is parsed, if an attribute has the same name as a property, the 
attribute is set as schema property.

Modified:
    
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java

Modified: 
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java?rev=1165078&r1=1165077&r2=1165078&view=diff
==============================================================================
--- 
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java
 (original)
+++ 
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java
 Sun Sep  4 17:11:38 2011
@@ -67,7 +67,7 @@ public class XMPDocumentBuilder {
        protected NSMapping nsMap;
 
        protected ThreadLocal<XMLStreamReader> reader = new 
ThreadLocal<XMLStreamReader>();
-       
+
        protected List<XMPDocumentPreprocessor> preprocessors = new 
ArrayList<XMPDocumentPreprocessor>();
 
        /**
@@ -106,9 +106,9 @@ public class XMPDocumentBuilder {
         */
 
        public XMPMetadata parse(byte[] xmp) throws XmpParsingException,
-                       XmpSchemaException, XmpUnknownValueTypeException,
-                       XmpExpectedRdfAboutAttribute, XmpXpacketEndException,
-                       BadFieldValueException {
+       XmpSchemaException, XmpUnknownValueTypeException,
+       XmpExpectedRdfAboutAttribute, XmpXpacketEndException,
+       BadFieldValueException {
 
                if (!(this instanceof XMPDocumentPreprocessor)) {
                        for (XMPDocumentPreprocessor processor : preprocessors) 
{
@@ -124,17 +124,17 @@ public class XMPDocumentBuilder {
 
                        // expect xpacket processing instruction
                        expectNext(XMLStreamReader.PROCESSING_INSTRUCTION,
-                       "Did not find initial xpacket processing instruction");
+                                       "Did not find initial xpacket 
processing instruction");
                        XMPMetadata metadata = 
parseInitialXpacket(reader.get().getPIData());
 
                        // expect x:xmpmeta
                        expectNextTag(XMLStreamReader.START_ELEMENT,
-                       "Did not find initial x:xmpmeta");
+                                       "Did not find initial x:xmpmeta");
                        expectName("adobe:ns:meta/", "xmpmeta");
 
                        // expect rdf:RDF
                        expectNextTag(XMLStreamReader.START_ELEMENT,
-                       "Did not find initial rdf:RDF");
+                                       "Did not find initial rdf:RDF");
                        
expectName("http://www.w3.org/1999/02/22-rdf-syntax-ns#";, "RDF");
 
                        
nsMap.resetComplexBasicTypesDeclarationInEntireXMPLevel();
@@ -159,17 +159,17 @@ public class XMPDocumentBuilder {
                        // all description are finished
                        // expect end of rdf:RDF
                        expectType(XMLStreamReader.END_ELEMENT,
-                       "Expected end of descriptions");
+                                       "Expected end of descriptions");
                        
expectName("http://www.w3.org/1999/02/22-rdf-syntax-ns#";, "RDF");
 
                        // expect ending xmpmeta
                        expectNextTag(XMLStreamReader.END_ELEMENT,
-                       "Did not find initial x:xmpmeta");
+                                       "Did not find initial x:xmpmeta");
                        expectName("adobe:ns:meta/", "xmpmeta");
 
                        // expect final processing instruction
                        expectNext(XMLStreamReader.PROCESSING_INSTRUCTION,
-                       "Did not find final xpacket processing instruction");
+                                       "Did not find final xpacket processing 
instruction");
                        // treats xpacket end
                        if (!reader.get().getPITarget().equals("xpacket")) {
                                throw new XmpXpacketEndException("Excepted PI 
xpacket");
@@ -182,12 +182,12 @@ public class XMPDocumentBuilder {
                                // check value (5 for end='X')
                                if (xpackData.charAt(5)!='r' && 
xpackData.charAt(5)!='w') {
                                        throw new XmpXpacketEndException(
-                                       "Excepted xpacket 'end' attribute with 
value 'r' or 'w' ");
+                                                       "Excepted xpacket 'end' 
attribute with value 'r' or 'w' ");
                                }
                        } else {
                                // should find end='r/w'
                                throw new XmpXpacketEndException(
-                               "Excepted xpacket 'end' attribute (must be 
present and placed in first)");
+                                               "Excepted xpacket 'end' 
attribute (must be present and placed in first)");
                        }
 
                        metadata.setEndXPacket(xpackData);
@@ -226,10 +226,10 @@ public class XMPDocumentBuilder {
         *             Extension schema
         */
        public XMPMetadata parse(InputStream input) throws XmpParsingException,
-                       XmpSchemaException, XmpUnknownValueTypeException,
-                       XmpExpectedRdfAboutAttribute, XmpXpacketEndException,
-                       BadFieldValueException {
-               
+       XmpSchemaException, XmpUnknownValueTypeException,
+       XmpExpectedRdfAboutAttribute, XmpXpacketEndException,
+       BadFieldValueException {
+
                byte[] bos = getStreamAsByteArray(input);
                return parse(bos);
        }
@@ -246,7 +246,7 @@ public class XMPDocumentBuilder {
                }
                return bos.toByteArray();
        }
-       
+
        public void addPreprocessor(XMPDocumentPreprocessor processor) {
                this.preprocessors.add(processor);
        }
@@ -418,9 +418,11 @@ public class XMPDocumentBuilder {
         *            Schema corresponding to the rdf:Description use
         * @throws XmpExpectedRdfAboutAttribute
         *             When rdf:Description not contains rdf:about attribute
+        * @throws XmpUnexpectedTypeException if the attribute is known 
+        * as an expected property but the property type isn't a Simple type.
         */
-       protected final void treatDescriptionAttributes(XMPMetadata metadata,
-                       XMPSchema schema) throws XmpExpectedRdfAboutAttribute {
+       protected final void treatDescriptionAttributes(XMPMetadata metadata, 
XMPSchema schema) 
+       throws XmpExpectedRdfAboutAttribute, XmpUnexpectedTypeException {
                int cptAtt = reader.get().getAttributeCount();
                if (cptAtt < 1) {
                        System.out.println(reader.get().getLocalName());
@@ -448,10 +450,16 @@ public class XMPDocumentBuilder {
                                        }
                                        rdfAboutFound = true;
                                }
-                               schema.setAttribute(new Attribute(null, 
reader.get()
+
+                               Attribute attr = new Attribute(null, 
reader.get()
                                                .getAttributePrefix(i), 
reader.get()
                                                .getAttributeLocalName(i), 
reader.get()
-                                               .getAttributeValue(i)));
+                                               .getAttributeValue(i));
+
+                               if (!addAttributeAsProperty(metadata, schema, 
attr)) {
+                                       // attribute isn't a property, so add 
the attribute
+                                       schema.setAttribute(attr);      
+                               }
 
                                i++;
                        }
@@ -464,6 +472,46 @@ public class XMPDocumentBuilder {
        }
 
        /**
+        * If the attribute has same the name as an expected property of the 
Schema, then the property is created using the attributes fields.
+        * 
+        * @param metadata Metadata to attach new elements
+        * @param schema Schema corresponding to the rdf:Description use
+        * @param attr the attribute used to create the property
+        * @return true if the attribute has been converted into Property
+        */
+       private boolean addAttributeAsProperty(XMPMetadata metadata, XMPSchema 
schema, Attribute attr) {
+               boolean added = false;
+               String schemaNamespace = schema.getNamespaceValue();
+               String prefix = attr.getPrefix() != null ? attr.getPrefix() : 
schema.getPrefix();
+               String type = 
this.nsMap.getSpecifiedPropertyType(schemaNamespace, new QName(schemaNamespace, 
attr.getLocalName(), prefix));
+               if (type != null) {
+                       if (type.equals("Text")) {
+                               schema.getContent().addProperty(new 
TextType(metadata, prefix, attr.getLocalName(), attr.getValue()));
+                               added = true;
+                       } else if (type.equals("Integer")) {
+                               schema.getContent().addProperty(new 
IntegerType(metadata, prefix, attr.getLocalName(), attr.getValue()));
+                               added = true;
+                       } else if (type.equals("Boolean")) {
+                               schema.getContent().addProperty(new 
BooleanType(metadata, prefix, attr.getLocalName(), attr.getValue()));
+                               added = true;
+                       } else if (type.equals("Real")) {
+                               schema.getContent().addProperty(new 
RealType(metadata, prefix, attr.getLocalName(), attr.getValue()));
+                               added = true;
+                       } else if (type.equals("Date")) {
+                               schema.getContent().addProperty(new 
DateType(metadata, prefix, attr.getLocalName(), attr.getValue()));
+                               added = true;
+                       } else if (type.equals("URI")) {
+                               schema.getContent().addProperty(new 
TextType(metadata, prefix, attr.getLocalName(), attr.getValue()));
+                               added = true;
+                       } else if (type.equals("URL")) {
+                               schema.getContent().addProperty(new 
TextType(metadata, prefix, attr.getLocalName(), attr.getValue()));
+                               added = true;
+                       }
+               }
+               return added;
+       }
+       
+       /**
         * Treat each rdf:Description (which must represent a schema), 
instanciate
         * class representation of this schema and add it to metadata
         * 
@@ -509,9 +557,9 @@ public class XMPDocumentBuilder {
                                if (namespaces
                                                
.containsValue(PDFAExtensionSchema.PDFAEXTENSIONURI)
                                                && namespaces
-                                                               
.containsValue(PDFAExtensionSchema.PDFAPROPERTYURI)
+                                               
.containsValue(PDFAExtensionSchema.PDFAPROPERTYURI)
                                                && namespaces
-                                                               
.containsValue(PDFAExtensionSchema.PDFASCHEMAURI)) {
+                                               
.containsValue(PDFAExtensionSchema.PDFASCHEMAURI)) {
                                        PDFAExtensionSchema schema = metadata
                                                        
.createAndAddPDFAExtensionSchemaWithNS(namespaces);
                                        treatDescriptionAttributes(metadata, 
schema);
@@ -910,7 +958,7 @@ public class XMPDocumentBuilder {
                if ((uns == null) || "".equals(uns)) {
                        throw new XmpUnknownPropertyException(
                                        "Cannot find a description for '" + 
prop.getLocalPart()
-                                                       + "' property");
+                                       + "' property");
                } else {
                        throw new XmpUnknownSchemaException(
                                        "Cannot find a definition for the 
namespace " + uns + " ");
@@ -941,8 +989,8 @@ public class XMPDocumentBuilder {
        protected void parseXmpSimpleProperty(XMPMetadata metadata,
                        QName propertyName, XmpPropertyType stype,
                        ComplexPropertyContainer container)
-                       throws XmpUnknownPropertyTypeException, 
XmpPropertyFormatException,
-                       XMLStreamException {
+                                       throws XmpUnknownPropertyTypeException, 
XmpPropertyFormatException,
+                                       XMLStreamException {
                try {
                        AbstractSimpleProperty prop = null;
                        ArrayList<Attribute> attributes = new 
ArrayList<Attribute>();
@@ -956,23 +1004,23 @@ public class XMPDocumentBuilder {
                        if (stype == XmpPropertyType.Text) {
                                prop = new TextType(metadata, 
propertyName.getPrefix(),
                                                propertyName.getLocalPart(), 
reader.get()
-                                                               
.getElementText());
+                                               .getElementText());
                        } else if (stype == XmpPropertyType.Integer) {
                                prop = new IntegerType(metadata, 
propertyName.getPrefix(),
                                                propertyName.getLocalPart(), 
reader.get()
-                                                               
.getElementText());
+                                               .getElementText());
                        } else if (stype == XmpPropertyType.Date) {
                                prop = new DateType(metadata, 
propertyName.getPrefix(),
                                                propertyName.getLocalPart(), 
reader.get()
-                                                               
.getElementText());
+                                               .getElementText());
                        } else if (stype == XmpPropertyType.Boolean) {
                                prop = new BooleanType(metadata, 
propertyName.getPrefix(),
                                                propertyName.getLocalPart(), 
reader.get()
-                                                               
.getElementText());
+                                               .getElementText());
                        } else if (stype == XmpPropertyType.Real) {
                                prop = new RealType(metadata, 
propertyName.getPrefix(),
                                                propertyName.getLocalPart(), 
reader.get()
-                                                               
.getElementText());
+                                               .getElementText());
                        }
                        if (prop != null) {
                                container.addProperty(prop);
@@ -1017,9 +1065,9 @@ public class XMPDocumentBuilder {
         */
        protected void parseBagProperty(XMPMetadata metadata, QName bagName,
                        XmpPropertyType stype, ComplexPropertyContainer 
container)
-                       throws XmpUnexpectedTypeException, XmpParsingException,
-                       XMLStreamException, XmpUnknownPropertyTypeException,
-                       XmpPropertyFormatException {
+                                       throws XmpUnexpectedTypeException, 
XmpParsingException,
+                                       XMLStreamException, 
XmpUnknownPropertyTypeException,
+                                       XmpPropertyFormatException {
                ComplexProperty bag = new ComplexProperty(metadata,
                                bagName.getPrefix(), bagName.getLocalPart(),
                                ComplexProperty.UNORDERED_ARRAY);
@@ -1067,9 +1115,9 @@ public class XMPDocumentBuilder {
         */
        protected void parseSeqProperty(XMPMetadata metadata, QName seqName,
                        XmpPropertyType stype, ComplexPropertyContainer 
container)
-                       throws XmpUnexpectedTypeException, XmpParsingException,
-                       XMLStreamException, XmpUnknownPropertyTypeException,
-                       XmpPropertyFormatException {
+                                       throws XmpUnexpectedTypeException, 
XmpParsingException,
+                                       XMLStreamException, 
XmpUnknownPropertyTypeException,
+                                       XmpPropertyFormatException {
                ComplexProperty seq = new ComplexProperty(metadata,
                                seqName.getPrefix(), seqName.getLocalPart(),
                                ComplexProperty.ORDERED_ARRAY);
@@ -1117,9 +1165,9 @@ public class XMPDocumentBuilder {
         */
        protected void parseAltProperty(XMPMetadata metadata, QName altName,
                        XmpPropertyType stype, ComplexPropertyContainer 
container)
-                       throws XmpUnexpectedTypeException, XmpParsingException,
-                       XMLStreamException, XmpUnknownPropertyTypeException,
-                       XmpPropertyFormatException {
+                                       throws XmpUnexpectedTypeException, 
XmpParsingException,
+                                       XMLStreamException, 
XmpUnknownPropertyTypeException,
+                                       XmpPropertyFormatException {
                ComplexProperty alt = new ComplexProperty(metadata,
                                altName.getPrefix(), altName.getLocalPart(),
                                ComplexProperty.ALTERNATIVE_ARRAY);
@@ -1165,9 +1213,9 @@ public class XMPDocumentBuilder {
         */
        private boolean createAndAddPropertyToContainer(XMPMetadata metadata,
                        String type, ComplexPropertyContainer container)
-                       throws XmpParsingException, XmpUnexpectedTypeException,
-                       XmpUnknownPropertyTypeException, 
XmpPropertyFormatException,
-                       XMLStreamException {
+                                       throws XmpParsingException, 
XmpUnexpectedTypeException,
+                                       XmpUnknownPropertyTypeException, 
XmpPropertyFormatException,
+                                       XMLStreamException {
                if (type.equals("Text")) {
                        parseXmpSimpleProperty(metadata, reader.get().getName(),
                                        XmpPropertyType.Text, container);
@@ -1315,7 +1363,7 @@ public class XMPDocumentBuilder {
                }
                String type = getPropertyDeclarationInNamespaces(schema, 
propertyName);
                if (type.equals("Unmanaged")) {
-                   // do not parse the property, no validation, no 
reserialization
+                       // do not parse the property, no validation, no 
reserialization
                        boolean cont = true;
                        while (cont) {
                                int t = reader.get().next();
@@ -1326,8 +1374,9 @@ public class XMPDocumentBuilder {
                                }
                        }
                } else if (type.equals("Text")) {
-                       parseXmpSimpleProperty(metadata, propertyName,
+                       parseXmpSimpleProperty(metadata, propertyName, 
                                        XmpPropertyType.Text, 
schema.getContent());
+
                } else if (type.equals("Integer")) {
                        parseXmpSimpleProperty(metadata, propertyName,
                                        XmpPropertyType.Integer, 
schema.getContent());
@@ -1410,9 +1459,9 @@ public class XMPDocumentBuilder {
         */
        private void parseAltThumbnailProperty(XMPMetadata metadata, QName 
altName,
                        ComplexPropertyContainer container)
-                       throws XmpUnexpectedTypeException, XmpParsingException,
-                       XMLStreamException, XmpUnknownPropertyTypeException,
-                       XmpPropertyFormatException {
+                                       throws XmpUnexpectedTypeException, 
XmpParsingException,
+                                       XMLStreamException, 
XmpUnknownPropertyTypeException,
+                                       XmpPropertyFormatException {
                ComplexProperty alt = new ComplexProperty(metadata,
                                altName.getPrefix(), altName.getLocalPart(),
                                ComplexProperty.ALTERNATIVE_ARRAY);
@@ -1456,9 +1505,9 @@ public class XMPDocumentBuilder {
         */
        private void parseThumbnailProperty(XMPMetadata metadata, QName altName,
                        ComplexPropertyContainer container)
-                       throws XmpUnexpectedTypeException, XmpParsingException,
-                       XMLStreamException, XmpUnknownPropertyTypeException,
-                       XmpPropertyFormatException {
+                                       throws XmpUnexpectedTypeException, 
XmpParsingException,
+                                       XMLStreamException, 
XmpUnknownPropertyTypeException,
+                                       XmpPropertyFormatException {
                expectCurrentLocalName("li");
                ThumbnailType thumbnail = new ThumbnailType(metadata, altName
                                .getPrefix(), altName.getLocalPart());


Reply via email to