Author: tilman
Date: Fri Dec 19 12:10:41 2025
New Revision: 1930726

Log:
PDFBOX-5977: get each schema only once

Modified:
   
pdfbox/branches/1.8/jempbox/src/main/java/org/apache/jempbox/xmp/XMPMetadata.java
   
pdfbox/branches/1.8/jempbox/src/test/java/org/apache/jempbox/xmp/XMPMetadataTest.java

Modified: 
pdfbox/branches/1.8/jempbox/src/main/java/org/apache/jempbox/xmp/XMPMetadata.java
==============================================================================
--- 
pdfbox/branches/1.8/jempbox/src/main/java/org/apache/jempbox/xmp/XMPMetadata.java
   Fri Dec 19 11:29:57 2025        (r1930725)
+++ 
pdfbox/branches/1.8/jempbox/src/main/java/org/apache/jempbox/xmp/XMPMetadata.java
   Fri Dec 19 12:10:41 2025        (r1930726)
@@ -618,7 +618,7 @@ public class XMPMetadata
                 if (name.startsWith("xmlns:") && nsMappings.containsKey(value))
                 {
                     String prefix = name.substring(6);
-                    retval.add(createXMPSchema(value, schema, prefix));
+                    addIfXMPSchemaNotExists(retval, createXMPSchema(value, 
schema, prefix));
                     found = true;
                 }
                 // PDFBOX-5977
@@ -627,7 +627,7 @@ public class XMPMetadata
                          name.contains(":"))
                 {
                     String prefix = name.substring(0, name.indexOf(':'));
-                    retval.add(createXMPSchema(attribute.getNamespaceURI(), 
schema, prefix));
+                    addIfXMPSchemaNotExists(retval, 
createXMPSchema(attribute.getNamespaceURI(), schema, prefix));
                     found = true;
                 }
             }
@@ -639,6 +639,24 @@ public class XMPMetadata
         return retval;
     }
 
+    // Make sure that each schema is added only once, although multiple 
identical schemas
+    // won't hurt, because the actual values are retrieved by using DOM 
+    private void addIfXMPSchemaNotExists(List<XMPSchema> schemaList, XMPSchema 
schema)
+    {
+        boolean found = false;
+        for (XMPSchema sch : schemaList)
+        {
+            if (schema.getClass().isInstance(sch))
+            {
+                found = true;
+            }
+        }
+        if (!found)
+        {
+            schemaList.add(schema);
+        }
+    }
+
     private XMPSchema createXMPSchema(String value, Element schemaElement, 
String prefix) throws IOException
     {
         Class<?> schemaClass = nsMappings.get(value);

Modified: 
pdfbox/branches/1.8/jempbox/src/test/java/org/apache/jempbox/xmp/XMPMetadataTest.java
==============================================================================
--- 
pdfbox/branches/1.8/jempbox/src/test/java/org/apache/jempbox/xmp/XMPMetadataTest.java
       Fri Dec 19 11:29:57 2025        (r1930725)
+++ 
pdfbox/branches/1.8/jempbox/src/test/java/org/apache/jempbox/xmp/XMPMetadataTest.java
       Fri Dec 19 12:10:41 2025        (r1930726)
@@ -151,8 +151,11 @@ public class XMPMetadataTest extends Tes
                     "</rdf:RDF><?xpacket end=\"r\"?>";
         XMPMetadata xmp = XMPMetadata.load(new 
ByteArrayInputStream(s.getBytes()));
         xmp.addXMLNSMapping(XMPSchemaPDFAId.NAMESPACE, XMPSchemaPDFAId.class);
-        XMPSchemaPDFAId schema = (XMPSchemaPDFAId) 
xmp.getSchemaByClass(XMPSchemaPDFAId.class);
-        assertEquals("B", schema.getConformance());
-        assertEquals((Integer) 3, schema.getPart());
+        assertEquals(2, xmp.getSchemas().size());
+        XMPSchemaPDFAId pdfAIdSchema = (XMPSchemaPDFAId) 
xmp.getSchemaByClass(XMPSchemaPDFAId.class);
+        XMPSchemaPDF pdfSchema = xmp.getPDFSchema();
+        assertEquals("WeasyPrint 64.1", pdfSchema.getProducer());
+        assertEquals("B", pdfAIdSchema.getConformance());
+        assertEquals((Integer) 3, pdfAIdSchema.getPart());
     }
 }
\ No newline at end of file

Reply via email to