You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2025/12/27 16:22:23 UTC

svn commit: r1930895 - in pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox: type xml

Author: tilman
Date: Sat Dec 27 16:22:23 2025
New Revision: 1930895

Log:
PDFBOX-6133: introduce new parameter in getSpecifiedPropertyType for later changes, rename some variables for clarity - no changes in functionality in this commit

Modified:
   pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox/type/TypeMapping.java
   pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java

Modified: pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox/type/TypeMapping.java
==============================================================================
--- pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox/type/TypeMapping.java	Sat Dec 27 16:22:18 2025	(r1930894)
+++ pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox/type/TypeMapping.java	Sat Dec 27 16:22:23 2025	(r1930895)
@@ -315,15 +315,22 @@ public final class TypeMapping
         return isDefinedSchema(namespace) || isStructuredTypeNamespace(namespace) || isDefinedTypeNamespace(namespace);
     }
 
+    @Deprecated
+    public PropertyType getSpecifiedPropertyType(QName qName) throws BadFieldValueException
+    {
+        return getSpecifiedPropertyType(qName, null);
+    }
+
     /**
      * Give type of specified property in specified schema (given by its namespaceURI)
-     * 
-     * @param qName
-     *            the property Qualified Name
+     *
+     * @param qName the property Qualified Name
+     * @param parentTypeName the type name of the parent, or null if not known. This is intended to
+     * help when the field name is in several types, e.g. "Values" in exif.
      * @return Property type declared for namespace specified, null if unknown
-     * @throws org.apache.xmpbox.type.BadFieldValueException if the name was not found.
+     * @throws org.apache.xmpbox.type.BadFieldValueException if the name of a type was not found.
      */
-    public PropertyType getSpecifiedPropertyType(QName qName) throws BadFieldValueException
+    public PropertyType getSpecifiedPropertyType(QName qName, String parentTypeName) throws BadFieldValueException
     {
         XMPSchemaFactory factory = getSchemaFactory(qName.getNamespaceURI());
         if (factory != null)

Modified: pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java
==============================================================================
--- pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java	Sat Dec 27 16:22:18 2025	(r1930894)
+++ pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java	Sat Dec 27 16:22:23 2025	(r1930895)
@@ -264,7 +264,7 @@ public class DomXmpParser
                     throw new XmpParsingException(ErrorType.NoSchema,
                             "This namespace is not from a schema: " + namespace);
                 }
-                PropertyType type = checkPropertyDefinition(xmp, DomHelper.getQName(schemaExtension));
+                PropertyType type = checkPropertyDefinition(xmp, DomHelper.getQName(schemaExtension), null);
                 final XMPSchema schema = tm.getSchemaFactory(namespace).createXMPSchema(xmp, schemaExtension.getPrefix());
                 loadAttributes(schema, description);
                 ComplexPropertyContainer container = schema.getContainer();
@@ -338,7 +338,7 @@ public class DomXmpParser
         {
             ComplexPropertyContainer container = schema.getContainer();
             PropertyType type = checkPropertyDefinition(xmp,
-                    new QName(attr.getNamespaceURI(), attr.getLocalName(), attr.getPrefix()));
+                    new QName(attr.getNamespaceURI(), attr.getLocalName(), attr.getPrefix()), null);
 
             if (type == null)
             {
@@ -395,7 +395,7 @@ public class DomXmpParser
         {
             nsFinder.push(property);
             String namespace = property.getNamespaceURI();
-            PropertyType type = checkPropertyDefinition(xmp, DomHelper.getQName(property));
+            PropertyType type = checkPropertyDefinition(xmp, DomHelper.getQName(property), null);
             // create the container
             if (!tm.isDefinedSchema(namespace))
             {
@@ -631,7 +631,7 @@ public class DomXmpParser
             for (Element property : properties)
             {
                 String name = property.getLocalName();
-                PropertyType dtype = checkPropertyDefinition(xmp, DomHelper.getQName(property));
+                PropertyType dtype = checkPropertyDefinition(xmp, DomHelper.getQName(property), null);
                 PropertyType ptype = tm.getStructuredPropMapping(dtype.type()).getPropertyType(name);
                 // create property
                 createProperty(xmp, property, ptype, parentContainer);
@@ -744,7 +744,7 @@ public class DomXmpParser
         }
     }
 
-    private AbstractStructuredType parseLiDescription(XMPMetadata xmp, QName descriptor, Element liDescriptionElement)
+    private AbstractStructuredType parseLiDescription(XMPMetadata xmp, QName parentQName, Element liDescriptionElement)
             throws XmpParsingException
     {
         TypeMapping tm = xmp.getTypeMapping();
@@ -752,26 +752,26 @@ public class DomXmpParser
         if (liDescriptionElementChildren.isEmpty())
         {
             // The list is empty
-            return tryParseAttributesAsProperties(xmp, liDescriptionElement, tm, null, null, descriptor);
+            return tryParseAttributesAsProperties(xmp, liDescriptionElement, tm, null, null, parentQName);
         }
         Element firstLiDescriptionElementChild = liDescriptionElementChildren.get(0);
         if ("rdf:Description".equals(firstLiDescriptionElementChild.getTagName()))
         {
             // PDFBOX-6126: "<rdf:Description" as child of "<rdf:li"
-            return parseLiDescription(xmp, descriptor, firstLiDescriptionElementChild);
+            return parseLiDescription(xmp, parentQName, firstLiDescriptionElementChild);
         }
         // Instantiate abstract structured type with hint from first element
         nsFinder.push(firstLiDescriptionElementChild);
-        QName qName = DomHelper.getQName(firstLiDescriptionElementChild);
-        PropertyType ctype = checkPropertyDefinition(xmp, qName);
+        QName firstChildQName = DomHelper.getQName(firstLiDescriptionElementChild);
+        PropertyType ctype = checkPropertyDefinition(xmp, firstChildQName, parentQName.getLocalPart());
         if (ctype == null)
         {
             // PDFBOX-5649
             throw new XmpParsingException(ErrorType.NoType,
-                    "Property '" + qName.getLocalPart() + "' not defined in " + qName.getNamespaceURI());
+                    "Property '" + firstChildQName.getLocalPart() + "' not defined in " + firstChildQName.getNamespaceURI());
         }
         Types tt = ctype.type();
-        AbstractStructuredType ast = instanciateStructured(tm, tt, descriptor.getLocalPart(), firstLiDescriptionElementChild.getNamespaceURI());
+        AbstractStructuredType ast = instanciateStructured(tm, tt, parentQName.getLocalPart(), firstLiDescriptionElementChild.getNamespaceURI());
 
         ast.setNamespace(firstLiDescriptionElementChild.getNamespaceURI());
         ast.setPrefix(firstLiDescriptionElementChild.getPrefix());
@@ -805,7 +805,7 @@ public class DomXmpParser
                 List<Element> lis = DomHelper.getElementChildren(bagOrSeq);
                 for (Element element2 : lis)
                 {
-                    AbstractField ast2 = parseLiElement(xmp, descriptor, element2, type.type());
+                    AbstractField ast2 = parseLiElement(xmp, parentQName, element2, type.type());
                     if (ast2 != null)
                     {
                         array.addProperty(ast2);
@@ -847,7 +847,7 @@ public class DomXmpParser
             }
 
         }
-        ast = tryParseAttributesAsProperties(xmp, liDescriptionElement, tm, ast, pm, descriptor);
+        ast = tryParseAttributesAsProperties(xmp, liDescriptionElement, tm, ast, pm, parentQName);
         nsFinder.pop();
         return ast;
     }
@@ -1078,7 +1078,7 @@ public class DomXmpParser
         }
     }
 
-    private PropertyType checkPropertyDefinition(XMPMetadata xmp, QName qName) throws XmpParsingException
+    private PropertyType checkPropertyDefinition(XMPMetadata xmp, QName qName, String parentTypeName) throws XmpParsingException
     {
         TypeMapping tm = xmp.getTypeMapping();
         // test if namespace is set in xml
@@ -1096,7 +1096,7 @@ public class DomXmpParser
         }
         try
         {
-            return tm.getSpecifiedPropertyType(qName);
+            return tm.getSpecifiedPropertyType(qName, null);
         }
         catch (BadFieldValueException e)
         {
@@ -1155,7 +1155,7 @@ public class DomXmpParser
                     // like in parseLiDescription():
                     // Instantiate abstract structured type with hint from first element
                     QName attrQName = new QName(attr.getNamespaceURI(), attr.getLocalName(), attr.getPrefix());
-                    PropertyType ctype = checkPropertyDefinition(xmp, attrQName);
+                    PropertyType ctype = checkPropertyDefinition(xmp, attrQName, null);
                     // this is the type of the AbstractStructuredType, not of the element(s)
                     if (ctype == null)
                     {