diff --git a/src/org/daisy/dotify/formatter/impl/VolumeProvider.java b/src/org/daisy/dotify/formatter/impl/VolumeProvider.java index a8be4605..c23c91df 100644 --- a/src/org/daisy/dotify/formatter/impl/VolumeProvider.java +++ b/src/org/daisy/dotify/formatter/impl/VolumeProvider.java @@ -78,7 +78,7 @@ public class VolumeProvider { private final LazyFormatterContext context; /** - * Creates a new volume provider with the specifed parameters. + * Creates a new volume provider with the specified parameters. * * @param blocks the block sequences * @param volumeTemplates volume templates @@ -151,15 +151,28 @@ VolumeImpl nextVolume() { currentVolumeNumber++; VolumeImpl volume = new VolumeImpl(crh.getOverhead(currentVolumeNumber)); ArrayList ad = new ArrayList<>(); - volume.setPreVolData(updateVolumeContents(currentVolumeNumber, ad, true)); - volume.setBody(nextBodyContents(currentVolumeNumber, volume.getOverhead().total(), ad)); + List sheets = new ArrayList<>(); + + List preVolSheets = updateVolumeContents(currentVolumeNumber, ad, true); + volume.setPreVolSize(preVolSheets.size()); + sheets.addAll(preVolSheets); + + List contentSheets = nextBodyContents(currentVolumeNumber, volume.getOverhead().total(), ad); + volume.setBodyVolSize(contentSheets.size()); + sheets.addAll(contentSheets); if (logger.isLoggable(Level.FINE)) { logger.fine("Sheets in volume " + currentVolumeNumber + ": " + (volume.getVolumeSize()) + ", content:" + volume.getBodySize() + ", overhead:" + volume.getOverhead()); } - volume.setPostVolData(updateVolumeContents(currentVolumeNumber, ad, false)); + + List postVolSheets = updateVolumeContents(currentVolumeNumber, ad, false); + volume.setPostVolSize(postVolSheets.size()); + sheets.addAll(postVolSheets); + + volume.setSections(SectionBuilder.getSections(sheets)); + crh.setSheetsInVolume(currentVolumeNumber, volume.getBodySize() + volume.getOverhead().total()); //crh.setPagesInVolume(i, value); crh.setAnchorData(currentVolumeNumber, ad); @@ -175,7 +188,7 @@ VolumeImpl nextVolume() { * @param ad the anchor data * @return returns the contents of the next volume */ - private SectionBuilder nextBodyContents(int volumeNumber, final int overhead, ArrayList ad) { + private List nextBodyContents(int volumeNumber, final int overhead, ArrayList ad) { groups.currentGroup().setOverheadCount(groups.currentGroup().getOverheadCount() + overhead); final int splitterMax = splitterLimit.getSplitterLimit(volumeNumber); final int targetSheetsInVolume = (groups.lastInGroup() ? splitterMax : groups.sheetsInCurrentVolume()); @@ -234,7 +247,6 @@ public double getCost(SplitPointDataSource units, int index, int break crh.setVolumeScope(volumeNumber, pageIndex, pageIndex + pageCount); pageIndex += pageCount; - SectionBuilder sb = new SectionBuilder(); boolean atFirstPageOfContents = true; for (Sheet sheet : contents) { for (PageImpl p : sheet.getPages()) { @@ -255,14 +267,13 @@ public double getCost(SplitPointDataSource units, int index, int break } atFirstPageOfContents = false; } - sb.addSheet(sheet); } groups.currentGroup().setSheetCount(groups.currentGroup().getSheetCount() + contents.size()); groups.nextVolume(); - return sb; + return contents; } - private SectionBuilder updateVolumeContents(int volumeNumber, ArrayList ad, boolean pre) { + private List updateVolumeContents(int volumeNumber, ArrayList ad, boolean pre) { DefaultContext c = new DefaultContext.Builder(crh) .currentVolume(volumeNumber) .space(pre ? Space.PRE_CONTENT : Space.POST_CONTENT) @@ -281,7 +292,6 @@ private SectionBuilder updateVolumeContents(int volumeNumber, ArrayList ret = prepareToPaginatePrePostVolumeContent(ib, c).getRemaining(); - SectionBuilder sb = new SectionBuilder(); for (Sheet ps : ret) { for (PageImpl p : ps.getPages()) { for (String id : p.getIdentifiers()) { @@ -291,9 +301,8 @@ private SectionBuilder updateVolumeContents(int volumeNumber, ArrayList sections); + /** * Gets the contents. * diff --git a/src/org/daisy/dotify/formatter/impl/sheet/SectionBuilder.java b/src/org/daisy/dotify/formatter/impl/sheet/SectionBuilder.java index e3b802d0..ad509e83 100644 --- a/src/org/daisy/dotify/formatter/impl/sheet/SectionBuilder.java +++ b/src/org/daisy/dotify/formatter/impl/sheet/SectionBuilder.java @@ -11,33 +11,28 @@ * TODO: Write java doc. */ public class SectionBuilder { - private Stack
ret = new Stack
(); - private SectionProperties currentProps = null; - private int sheets = 0; - - public void addSheet(Sheet s) { - sheets++; - /* We're using object identity here to communicate requests for - * new sections. It is left over from a previous cleanup, and - * might not be very intuitive, but it have to do for now. - * Please improve if you wish. - */ - if (ret.isEmpty() || currentProps != s.getSectionProperties()) { - currentProps = s.getSectionProperties(); - ret.add(new SectionImpl(currentProps)); - } - SectionImpl sect = ((SectionImpl) ret.peek()); - for (PageImpl p : s.getPages()) { - sect.addPage(p); + + public static List
getSections(List sheets) { + Stack
ret = new Stack<>(); + SectionProperties currentProps = null; + for (Sheet s : sheets) { + /* We're using object identity here to communicate requests for + * new sections. It is left over from a previous cleanup, and + * might not be very intuitive, but it have to do for now. + * Please improve if you wish. + */ + if (ret.isEmpty() || currentProps != s.getSectionProperties()) { + currentProps = s.getSectionProperties(); + // start a new Section + ret.add(new SectionImpl(currentProps)); + } + SectionImpl sect = ((SectionImpl) ret.peek()); + for (PageImpl p : s.getPages()) { + sect.addPage(p); + } + } - } - - List
getSections() { return ret; } - - int getSheetCount() { - return sheets; - } - + } diff --git a/src/org/daisy/dotify/formatter/impl/sheet/VolumeImpl.java b/src/org/daisy/dotify/formatter/impl/sheet/VolumeImpl.java index 21d5998f..6fa1ea0d 100644 --- a/src/org/daisy/dotify/formatter/impl/sheet/VolumeImpl.java +++ b/src/org/daisy/dotify/formatter/impl/sheet/VolumeImpl.java @@ -4,7 +4,6 @@ import org.daisy.dotify.formatter.impl.common.Volume; import org.daisy.dotify.formatter.impl.search.Overhead; -import java.util.ArrayList; import java.util.List; /** @@ -13,9 +12,7 @@ * @author Joel HÃ¥kansson */ public class VolumeImpl implements Volume { - private List
body; - private List
preVolData; - private List
postVolData; + private List sections; private Overhead overhead; private int bodyVolSize; @@ -24,21 +21,23 @@ public VolumeImpl(Overhead overhead) { this.bodyVolSize = 0; } - public void setBody(SectionBuilder body) { - bodyVolSize = body.getSheetCount(); - this.body = body.getSections(); + public void setBodyVolSize(int sheetCount) { + this.bodyVolSize = sheetCount; } - public void setPreVolData(SectionBuilder preVolData) { + public void setPreVolSize(int sheetCount) { //use the highest value to avoid oscillation - overhead = overhead.withPreContentSize(Math.max(overhead.getPreContentSize(), preVolData.getSheetCount())); - this.preVolData = preVolData.getSections(); + overhead = overhead.withPreContentSize(Math.max(overhead.getPreContentSize(), sheetCount)); } - - public void setPostVolData(SectionBuilder postVolData) { + + public void setPostVolSize(int sheetCount) { //use the highest value to avoid oscillation - overhead = overhead.withPostContentSize(Math.max(overhead.getPostContentSize(), postVolData.getSheetCount())); - this.postVolData = postVolData.getSections(); + overhead = overhead.withPostContentSize(Math.max(overhead.getPostContentSize(), sheetCount)); + } + + @Override + public void setSections(List sections) { + this.sections = sections; } public Overhead getOverhead() { @@ -55,11 +54,7 @@ public int getVolumeSize() { @Override public Iterable getSections() { - List
contents = new ArrayList<>(); - contents.addAll(preVolData); - contents.addAll(body); - contents.addAll(postVolData); - return contents; + return sections; } }