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;
+ }
}