Improve the number of steps when generating an ID of a new relationship, and add more tests, bug #53904

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1442148 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2013-02-04 15:06:46 +00:00
parent dd21676086
commit 000620ac52
2 changed files with 35 additions and 7 deletions

View File

@ -73,6 +73,12 @@ public final class PackageRelationshipCollection implements
*/
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);

View File

@ -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());
}