From 41fe4cc8eb76e4ce8109ebd258b040eb848a0094 Mon Sep 17 00:00:00 2001
From: Bert Frees
Date: Tue, 15 Jan 2019 19:46:48 +0100
Subject: [PATCH] Fix marker-reference issue (fixes #39, closes #94)
---
.../impl/page/PageSequenceBuilder2.java | 4 ++--
.../impl/search/CrossReferenceHandler.java | 9 ++++-----
.../impl/search/DocumentSpaceData.java | 2 +-
.../formatter/impl/search/SearchInfo.java | 8 ++++----
.../formatter/impl/search/SequenceId.java | 19 ++++++++++++++++--
.../formatter/impl/sheet/SheetDataSource.java | 9 +++++++--
.../impl/page/FieldResolverTest.java | 3 ++-
.../formatter/impl/search/SearchInfoTest.java | 20 +++++++++----------
8 files changed, 47 insertions(+), 27 deletions(-)
diff --git a/src/org/daisy/dotify/formatter/impl/page/PageSequenceBuilder2.java b/src/org/daisy/dotify/formatter/impl/page/PageSequenceBuilder2.java
index 9e6d1cc2..e2bf680b 100644
--- a/src/org/daisy/dotify/formatter/impl/page/PageSequenceBuilder2.java
+++ b/src/org/daisy/dotify/formatter/impl/page/PageSequenceBuilder2.java
@@ -64,7 +64,7 @@ public class PageSequenceBuilder2 {
private final int fromIndex;
private int toIndex;
- public PageSequenceBuilder2(int fromIndex, LayoutMaster master, int pageOffset, BlockSequence seq, FormatterContext context, DefaultContext rcontext, int sequenceId) {
+ public PageSequenceBuilder2(int fromIndex, LayoutMaster master, int pageOffset, BlockSequence seq, FormatterContext context, DefaultContext rcontext, SequenceId seqId) {
this.fromIndex = fromIndex;
this.toIndex = fromIndex;
this.master = master;
@@ -91,7 +91,7 @@ public PageSequenceBuilder2(int fromIndex, LayoutMaster master, int pageOffset,
this.dataGroups = seq.selectScenario(master, bc, true);
this.cd = new CollectionData(staticAreaContent, blockContext, master, collection);
this.dataGroupsIndex = 0;
- this.seqId = new SequenceId(sequenceId, new DocumentSpace(blockContext.getSpace(), blockContext.getCurrentVolume()));
+ this.seqId = seqId;
PageDetails details = new PageDetails(master.duplex(), new PageId(pageCount, getGlobalStartIndex(), seqId), pageOffset);
this.fieldResolver = new FieldResolver(master, context, rcontext.getRefs(), details);
}
diff --git a/src/org/daisy/dotify/formatter/impl/search/CrossReferenceHandler.java b/src/org/daisy/dotify/formatter/impl/search/CrossReferenceHandler.java
index 1147fd48..4cf6ae99 100644
--- a/src/org/daisy/dotify/formatter/impl/search/CrossReferenceHandler.java
+++ b/src/org/daisy/dotify/formatter/impl/search/CrossReferenceHandler.java
@@ -264,14 +264,13 @@ public void commitPageDetails() {
/**
* Sets the sequence scope for the purpose of finding markers in a specific sequence.
- * @param space the document space
- * @param sequenceNumber the sequence number
+ * @param sequenceId the sequence id
* @param fromIndex the start index
* @param toIndex the end index
*/
- public void setSequenceScope(DocumentSpace space, int sequenceNumber, int fromIndex, int toIndex) {
+ public void setSequenceScope(SequenceId sequenceId, int fromIndex, int toIndex) {
if (readOnly) { return; }
- searchInfo.setSequenceScope(space, sequenceNumber, fromIndex, toIndex);
+ searchInfo.setSequenceScope(sequenceId, fromIndex, toIndex);
}
/**
@@ -291,7 +290,7 @@ public void setVolumeScope(int volumeNumber, int fromIndex, int toIndex) {
* data needed by this method:
* - {@link #keepPageDetails(PageDetails)}
* - {@link #commitPageDetails()}
- * - {@link #setSequenceScope(DocumentSpace, int, int, int)}
+ * - {@link #setSequenceScope(SequenceId, int, int)}
* - {@link #setVolumeScope(int, int, int)}
* @param id the page id of the page where the search originates.
* Note that this page is not necessarily the first page
diff --git a/src/org/daisy/dotify/formatter/impl/search/DocumentSpaceData.java b/src/org/daisy/dotify/formatter/impl/search/DocumentSpaceData.java
index f82a1948..dbcd8456 100644
--- a/src/org/daisy/dotify/formatter/impl/search/DocumentSpaceData.java
+++ b/src/org/daisy/dotify/formatter/impl/search/DocumentSpaceData.java
@@ -13,7 +13,7 @@ class DocumentSpaceData {
final List pageDetails;
final Map> volumeViews;
- final Map> sequenceViews;
+ final Map> sequenceViews;
DocumentSpaceData() {
this.pageDetails = new ArrayList<>();
diff --git a/src/org/daisy/dotify/formatter/impl/search/SearchInfo.java b/src/org/daisy/dotify/formatter/impl/search/SearchInfo.java
index 3db5455f..cb71b69e 100644
--- a/src/org/daisy/dotify/formatter/impl/search/SearchInfo.java
+++ b/src/org/daisy/dotify/formatter/impl/search/SearchInfo.java
@@ -59,12 +59,12 @@ View getContentsInVolume(int volumeNumber, DocumentSpace space) {
}
View getContentsInSequence(SequenceId seqId) {
- return getViewForSpace(seqId.getSpace()).sequenceViews.get(seqId.getOrdinal());
+ return getViewForSpace(seqId.getSpace()).sequenceViews.get(seqId);
}
- void setSequenceScope(DocumentSpace space, int sequenceNumber, int fromIndex, int toIndex) {
- View pw = new View(getViewForSpace(space).pageDetails, fromIndex, toIndex);
- getViewForSpace(space).sequenceViews.put(sequenceNumber, pw);
+ void setSequenceScope(SequenceId sequenceId, int fromIndex, int toIndex) {
+ View pw = new View(getViewForSpace(sequenceId.getSpace()).pageDetails, fromIndex, toIndex);
+ getViewForSpace(sequenceId.getSpace()).sequenceViews.put(sequenceId, pw);
}
void setVolumeScope(int volumeNumber, int fromIndex, int toIndex) {
diff --git a/src/org/daisy/dotify/formatter/impl/search/SequenceId.java b/src/org/daisy/dotify/formatter/impl/search/SequenceId.java
index 0616c9ac..45c6c2cf 100644
--- a/src/org/daisy/dotify/formatter/impl/search/SequenceId.java
+++ b/src/org/daisy/dotify/formatter/impl/search/SequenceId.java
@@ -3,10 +3,16 @@
public class SequenceId {
private final int ordinal;
private final DocumentSpace space;
+ private final Integer volumeGroup;
- public SequenceId(int ordinal, DocumentSpace space) {
+ public SequenceId(int ordinal, DocumentSpace space, Integer volumeGroup) {
+ if ((space.equals(DocumentSpace.BODY) && volumeGroup == null)
+ || (!space.equals(DocumentSpace.BODY) && volumeGroup != null)) {
+ throw new IllegalArgumentException();
+ }
this.ordinal = ordinal;
this.space = space;
+ this.volumeGroup = volumeGroup;
}
int getOrdinal() {
@@ -23,6 +29,7 @@ public int hashCode() {
int result = 1;
result = prime * result + ordinal;
result = prime * result + ((space == null) ? 0 : space.hashCode());
+ result = prime * result + (volumeGroup == null ? 0 : volumeGroup);
return result;
}
@@ -42,12 +49,20 @@ public boolean equals(Object obj) {
return false;
} else if (!space.equals(other.space))
return false;
+ if (volumeGroup == null) {
+ if (other.volumeGroup != null) {
+ return false;
+ }
+ } else if (!volumeGroup.equals(other.volumeGroup))
+ return false;
return true;
}
@Override
public String toString() {
- return "SequenceId [ordinal=" + ordinal + ", space=" + space + "]";
+ return "SequenceId [ordinal=" + ordinal + ", space=" + space
+ + (volumeGroup == null ? "" : ", volumeGroup=" + volumeGroup)
+ + "]";
}
}
diff --git a/src/org/daisy/dotify/formatter/impl/sheet/SheetDataSource.java b/src/org/daisy/dotify/formatter/impl/sheet/SheetDataSource.java
index 86c3e63c..6ab03de8 100644
--- a/src/org/daisy/dotify/formatter/impl/sheet/SheetDataSource.java
+++ b/src/org/daisy/dotify/formatter/impl/sheet/SheetDataSource.java
@@ -22,6 +22,7 @@
import org.daisy.dotify.formatter.impl.search.DocumentSpace;
import org.daisy.dotify.formatter.impl.search.PageDetails;
import org.daisy.dotify.formatter.impl.search.PageId;
+import org.daisy.dotify.formatter.impl.search.SequenceId;
import org.daisy.dotify.formatter.impl.search.SheetIdentity;
import org.daisy.dotify.formatter.impl.search.TransitionProperties;
@@ -42,6 +43,7 @@ public class SheetDataSource implements SplitPointDataSource vol1 = si.getContentsInVolume(1, DocumentSpace.BODY);
assertEquals(3, vol1.size());
View vol2 = si.getContentsInVolume(2, DocumentSpace.BODY);
assertEquals(3, vol2.size());
- View seq = si.getContentsInSequence(new SequenceId(0, DocumentSpace.BODY));
+ View seq = si.getContentsInSequence(new SequenceId(0, DocumentSpace.BODY, 0));
assertEquals(6, seq.size());
}
- private static void addPages(SearchInfo si, int count, int offset, boolean duplex, int globalStartIndex, int sequenceId, DocumentSpace space) {
- addPages(si, count, offset, duplex, globalStartIndex, sequenceId, space, Collections.emptyMap());
+ private static void addPages(SearchInfo si, int count, int offset, boolean duplex, int globalStartIndex, int sequenceId, DocumentSpace space, Integer volumeGroup) {
+ addPages(si, count, offset, duplex, globalStartIndex, sequenceId, space, volumeGroup, Collections.emptyMap());
}
- private static void addPages(SearchInfo si, int count, int offset, boolean duplex, int globalStartIndex, int sequenceId, DocumentSpace space, Map> marker) {
+ private static void addPages(SearchInfo si, int count, int offset, boolean duplex, int globalStartIndex, int sequenceId, DocumentSpace space, Integer volumeGroup, Map> marker) {
for (int i=0; i m = marker.get(i+offset);
if (m!=null) {
pd.getMarkers().addAll(m);