You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2014/10/12 15:35:35 UTC

svn commit: r1631175 - in /pdfbox/trunk/xmpbox: pom.xml src/main/java/org/apache/xmpbox/xml/DomXmpParser.java

Author: lehmi
Date: Sun Oct 12 13:35:35 2014
New Revision: 1631175

URL: http://svn.apache.org/r1631175
Log:
PDFBOX-2318: avoid NPE when parsing a XMP-file containing an undefined type as proposed by Jeremy Anderson

Modified:
    pdfbox/trunk/xmpbox/pom.xml
    pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java

Modified: pdfbox/trunk/xmpbox/pom.xml
URL: http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/pom.xml?rev=1631175&r1=1631174&r2=1631175&view=diff
==============================================================================
--- pdfbox/trunk/xmpbox/pom.xml (original)
+++ pdfbox/trunk/xmpbox/pom.xml Sun Oct 12 13:35:35 2014
@@ -42,6 +42,10 @@
 			<artifactId>commons-io</artifactId>
 			<scope>test</scope>
 		</dependency>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+        </dependency>
 	</dependencies>
 
 	<build>

Modified: pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java?rev=1631175&r1=1631174&r2=1631175&view=diff
==============================================================================
--- pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java (original)
+++ pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java Sun Oct 12 13:35:35 2014
@@ -37,6 +37,8 @@ import javax.xml.parsers.DocumentBuilder
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.xmpbox.XMPMetadata;
 import org.apache.xmpbox.XmpConstants;
 import org.apache.xmpbox.schema.XMPSchema;
@@ -68,6 +70,12 @@ import org.xml.sax.SAXException;
 public class DomXmpParser
 {
 
+    /**
+     * Log instance.
+     */
+    private static final Log LOG = LogFactory.getLog(DomXmpParser.class);
+
+
     private DocumentBuilder dBuilder;
 
     private NamespaceFinder nsFinder;
@@ -230,19 +238,37 @@ public class DomXmpParser
                 {
                     String namespace = attr.getNamespaceURI();
                     XMPSchema schema = xmp.getSchema(namespace);
-                    if (schema == null)
+                    if (schema == null && tm.getSchemaFactory(namespace) != null)
                     {
                         schema = tm.getSchemaFactory(namespace).createXMPSchema(xmp, attr.getPrefix());
                         loadAttributes(schema, description);
                     }
-                    ComplexPropertyContainer container = schema.getContainer();
-                    PropertyType type = checkPropertyDefinition(xmp,
-                            new QName(attr.getNamespaceURI(), attr.getLocalName()));
-                    AbstractSimpleProperty sp = tm.instanciateSimpleProperty(namespace, schema.getPrefix(),
-                            attr.getLocalName(), attr.getValue(), type.type());
-                    container.addProperty(sp);
+                    // Only process when a schema was successfully found
+                    if( schema != null )
+                    {
+                        ComplexPropertyContainer container = schema.getContainer();
+                        PropertyType type = checkPropertyDefinition(xmp,
+                                new QName(attr.getNamespaceURI(), attr.getLocalName()));
+                        
+                        //Default to text if no type is found
+                        if( type == null) 
+                        {
+                            type = TypeMapping.createPropertyType(Types.Text, Cardinality.Simple);
+                        }
+                                           
+                        try
+                        {
+                            AbstractSimpleProperty sp = tm.instanciateSimpleProperty(namespace, schema.getPrefix(),
+                                    attr.getLocalName(), attr.getValue(), type.type());
+                            container.addProperty(sp);
+                        }
+                        catch( IllegalArgumentException exception)
+                        {
+                            //Swallow, and continue adding additional properties
+                            LOG.warn("Unable to add property: "+ attr.getLocalName() + " value: "+attr.getValue(),exception);
+                        }
+                    }
                 }
-
             }
             // parse children elements as properties
             for (Element property : properties)