Author: tilman
Date: Fri Nov 28 10:12:11 2025
New Revision: 1930042
Log:
PDFBOX-2378: revert initial change (avoid rdf namespace declarations getting
lost in serialization), it is no longer needed
Modified:
pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/XMPMetadata.java
pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java
pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/XmpSerializer.java
pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/parser/DeserializationTest.java
Modified: pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/XMPMetadata.java
==============================================================================
--- pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/XMPMetadata.java
Fri Nov 28 08:30:15 2025 (r1930041)
+++ pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/XMPMetadata.java
Fri Nov 28 10:12:11 2025 (r1930042)
@@ -21,7 +21,6 @@
package org.apache.xmpbox;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -64,8 +63,6 @@ public class XMPMetadata
private final List<XMPSchema> schemas;
- private Map<String, String> rdfAttributeMap = Collections.emptyMap();
-
private final TypeMapping typeMapping;
/**
@@ -578,24 +575,4 @@ public class XMPMetadata
{
schemas.clear();
}
-
- /**
- * Get the rdf attribute map (namespace declarations). This is used in
serialization.
- *
- * @return the rdf attribute map.
- */
- public Map<String, String> getRdfAttributeMap()
- {
- return Collections.unmodifiableMap(rdfAttributeMap);
- }
-
- /**
- * Set the rdf attribute map (namespace declarations). This is used in
serialization.
- *
- * @param rdfAttributeMap an rdf attribute map.
- */
- public void setRdfAttributeMap(Map<String, String> rdfAttributeMap)
- {
- this.rdfAttributeMap = rdfAttributeMap;
- }
}
Modified:
pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java
==============================================================================
--- pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java
Fri Nov 28 08:30:15 2025 (r1930041)
+++ pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java
Fri Nov 28 10:12:11 2025 (r1930042)
@@ -195,21 +195,6 @@ public class DomXmpParser
}
}
- // PDFBOX-2378: keep rdf namespace declarations for later serialization
- NamedNodeMap attributes = rdfRdf.getAttributes();
- if (attributes != null)
- {
- Map<String, String> rdfAttributeMap = new HashMap<>();
- for (int i = 0; i < attributes.getLength(); ++i)
- {
- Node item = attributes.item(i);
- if
(XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(item.getNamespaceURI()))
- {
- rdfAttributeMap.put(item.getNodeName(),
item.getNodeValue());
- }
- }
- xmp.setRdfAttributeMap(rdfAttributeMap);
- }
// find schema description
PdfaExtensionHelper.populateSchemaMapping(xmp);
// parse data description
Modified:
pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/XmpSerializer.java
==============================================================================
--- pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/XmpSerializer.java
Fri Nov 28 08:30:15 2025 (r1930041)
+++ pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/XmpSerializer.java
Fri Nov 28 10:12:11 2025 (r1930042)
@@ -23,7 +23,6 @@ package org.apache.xmpbox.xml;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
@@ -98,12 +97,6 @@ public class XmpSerializer
{
rdf.appendChild(serializeSchema(doc, schema));
}
- // PDFBOX-2378: avoid rdf namespace declarations getting lost in
serialization
- Map<String, String> rdfAttributeMap = metadata.getRdfAttributeMap();
- for (Map.Entry<String, String> entry : rdfAttributeMap.entrySet())
- {
- rdf.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI,
entry.getKey(), entry.getValue());
- }
// save
save(doc, os, "UTF-8");
}
@@ -166,7 +159,7 @@ public class XmpSerializer
}
}
- // PDFBOX-2378 part 2: add namespace declaration to the top
+ // PDFBOX-2378: add namespace declaration to the top
if (!field.getPrefix().isEmpty() && field.getNamespace() !=
null && !field.getNamespace().isEmpty())
{
rdf.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI,
"xmlns:" + field.getPrefix(), field.getNamespace());
Modified:
pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/parser/DeserializationTest.java
==============================================================================
---
pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/parser/DeserializationTest.java
Fri Nov 28 08:30:15 2025 (r1930041)
+++
pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/parser/DeserializationTest.java
Fri Nov 28 10:12:11 2025 (r1930042)
@@ -53,6 +53,12 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.apache.xmpbox.xml.XmpSerializer;
+/**
+ * DomXmpParser imports the XML into an internal representation. XmpSerializer
exports this into
+ * XML. The result may look different, but should be the same from a data
point of view.
+ *
+ * @author Tilman Hausherr
+ */
class DeserializationTest
{
@@ -93,7 +99,7 @@ class DeserializationTest
try (InputStream is =
DomXmpParser.class.getResourceAsStream("/org/apache/xmpbox/parser/structured_recursive.xml"))
{
XMPMetadata metadata = xdb.parse(is);
- checkTransform(metadata,
"52753264982056308826419701767667619100664406974698584945629426171445624909200",
metadata.getAllSchemas().size());
+ checkTransform(metadata,
"62495942572014793625872774972947435765670563107818217447706375288846297812281",
metadata.getAllSchemas().size());
}
}
@@ -103,7 +109,7 @@ class DeserializationTest
try (InputStream is =
DomXmpParser.class.getResourceAsStream("/org/apache/xmpbox/parser/empty_list.xml"))
{
XMPMetadata metadata = xdb.parse(is);
- checkTransform(metadata,
"19567447256605061134904612869562878052777123273535814661244629430271579345577",
metadata.getAllSchemas().size());
+ checkTransform(metadata,
"95754993383010030299848397520773287413798669761891751126809013411187892693280",
metadata.getAllSchemas().size());
}
}
@@ -137,7 +143,7 @@ class DeserializationTest
try (InputStream is =
DomXmpParser.class.getResourceAsStream("/org/apache/xmpbox/parser/AltBagSeqTest.xml"))
{
XMPMetadata metadata = xdb.parse(is);
- checkTransform(metadata,
"19154431745733679891721944365143324348437445906324353036103478292448653362772",
metadata.getAllSchemas().size());
+ checkTransform(metadata,
"89123270336154452745819041017446278583816329940574853160909598044560152910018",
metadata.getAllSchemas().size());
}
}
@@ -180,7 +186,7 @@ class DeserializationTest
assertEquals("JPEG", thumb.getFormat());
assertEquals("/9j/4AAQSkZJRgABAgEASABIAAD", thumb.getImage());
- checkTransform(metadata,
"84558386150683037967795120526515137256954964034058806864845109667021390825020",
metadata.getAllSchemas().size());
+ checkTransform(metadata,
"64755266855514150823517184659364700851455308334441170957883187622624192802093",
metadata.getAllSchemas().size());
}
}
@@ -203,15 +209,12 @@ class DeserializationTest
{
try (InputStream is =
DomXmpParser.class.getResourceAsStream("/invalidxmp/noxpacketend.xml"))
{
- try
- {
- xdb.parse(is);
- fail("Should fail during parse");
- }
- catch (XmpParsingException e)
- {
- assertEquals(ErrorType.XpacketBadEnd, e.getErrorType());
- }
+ xdb.parse(is);
+ fail("Should fail during parse");
+ }
+ catch (XmpParsingException e)
+ {
+ assertEquals(ErrorType.XpacketBadEnd, e.getErrorType());
}
}
@@ -223,7 +226,7 @@ class DeserializationTest
xdb.parse(is);
fail("Should fail during parse");
}
- catch(XmpParsingException e)
+ catch (XmpParsingException e)
{
assertEquals(ErrorType.Format, e.getErrorType());
}
@@ -330,7 +333,6 @@ class DeserializationTest
@Test
void testWithAttributesAsProperties() throws XmpParsingException,
TransformerException, NoSuchAlgorithmException, IOException
{
- // also serves as a test for the changes in PDFBOX-2378
try (InputStream is =
DomXmpParser.class.getResourceAsStream("/validxmp/attr_as_props.xml"))
{
XMPMetadata metadata = xdb.parse(is);
@@ -344,7 +346,7 @@ class DeserializationTest
XMPBasicSchema basic = metadata.getXMPBasicSchema();
assertNotNull(basic.getCreateDate());
- checkTransform(metadata,
"103011318952861241491609772230618389876889507758821590919505444434501582047075",
metadata.getAllSchemas().size());
+ checkTransform(metadata,
"27499224985683016678197540524065114038595582230834506941950503218519476041225",
metadata.getAllSchemas().size());
}
}
@@ -353,7 +355,7 @@ class DeserializationTest
{
// check values with spaces at start or end
// in this case, the value should not be trimmed
- try(InputStream is =
DomXmpParser.class.getResourceAsStream("/validxmp/only_space_fields.xmp"))
+ try (InputStream is =
DomXmpParser.class.getResourceAsStream("/validxmp/only_space_fields.xmp"))
{
XMPMetadata metadata = xdb.parse(is);
// check producer
@@ -361,12 +363,12 @@ class DeserializationTest
// check creator tool
assertEquals("Canon ",
metadata.getXMPBasicSchema().getCreatorTool());
- checkTransform(metadata,
"35040104785033687813052387728441520994588808120158942942660631178163542677230",
metadata.getAllSchemas().size());
+ checkTransform(metadata,
"9220923061800113567693538810355030344095407871190202111473587642358933618073",
metadata.getAllSchemas().size());
}
}
@Test
- void testMetadataParsing() throws TransformerException,
NoSuchAlgorithmException, XmpParsingException
+ void testMetadataParsing() throws TransformerException,
NoSuchAlgorithmException, XmpParsingException, IOException
{
XMPMetadata metadata = XMPMetadata.createXMPMetadata();
@@ -391,7 +393,7 @@ class DeserializationTest
* @throws NoSuchAlgorithmException
*/
@Test
- void testEmptyDate() throws XmpParsingException, TransformerException,
NoSuchAlgorithmException
+ void testEmptyDate() throws XmpParsingException, TransformerException,
NoSuchAlgorithmException, IOException
{
String xmpmeta = "<?xpacket begin=\"\"
id=\"W5M0MpCehiHzreSzNTczkc9d\"?>\n"
+ "<x:xmpmeta x:xmptk=\"Adobe XMP Core 4.2.1-c041 52.342996,
2008/05/07-20:48:00\" xmlns:x=\"adobe:ns:meta/\">\n"
@@ -403,7 +405,7 @@ class DeserializationTest
+ "</x:xmpmeta>\n"
+ "<?xpacket end=\"w\"?>";
XMPMetadata metadata =
xdb.parse(xmpmeta.getBytes(StandardCharsets.UTF_8));
- checkTransform(metadata,
"114563613226112098345006389295317658957506710850378716324758103164733276333281",
metadata.getAllSchemas().size());
+ checkTransform(metadata,
"19030153876683461724958694183980892665426846590791273142114566290124997390122",
metadata.getAllSchemas().size());
}
private void checkTransform(XMPMetadata metadata, String expected, int
expectedSchemaCount)