package org.vaadin.mideaas.editor; import name.fraser.neil.plaintext.diff_match_patch.Diff; import name.fraser.neil.plaintext.diff_match_patch.Operation; import name.fraser.neil.plaintext.diff_match_patch.Patch; import org.vaadin.aceeditor.ServerSideDocDiff; import org.vaadin.aceeditor.client.AceDoc; public class DocDifference { private final EditorUser user; private final AceDoc baseDoc; private final AceDoc userDoc; private ServerSideDocDiff diff; private int inserts = -1; private int deletes = -1; public DocDifference(EditorUser user, AceDoc baseDoc, AceDoc userDoc) { this.user = user; this.baseDoc = baseDoc; this.userDoc = userDoc; } public EditorUser getUser() { return user; } public ServerSideDocDiff getDiff() { ensureCalced(); return diff; } public int getInserts() { ensureCalced(); return inserts; } public int getDeletes() { ensureCalced(); return deletes; } public boolean isChanged() { ensureCalced(); return inserts > 0 || deletes > 0; } private synchronized void ensureCalced() { if (diff != null) { return; } if (baseDoc==null || userDoc==null) { inserts = 0; deletes = 0; return; } diff = ServerSideDocDiff.diff(baseDoc, userDoc); inserts = 0; deletes = 0; for (Patch p : diff.getPatches()) { for( Diff d : p.diffs) { if (d.operation==Operation.INSERT) { inserts += d.text.length(); } else if (d.operation==Operation.DELETE) { deletes += d.text.length(); } } } } @Override public String toString() { return "DD "+user.getName()+" +" + getInserts() + " -" + getDeletes(); } }