diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java index a5a40990c2..e157176ebe 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java @@ -72,6 +72,12 @@ public final class PackageRelationshipCollection implements * Reference to the package. */ private OPCPackage container; + + /** + * The ID number of the next rID# to generate, or -1 + * if that is still to be determined. + */ + private int nextRelationshipId = -1; /** * Constructor. @@ -206,14 +212,17 @@ public final class PackageRelationshipCollection implements */ public PackageRelationship addRelationship(URI targetUri, TargetMode targetMode, String relationshipType, String id) { + if (id == null) { + // Generate a unique ID is id parameter is null. + if (nextRelationshipId == -1) { + nextRelationshipId = size() + 1; + } - if (id == null) { - // Generate a unique ID is id parameter is null. - int i = 0; - do { - id = "rId" + ++i; - } while (relationshipsByID.get(id) != null); - } + // Work up until we find a unique number (there could be gaps etc) + do { + id = "rId" + nextRelationshipId++; + } while (relationshipsByID.get(id) != null); + } PackageRelationship rel = new PackageRelationship(container, sourcePart, targetUri, targetMode, relationshipType, id); diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java index 510377a9e0..f329356704 100644 --- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java @@ -254,6 +254,25 @@ public class TestRelationships extends TestCase { // Check core too assertEquals("/docProps/core.xml", pkg.getRelationshipsByType("http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties").getRelationship(0).getTargetURI().toString()); + + + // Add some more + partB.addExternalRelationship("http://poi.apache.org/new", "http://example/poi/new"); + partB.addExternalRelationship("http://poi.apache.org/alt", "http://example/poi/alt"); + + // Check the relations + assertEquals(2, partA.getRelationships().size()); + assertEquals(3, partB.getRelationships().size()); + + assertEquals("/partB", partA.getRelationship("rId1").getTargetURI().toString()); + assertEquals("http://poi.apache.org/", + partA.getRelationship("rId2").getTargetURI().toString()); + assertEquals("http://poi.apache.org/ss/", + partB.getRelationship("rId1").getTargetURI().toString()); + assertEquals("http://poi.apache.org/new", + partB.getRelationship("rId2").getTargetURI().toString()); + assertEquals("http://poi.apache.org/alt", + partB.getRelationship("rId3").getTargetURI().toString()); }