Skip to content
This repository has been archived by the owner on Nov 9, 2018. It is now read-only.

Commit

Permalink
Cleans up volume splitting a bit
Browse files Browse the repository at this point in the history
  • Loading branch information
Joel Håkansson committed Apr 25, 2016
1 parent 921f76c commit 12dbf3a
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,11 @@
class EvenSizeVolumeSplitter implements VolumeSplitter {
private final static Logger logger = Logger.getLogger(EvenSizeVolumeSplitter.class.getCanonicalName());
private EvenSizeVolumeSplitterCalculator sdc;
int reformatSplitterMax;
int splitterMax = 0;
int volumeOffset = 0;
int volsMin = Integer.MAX_VALUE;

EvenSizeVolumeSplitter(int reformat) {
this.reformatSplitterMax = reformat;
}

@Override
public void resetSheetCount(int sheets) {
this.sdc = new EvenSizeVolumeSplitterCalculator(sheets, reformatSplitterMax);
}

@Override
Expand All @@ -29,14 +22,13 @@ public int getSplitterMax() {
return splitterMax;
}

@Override
public void setReformatSplitterMax(int reformat) {
this.reformatSplitterMax = reformat;
}

@Override
public int getVolumeCount() {
return sdc.getVolumeCount();
if (sdc==null) {
return 1;
} else {
return sdc.getVolumeCount();
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ public class FormatterImpl implements Formatter, CrossReferences {

//CrossReferenceHandler
private final Map<Integer, Volume> volumes;
private PageStruct ps;
private final VolumeSplitter splitter;
private boolean isDirty;
private boolean volumeForContentSheetChanged;
Expand Down Expand Up @@ -136,33 +135,27 @@ private Iterable<Volume> getVolumes() {
int j = 1;
boolean ok = false;
int totalOverheadCount = 0;
int prvVolCount = 0;


ArrayList<Volume> ret = new ArrayList<>();
ArrayList<AnchorData> ad;

PageStruct ps;
while (!ok) {
BreakPointHandler volBreaks;
try {
this.ps = contentPaginator.paginate(crh, this, new DefaultContext(null, null));
ps = contentPaginator.paginate(crh, this, new DefaultContext(null, null));
String breakpoints = ps.buildBreakpointString();
logger.fine("Volume break string: " + breakpoints.replace(ZERO_WIDTH_SPACE, '-'));
volBreaks = new BreakPointHandler(breakpoints);
} catch (PaginatorException e) {
throw new RuntimeException("Error while reformatting.", e);
}
final int contents = PageStruct.countSheets(ps);
splitter.resetSheetCount(contents);

// make a preliminary calculation based on contents only

String breakpoints = ps.buildBreakpointString();
logger.fine("Volume break string: " + breakpoints.replace(ZERO_WIDTH_SPACE, '-'));
BreakPointHandler volBreaks = new BreakPointHandler(breakpoints);
splitter.setSplitterMax(getVolumeMaxSize(1, splitter.getVolumeCount()));

splitter.updateSheetCount(contents + totalOverheadCount);
volumeForContentSheetChanged = false;
splitter.updateSheetCount(ps.getSheetCount() + totalOverheadCount);

if (splitter.getVolumeCount()!=prvVolCount) {
prvVolCount = splitter.getVolumeCount();
}
volumeForContentSheetChanged = false;

//System.out.println("volcount "+volumeCount() + " sheets " + sheets);
boolean ok2 = true;
totalOverheadCount = 0;
Expand All @@ -182,18 +175,9 @@ private Iterable<Volume> getVolumes() {
totalOverheadCount += volume.getOverhead();

{
int targetSheetsInVolume = (i==splitter.getVolumeCount()?splitter.getSplitterMax():splitter.sheetsInVolume(i));
int contentSheets = targetSheetsInVolume-volume.getOverhead();
BreakPoint bp;
{
int offset = -1;
do {
offset++;
bp = volBreaks.copy().nextRow(contentSheets+offset, false);
} while (bp.getHead().length()<contentSheets && targetSheetsInVolume+offset<splitter.getSplitterMax());
bp = volBreaks.nextRow(contentSheets + offset, true);
}
contentSheets = bp.getHead().length();
int contentSheets = getBreakPoint(volBreaks,
(i==splitter.getVolumeCount()?splitter.getSplitterMax():splitter.sheetsInVolume(i)),
volume.getOverhead());
setTargetVolSize(volume, contentSheets + volume.getOverhead());
}
{
Expand All @@ -210,8 +194,8 @@ private Iterable<Volume> getVolumes() {
ok2 = false;
logger.fine("Error in code. Too many sheets in volume " + i + ": " + sheetsInVolume);
}
for (PageSequence ps : body) {
for (PageImpl p : ps.getPages()) {
for (PageSequence seq : body) {
for (PageImpl p : seq.getPages()) {
for (String id : p.getIdentifiers()) {
crh.setVolumeNumber(id, i);
}
Expand All @@ -232,7 +216,7 @@ private Iterable<Volume> getVolumes() {
ok2 = false;
logger.fine("There is more content... sheets: " + volBreaks.getRemaining() + ", pages: " +(PageStruct.countPages(ps)-pageIndex));
if (!isDirty()) {
splitter.adjustVolumeCount(contents+totalOverheadCount);
splitter.adjustVolumeCount(ps.getSheetCount()+totalOverheadCount);
}
}
if (!isDirty() && pageIndex==PageStruct.countPages(ps) && ok2) {
Expand All @@ -243,13 +227,25 @@ private Iterable<Volume> getVolumes() {
} else {
j++;
setDirty(false);
splitter.setReformatSplitterMax(getVolumeMaxSize(1, splitter.getVolumeCount()));
logger.info("Things didn't add up, running another iteration (" + j + ")");
}
}
return ret;
}

private int getBreakPoint(BreakPointHandler volBreaks, int targetSheetsInVolume, int overhead) {
int contentSheets = targetSheetsInVolume-overhead;
BreakPoint bp;
{
int offset = -1;
do {
offset++;
bp = volBreaks.copy().nextRow(contentSheets+offset, false);
} while (bp.getHead().length()<contentSheets && targetSheetsInVolume+offset<splitter.getSplitterMax());
bp = volBreaks.nextRow(contentSheets + offset, true);
}
return bp.getHead().length();
}

private PageStruct updateVolumeContents(int volumeNumber, ArrayList<AnchorData> ad, boolean pre) {
DefaultContext c = new DefaultContext(volumeNumber, splitter.getVolumeCount());
Expand Down Expand Up @@ -306,10 +302,6 @@ private int getVolumeMaxSize(int volumeNumber, int volumeCount) {
}
//TODO: don't return a fixed value
return DEFAULT_SPLITTER_MAX;
}

public PageStruct getContents() {
return ps;
}

private void setTargetVolSize(Volume d, int targetVolSize) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,21 @@ class PageStruct implements Iterable<PageSequence> {
private final Stack<PageSequence> seqs;
private final Stack<PageImpl> pages;
private final Map<Integer, PageView> volumeViews;
private int sheetCount;

PageStruct() {
seqs = new Stack<>();
pages = new Stack<>();
volumeViews = new HashMap<>();
sheetCount = 0;
}

void updateSheetCount() {
sheetCount = countSheets(this);
}

int getSheetCount() {
return sheetCount;
}

static int countPages(Iterable<PageSequence> seqs) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ PageStruct paginate(CrossReferenceHandler crh, CrossReferences refs, DefaultCont
continue restart;
}
}
struct.updateSheetCount();
return struct;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

interface VolumeSplitter {

void resetSheetCount(int sheets);

void updateSheetCount(int sheets);

/**
Expand All @@ -20,7 +18,6 @@ interface VolumeSplitter {
public int sheetsInVolume(int volIndex);

void adjustVolumeCount(int sheets);
void setReformatSplitterMax(int reformat);
void setSplitterMax(int splitterMax);
int getSplitterMax();
}

0 comments on commit 12dbf3a

Please sign in to comment.