Author: gbailleul
Date: Thu Aug  2 17:19:52 2012
New Revision: 1368607

URL: http://svn.apache.org/viewvc?rev=1368607&view=rev
Log:
PDFBOX-1376: structured types containing arrays and structured types are now 
parsed by xmpbox

Modified:
    
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/StructuredPropertyParser.java
    
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.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/TypeDescription.java

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=1368607&r1=1368606&r2=1368607&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
 Thu Aug  2 17:19:52 2012
@@ -29,6 +29,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
@@ -141,33 +142,100 @@ public class StructuredPropertyParser {
 
                QName eltName;
                String structuredEndName = skipDescription?"li":"Description";
-
                while (!((elmtType == XMLStreamReader.END_ELEMENT) && 
reader.getName().getLocalPart().equals(structuredEndName))) {
                        // 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);
+                       // prepare the text
+                       elmtType = reader.next();
+                       // TODO why not a space ??
+                       if (elmtType == XMLStreamConstants.CHARACTERS && 
reader.getText().trim().length()>0) {
+                               // text content
+                               StringBuilder content = new StringBuilder();
+                               while(elmtType != 
XMLStreamConstants.END_ELEMENT ) {
+                                       if(elmtType == 
XMLStreamConstants.CHARACTERS
+                                                       || elmtType == 
XMLStreamConstants.CDATA
+                                                       || elmtType == 
XMLStreamConstants.SPACE
+                                                       || elmtType == 
XMLStreamConstants.ENTITY_REFERENCE) {
+                                               
content.append(reader.getText());
+                                       } else if(elmtType == 
XMLStreamConstants.PROCESSING_INSTRUCTION
+                                                       || elmtType == 
XMLStreamConstants.COMMENT) {
+                                               // skipping
+                                       } else if(elmtType == 
XMLStreamConstants.START_ELEMENT) {
+                                               throw new XMLStreamException(
+                                                               "element text 
content may not contain START_ELEMENT", reader.getLocation());
+                                       } else {
+                                               throw new XMLStreamException(
+                                                               "Unexpected 
event type "+elmtType, reader.getLocation());
+                                       }
+                                       elmtType = reader.next();
+                               }
+
+
+                               String eltContent = content.toString();
+                               // 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();
 
-                               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());
+                               if 
(reader.getEventType()!=XMLStreamConstants.START_ELEMENT && 
reader.getEventType()!=XMLStreamConstants.END_ELEMENT) {
+                                       reader.nextTag();
+                               }
+                               if 
(reader.getEventType()==XMLStreamConstants.START_ELEMENT) {
+                                       TypeDescription td = 
TypeMapping.getStructuredTypeName(eltName.getNamespaceURI());
+                                       String ptype = 
td.getProperties().getPropertyType(eltName.getLocalPart());
+                                       if 
(TypeMapping.isStructuredType(ptype)) {
+                                               TypeDescription tclass = 
TypeMapping.getTypeDescription(ptype);
+                                               Class<? extends 
AbstractStructuredType> tcn = (Class<? extends 
AbstractStructuredType>)tclass.getTypeClass();
+                                               StructuredPropertyParser sp = 
new StructuredPropertyParser(builder, tcn);
+                                               sp.parse(metadata, 
reader.getName(), property.getContainer());
+                                               reader.nextTag();
+                                               
+                                       } else if 
(TypeMapping.getArrayType(ptype)!=null) {
+                                               int pos = ptype.indexOf(' ');
+                                               String arrayType = 
TypeMapping.getArrayType(ptype);
+                                               String typeInArray = 
ptype.substring(pos+1);
+
+                                               TypeDescription tclass = 
TypeMapping.getTypeDescription(typeInArray);
+                                               Class<? extends 
AbstractStructuredType> tcn = (Class<? extends 
AbstractStructuredType>)tclass.getTypeClass();
+                                               // array element starting
+                                               
builder.expectNextSpecificTag(XMLStreamConstants.START_ELEMENT, arrayType, 
"Should be starting a ",arrayType);
+                                               // array elements
+                                               while 
(reader.getEventType()==XMLStreamConstants.START_ELEMENT && 
reader.getName().getLocalPart().equals("li")) {
+                                                       
StructuredPropertyParser sp = new StructuredPropertyParser(builder, tcn);
+                                                       sp.parse(metadata, 
reader.getName(), property.getContainer());
+                                                       reader.nextTag();
+                                               }
+                                               // array element ending
+                                               
builder.expectNextSpecificTag(XMLStreamConstants.END_ELEMENT, arrayType, 
"Should be ending a ",arrayType);
+                                       }
+                                       
+                                       
+                                       elmtType = reader.nextTag();
+                               } else {
+                                       // end element
+//                                     reader.nextTag();
+                                       elmtType = reader.getEventType();
+                               }
                        }
-                       elmtType = reader.nextTag();
                }
                if (!skipDescription) {
                        // closing rdf:Description element
@@ -225,8 +293,6 @@ public class StructuredPropertyParser {
 
        protected class PropertyDescription {
 
-               //              private String fieldName;
-               //
                private String propertyName;
 
                private PropertyType propertyType;

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=1368607&r1=1368606&r2=1368607&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
 Thu Aug  2 17:19:52 2012
@@ -606,7 +606,7 @@ public class XMPDocumentBuilder {
         * @throws XMLStreamException
         *             When error during reading the rest of xmp stream
         */
-       private void expectNextSpecificTag(int type, String localNameExpected,
+       protected void expectNextSpecificTag(int type, String localNameExpected,
                        String ... message) throws XmpUnexpectedTypeException,
                        XmpParsingException, XMLStreamException {
                expectNextTag(type, message);

Modified: 
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/AbstractStructuredType.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/AbstractStructuredType.java?rev=1368607&r1=1368606&r2=1368607&view=diff
==============================================================================
--- 
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/AbstractStructuredType.java
 (original)
+++ 
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/AbstractStructuredType.java
 Thu Aug  2 17:19:52 2012
@@ -103,4 +103,8 @@ public abstract class AbstractStructured
                }
        }
 
+       public ComplexPropertyContainer getContainer() {
+               return container;
+       }
+
 }

Modified: 
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeDescription.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeDescription.java?rev=1368607&r1=1368606&r2=1368607&view=diff
==============================================================================
--- 
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeDescription.java
 (original)
+++ 
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeDescription.java
 Thu Aug  2 17:19:52 2012
@@ -21,6 +21,8 @@
 
 package org.apache.padaf.xmpbox.type;
 
+import org.apache.padaf.xmpbox.parser.PropMapping;
+
 
 public class TypeDescription {
 
@@ -31,6 +33,9 @@ public class TypeDescription {
        private BasicType basic;
        
        private Class<? extends AbstractField> clz;
+       
+       // TODO PropMapping should be in package Type
+       private PropMapping properties = null;
 
        public TypeDescription(String type, BasicType basic,Class<? extends 
AbstractField> clz) {
                super();
@@ -61,8 +66,12 @@ public class TypeDescription {
                return basic;
        }
 
-       
-       
-       
+       public PropMapping getProperties() {
+               return properties;
+       }
+
+       protected void setProperties(PropMapping properties) {
+               this.properties = properties;
+       }
        
 }


Reply via email to