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:

* * @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);