EventSequenceComparator rightESC = new EventSequenceComparator(rightES);
log("top level LCS - determining top level LCS...");
RangeDifference[] rd = RangeDifferencer.findDifferences(leftESC, rightESC);
SmartXMLFormatter formatter = new SmartXMLFormatter(out);
formatter.setConfig(diffxConfig);
String rootNodeName = xml1.getNodeName();
openResult(rootNodeName, out);
if (rd.length==0) {
log("top level LCS done; there are no differences!");
addComment("No differences", formatter);
// Note that our hashcode acts like a canonicaliser
// - attribute order doesn't matter.
// So just feed the leftESC into the formatter and return
for(EventSequence es : leftES) {
formatter.declarePrefixMapping(es.getPrefixMapping());
formatEventSequence(es,formatter);
}
closeResult(rootNodeName, out);
return;
}
// Debug: Raw output
for (int i=0; i<rd.length; i++ ) {
RangeDifference rdi = rd[i];
log( rdi.kindString() + " left " + rdi.leftStart() + "," + rdi.leftLength()
+ " right " + rdi.rightStart() + "," + rdi.rightLength() );
}
log("top level LCS done; now performing child actions ...");
int leftIdx = 0;
for (int i=0; i<rd.length; i++ ) {
RangeDifference rdi = rd[i];
// No change
if (rdi.leftStart() > leftIdx) {
for (int k = leftIdx ; k< rdi.leftStart() ; k++) {
// This just goes straight into the output,
// since it is the same on the left and the right.
// Since it is the same on both side, we handle
// it here (on the left side), and
// ignore it on the right
//out.append("\n<!-- Adding same -->\n");
addComment("Adding same", formatter);
formatter.declarePrefixMapping(leftESC.getItem(k).getPrefixMapping());
formatEventSequence(leftESC.getItem(k), formatter);
//out.append("\n<!-- .. Adding same done -->");
addComment(".. Adding same done ", formatter);
// If we wanted to difference sdt's which
// were treated the as the same (via their id)
// this is where we'd have to change
// (in addition to changing EventSequence for
// such things so that hashcode returned their
// id!)
}
leftIdx = rdi.leftStart();
}
EventSequence seq1 = new EventSequence();
// Evil hack - doesn't work
// seq1.mapPrefix("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w");
for (int k = rdi.leftStart() ; k< rdi.leftEnd() ; k++) {
if (rdi.kind()==rdi.CHANGE) {
// This we need to diff
//leftReport.append( "#" );
seq1.addSequence(leftESC.getItem(k));
// Don't forget our existing prefix mappings!
PrefixMapping existingPM = leftESC.getItem(k).getPrefixMapping();
addToPrefixMapping(seq1.getPrefixMapping(), existingPM);
} else {
// Does this happen?
// This just goes straight into the output,
formatter.declarePrefixMapping(leftESC.getItem(k).getPrefixMapping());
//out.append("\n<!-- Adding same II -->\n");
addComment("Adding same II", formatter);
formatEventSequence(leftESC.getItem(k), formatter);
//out.append("\n<!-- .. Adding same done -->");
addComment(".. Adding same done", formatter);
}
}
EventSequence seq2 = new EventSequence();
// Evil hack - doesn't work
//seq2.mapPrefix("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w");
for (int k = rdi.rightStart() ; k< rdi.rightEnd() ; k++) {
if (rdi.kind()==rdi.CHANGE) {
// This is the RHS of the diff
//rightReport.append( "#" );
seq2.addSequence(rightESC.getItem(k));
// Don't forget our existing prefix mappings!
PrefixMapping existingPM = rightESC.getItem(k).getPrefixMapping();
addToPrefixMapping(seq2.getPrefixMapping(), existingPM);
}
}
leftIdx = rdi.leftEnd();
// ok, now perform this diff
//log("performing diff");
//out.append("\n<!-- Differencing -->\n");
addComment("Differencing", formatter);
if (seq1.size() + seq2.size() < 5000) {
mainDiff(seq1, seq2, formatter, diffxConfig);
} else {
for (int i1=0; i1 < seq1.size(); i1++) {
formatter.delete(seq1.getEvent(i1));
}
for (int i2=0; i2 < seq2.size(); i2++) {
formatter.insert(seq2.getEvent(i2));
}
}
//out.append("\n<!-- .. Differencing done -->");
addComment(".. Differencing done", formatter);