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/08/30 23:58:28 UTC
svn commit: r1379181 - in
/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox:
XMPMetadata.java parser/XMPDocumentBuilder.java schema/NSMapping.java
schema/SchemaMapping.java type/TypeMapping.java
Author: gbailleul
Date: Thu Aug 30 21:58:28 2012
New Revision: 1379181
URL: http://svn.apache.org/viewvc?rev=1379181&view=rev
Log:
PDFBOX-1343: reduced complexity in type handling helpers
Removed:
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/NSMapping.java
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/schema/SchemaMapping.java
Modified:
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/XMPMetadata.java
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java
pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeMapping.java
Modified: pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/XMPMetadata.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/XMPMetadata.java?rev=1379181&r1=1379180&r2=1379181&view=diff
==============================================================================
--- pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/XMPMetadata.java (original)
+++ pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/XMPMetadata.java Thu Aug 30 21:58:28 2012
@@ -28,11 +28,9 @@ import java.util.Map;
import org.apache.padaf.xmpbox.parser.CreateXMPMetadataException;
import org.apache.padaf.xmpbox.schema.AdobePDFSchema;
import org.apache.padaf.xmpbox.schema.DublinCoreSchema;
-import org.apache.padaf.xmpbox.schema.NSMapping;
import org.apache.padaf.xmpbox.schema.PDFAExtensionSchema;
import org.apache.padaf.xmpbox.schema.PDFAIdentificationSchema;
import org.apache.padaf.xmpbox.schema.PhotoshopSchema;
-import org.apache.padaf.xmpbox.schema.SchemaMapping;
import org.apache.padaf.xmpbox.schema.XMPBasicJobTicketSchema;
import org.apache.padaf.xmpbox.schema.XMPBasicSchema;
import org.apache.padaf.xmpbox.schema.XMPMediaManagementSchema;
@@ -66,20 +64,14 @@ public class XMPMetadata {
private List<XMPSchema> schemas;
-
private TypeMapping typeMapping;
- private NSMapping nsMapping;
-
- private SchemaMapping schemaMapping;
-
/**
* Contructor of an empty default XMPMetaData
*
* @throws CreateXMPMetadataException
* If DOM Document associated could not be created
*/
- // TODO GBL GBA make protected
protected XMPMetadata() {
this (
XmpConstants.DEFAULT_XPACKET_BEGIN,
@@ -108,8 +100,6 @@ public class XMPMetadata {
String xpacketBytes, String xpacketEncoding) {
this.schemas = new ArrayList<XMPSchema>();
this.typeMapping = new TypeMapping(this);
- this.nsMapping = new NSMapping(this);
- this.schemaMapping = new SchemaMapping(this);
this.xpacketBegin = xpacketBegin;
this.xpacketId = xpacketId;
@@ -130,18 +120,6 @@ public class XMPMetadata {
return this.typeMapping;
}
- public NSMapping getNsMapping () {
- return this.nsMapping;
- }
-
- public SchemaMapping getSchemaMapping () {
- return this.schemaMapping;
- }
-
- public void setSchemaMapping (SchemaMapping sm) {
- this.schemaMapping = sm;
- }
-
/**
* Get xpacketBytes
*
Modified: pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java?rev=1379181&r1=1379180&r2=1379181&view=diff
==============================================================================
--- pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java (original)
+++ pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/parser/XMPDocumentBuilder.java Thu Aug 30 21:58:28 2012
@@ -40,7 +40,6 @@ import javax.xml.stream.XMLStreamReader;
import org.apache.padaf.xmpbox.XMPMetadata;
import org.apache.padaf.xmpbox.XmpConstants;
-import org.apache.padaf.xmpbox.schema.NSMapping;
import org.apache.padaf.xmpbox.schema.PDFAExtensionSchema;
import org.apache.padaf.xmpbox.schema.XMPSchema;
import org.apache.padaf.xmpbox.schema.XMPSchemaFactory;
@@ -153,20 +152,6 @@ public class XMPDocumentBuilder {
"Did not find initial rdf:RDF");
expectName(XmpConstants.RDF_NAMESPACE, "RDF");
- // TODO GBL GBA maybe not remove
- metadata.getNsMapping().resetComplexBasicTypesDeclarationInEntireXMPLevel();
- // add all namespaces which could declare nsURI of a basicValueType
- // all others declarations are ignored
- int nsCount = reader.get().getNamespaceCount();
- // TODO MUTUALIZE namespace list loading
- for (int i = 0; i < nsCount; i++) {
- if (metadata.getTypeMapping().isStructuredTypeNamespace(reader.get().getNamespaceURI(i))) {
- metadata.getNsMapping().setComplexBasicTypesDeclarationForLevelXMP(
- reader.get().getNamespaceURI(i),
- reader.get().getNamespacePrefix(i));
- }
- }
-
// now work on each rdf:Description
int type = reader.get().nextTag();
while (type == XMLStreamReader.START_ELEMENT) {
@@ -224,12 +209,12 @@ public class XMPDocumentBuilder {
String prefix = st.getPrefix();
ArrayProperty properties = st.getProperty();
ArrayProperty valueTypes = st.getValueType();
- XMPSchemaFactory xsf = meta.getSchemaMapping().getSchemaFactory(namespaceUri);
+ XMPSchemaFactory xsf = meta.getTypeMapping().getSchemaFactory(namespaceUri);
// retrieve namespaces
if (xsf==null) {
// create namespace with no field
- meta.getSchemaMapping().addNewNameSpace(namespaceUri,prefix);
- xsf = meta.getSchemaMapping().getSchemaFactory(namespaceUri);
+ meta.getTypeMapping().addNewNameSpace(namespaceUri,prefix);
+ xsf = meta.getTypeMapping().getSchemaFactory(namespaceUri);
}
// populate value type
if (valueTypes!=null) {
@@ -598,8 +583,8 @@ public class XMPDocumentBuilder {
private boolean addAttributeAsProperty(XMPMetadata metadata, XMPSchema schema, Attribute attr) {
boolean added = false;
String schemaNamespace = schema.getNamespace();
- String prefix = /*attr.getPrefix() != null ? attr.getPrefix() :*/ schema.getPrefix();
- String type = metadata.getNsMapping().getSpecifiedPropertyType(schemaNamespace, new QName(schemaNamespace, attr.getLocalName()));
+ String prefix = schema.getPrefix();
+ String type = metadata.getTypeMapping().getSpecifiedPropertyType(schemaNamespace, new QName(schemaNamespace, attr.getLocalName()));
if (type != null) {
AbstractSimpleProperty prop = metadata.getTypeMapping().instanciateSimpleProperty(null, prefix, attr.getLocalName(), attr.getValue(), type);
@@ -634,30 +619,23 @@ public class XMPDocumentBuilder {
throws XmpParsingException, XMLStreamException, XmpSchemaException,
XmpUnknownValueTypeException, XmpExpectedRdfAboutAttribute,
BadFieldValueException {
- NSMapping nsMap = metadata.getNsMapping();
- nsMap.resetComplexBasicTypesDeclarationInSchemaLevel();
+ TypeMapping sm = metadata.getTypeMapping();
int cptNS = reader.get().getNamespaceCount();
HashMap<String, String> namespaces = new HashMap<String, String>();
- // TODO MUTUALIZE namespace list loading
for (int i = 0; i < cptNS; i++) {
namespaces.put(reader.get().getNamespacePrefix(i), reader.get()
.getNamespaceURI(i));
- if (metadata.getTypeMapping().isStructuredTypeNamespace(reader.get().getNamespaceURI(i))) {
- nsMap.setComplexBasicTypesDeclarationForLevelSchema(reader
- .get().getNamespaceURI(i), reader.get()
- .getNamespacePrefix(i));
- }
}
int c = 0;
String namespaceUri = reader.get().getNamespaceURI(c);
String namespacePrefix = reader.get().getNamespacePrefix(c);
c++;
- XMPSchema schema = nsMap.getAssociatedSchemaObject(metadata, namespaceUri, namespacePrefix);
+ XMPSchema schema = sm.getAssociatedSchemaObject(metadata, namespaceUri, namespacePrefix);
while (c<reader.get().getNamespaceCount() && schema==null) {
// try next
namespaceUri = reader.get().getNamespaceURI(c);
namespacePrefix = reader.get().getNamespacePrefix(c);
- schema = nsMap.getAssociatedSchemaObject(metadata, namespaceUri, namespacePrefix);
+ schema = sm.getAssociatedSchemaObject(metadata, namespaceUri, namespacePrefix);
c++;
}
@@ -731,18 +709,18 @@ public class XMPDocumentBuilder {
*/
private String getPropertyDeclarationInNamespaces(XMPSchema schema,
QName prop) throws XmpParsingException {
- NSMapping nsMap = schema.getMetadata().getNsMapping();
+ TypeMapping sm = schema.getMetadata().getTypeMapping();
Iterator<Entry<String, String>> it = schema.getAllNamespacesWithPrefix().entrySet().iterator();
String type;
StringBuilder unknownNS = new StringBuilder();
while (it.hasNext()) {
Entry<String,String> entry = it.next();
String namespace = entry.getKey();
- if (!nsMap.isContainedNamespace(namespace)) {
+ if (!sm.isContainedNamespace(namespace)) {
unknownNS.append(" '").append(namespace).append("' ");
continue;
}
- type = nsMap.getSpecifiedPropertyType(namespace, prop);
+ type = sm.getSpecifiedPropertyType(namespace, prop);
if (type != null) {
return type;
}
@@ -871,7 +849,7 @@ public class XMPDocumentBuilder {
XmpUnexpectedTypeException, XMLStreamException,
XmpUnknownPropertyTypeException {
XMPMetadata metadata = schema.getMetadata();
- NSMapping nsMap = metadata.getNsMapping();
+// NSMapping nsMap = metadata.getNsMapping();
TypeMapping typeMapping = metadata.getTypeMapping();
QName propertyName = reader.get().getName();
if (parsingExtension) {
@@ -882,16 +860,6 @@ public class XMPDocumentBuilder {
return;
}
}
- nsMap.resetComplexBasicTypesDeclarationInPropertyLevel();
- int cptNs = reader.get().getNamespaceCount();
- // TODO MUTUALIZE namespace list loading
- for (int i = 0; i < cptNs; i++) {
- if (typeMapping.isStructuredTypeNamespace(reader.get().getNamespaceURI(i))) {
- nsMap.setComplexBasicTypesDeclarationForLevelSchema(reader
- .get().getNamespaceURI(i), reader.get()
- .getNamespacePrefix(i));
- }
- }
String type = getPropertyDeclarationInNamespaces(schema, propertyName);
// found type, manage it
if (type.equals("Lang Alt")) {
@@ -909,10 +877,6 @@ public class XMPDocumentBuilder {
int pos = type.indexOf(' ');
String arrayType = typeMapping.getArrayType(type);
String typeInArray = type.substring(pos+1);
-// if (typeMapping.is)
-// TypeDescription<AbstractStructuredType> tclass = typeMapping.getTypeDescription(typeInArray);
-// Class<? extends AbstractField> tcn = tclass.getTypeClass();
-
if (typeMapping.isSimpleType(typeInArray)) {
// array of simple
parseSimplePropertyArray(
Modified: pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeMapping.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeMapping.java?rev=1379181&r1=1379180&r2=1379181&view=diff
==============================================================================
--- pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeMapping.java (original)
+++ pdfbox/branches/xmpbox-refactoring/xmpbox/src/main/java/org/apache/padaf/xmpbox/type/TypeMapping.java Thu Aug 30 21:58:28 2012
@@ -27,7 +27,21 @@ import java.util.HashMap;
import java.util.Map;
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.PDFAIdentificationSchema;
+import org.apache.padaf.xmpbox.schema.PhotoshopSchema;
+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.XMPSchema;
+import org.apache.padaf.xmpbox.schema.XMPSchemaFactory;
+import org.apache.padaf.xmpbox.schema.XmpSchemaException;
import org.apache.padaf.xmpbox.type.TypeDescription.BasicType;
public final class TypeMapping {
@@ -48,8 +62,13 @@ public final class TypeMapping {
private Map<String,TypeDescription<AbstractStructuredType>> STRUCTURED_NAMESPACES;
+ private Map<String, String> schemaUriToPrefered;
+
private XMPMetadata metadata;
+ private Map<String, XMPSchemaFactory> schemaMap;
+
+
public TypeMapping(XMPMetadata metadata) {
this.metadata = metadata;
initialize();
@@ -105,6 +124,20 @@ public final class TypeMapping {
addToStructuredMaps(new TypeDescription<AbstractStructuredType>("PDFAProperty",null,PDFAPropertyType.class));
addToStructuredMaps(new TypeDescription<AbstractStructuredType>("PDFAType",null,PDFATypeType.class));
addToStructuredMaps(new TypeDescription<AbstractStructuredType>("PDFASchema",null,PDFASchemaType.class));
+
+ // schema
+ schemaUriToPrefered = new HashMap<String, String>();
+ schemaMap = new HashMap<String, XMPSchemaFactory>();
+ addNameSpace("http://ns.adobe.com/xap/1.0/", XMPBasicSchema.class);
+ addNameSpace(DublinCoreSchema.DCURI, 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);
+
}
private void addToBasicMaps (TypeDescription<AbstractSimpleProperty> td) {
@@ -336,4 +369,88 @@ public final class TypeMapping {
return propMap;
}
+ private void addNameSpace(String ns, Class<? extends XMPSchema> classSchem) {
+ schemaMap.put(ns, new XMPSchemaFactory(ns, classSchem, ReflectHelper.initializePropMapping(ns, classSchem)));
+ try {
+ schemaUriToPrefered.put(ns, classSchem.getField("PREFERED_PREFIX").get(null).toString());
+ } catch (IllegalArgumentException e) {
+ throw new IllegalArgumentException("Failed to init '"+ns+"'", e);
+ } catch (SecurityException e) {
+ throw new IllegalArgumentException("Failed to init '"+ns+"'", e);
+ } catch (IllegalAccessException e) {
+ throw new IllegalArgumentException("Failed to init '"+ns+"'", e);
+ } catch (NoSuchFieldException e) {
+ throw new IllegalArgumentException("Failed to init '"+ns+"'", e);
+ }
+ }
+
+ public void addNewNameSpace(String ns,String prefered) {
+ PropMapping mapping = new PropMapping(ns);
+ schemaMap.put(ns, new XMPSchemaFactory(ns, XMPSchema.class, mapping));
+ schemaUriToPrefered.put(ns, prefered);
+ }
+
+ /**
+ * 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 (schemaMap.containsKey(namespace)) {
+ XMPSchemaFactory factory = schemaMap.get(namespace);
+ return factory.createXMPSchema(metadata, prefix);
+ } else {
+ XMPSchemaFactory factory = getSchemaFactory(namespace);
+ return factory!=null?factory.createXMPSchema(metadata, prefix):null;
+ }
+ }
+
+ public XMPSchemaFactory getSchemaFactory(String namespace) {
+ return schemaMap.get(namespace);
+ }
+
+ /**
+ * 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 = schemaMap.containsKey(namespace);
+ if (!found) {
+ found = isStructuredTypeNamespace(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 =getSchemaFactory(namespace);
+ if (factory!=null) {
+ // found in schema
+ return factory.getPropertyType(prop.getLocalPart());
+ } else {
+ TypeDescription<AbstractStructuredType> td = getStructuredTypeName(prop.getPrefix());
+ return td==null?null:td.getType();
+ }
+ }
+
+
}