@Override public void annotationBoundary(AnnotationBoundaryMap map) { noninsertionOp.annotationBoundary(map); }
@Override public void characters(String chars) { insertionOp.characters(chars); noninsertionOp.retain(chars.length()); }
@Override public void characters(String chars) { if (otherTarget.depth > 0) { otherTarget.targetDocument.deleteCharacters(chars); } else { targetDocument.characters(chars); otherTarget.targetDocument.retain(chars.length()); } }
@Override public void elementStart(String tag, Attributes attrs) { if (otherTarget.depth > 0) { otherTarget.targetDocument.deleteElementStart(tag, attrs); } else { targetDocument.elementStart(tag, attrs); otherTarget.targetDocument.retain(1); } }
@Override public void elementEnd() { if (otherTarget.depth > 0) { otherTarget.targetDocument.deleteElementEnd(); } else { targetDocument.elementEnd(); otherTarget.targetDocument.retain(1); } }
@Override public void deleteElementEnd() { insertionOp.retain(1); noninsertionOp.deleteElementEnd(); }
@Override public void replaceAttributes(Attributes oldAttrs, Attributes newAttrs) { insertionOp.retain(1); noninsertionOp.replaceAttributes(oldAttrs, newAttrs); }
@Override public void elementStart(String type, Attributes attrs) { insertionOp.elementStart(type, attrs); noninsertionOp.retain(1); }
@Override public void elementEnd() { insertionOp.elementEnd(); noninsertionOp.retain(1); }
@Override public T finish() { flushAnnotations(); return target.finish(); }
private void delete(int size) { List<String> keys = new ArrayList<String>(); List<String> oldValues = new ArrayList<String>(); List<String> newValues = new ArrayList<String>(); for (Map.Entry<String, ValueUpdate> entry : propagatingAnnotations.entrySet()) { String key = entry.getKey(); ValueUpdate update = entry.getValue(); ValueUpdate activeUpdate = activeAnnotations.get(key); if (update != null) { keys.add(key); oldValues.add(activeUpdate != null ? activeUpdate.newValue : update.oldValue); newValues.add(update.newValue); } else if (activeUpdate != null) { keys.add(key); oldValues.add(activeUpdate.newValue); newValues.add(activeUpdate.oldValue); } } annotationResidue.annotationBoundary(new AnnotationBoundaryMapImpl( new String[0], keys.toArray(new String[0]), oldValues.toArray(new String[0]), newValues.toArray(new String[0]))); annotationResidue.retain(size); annotationResidue.annotationBoundary(new AnnotationBoundaryMapImpl( keys.toArray(new String[0]), new String[0], new String[0], new String[0])); }
@Override public void deleteCharacters(String chars) { insertionOp.retain(chars.length()); noninsertionOp.deleteCharacters(chars); }
@Override void resolve(int itemCount) { targetDocument.deleteCharacters(characters.substring(0, itemCount)); characters = characters.substring(itemCount); }
@Override void resolve(int itemCount) { targetDocument.deleteElementStart(type, attributes); ++depth; }
@Override public void deleteElementStart(String type, Attributes attrs) { insertionOp.retain(1); preservationOp.retain(1); deletionOp.deleteElementStart(type, attrs); }
@Override void resolve(int itemCount) { targetDocument.deleteElementEnd(); --depth; }
@Override public final void elementEnd() { postAnnotationQueue.flush(); normalizer.elementEnd(); }
@Override public void characters(String chars) { if (!chars.isEmpty()) { flushAnnotations(); target.characters(chars); } }
@Override public void elementStart(String type, Attributes attrs) { flushAnnotations(); normalizer.elementStart(type, attrs); cancelRetain(1); }
@Override void resolveRetain(int itemCount) { syncAnnotations(); targetDocument.replaceAttributes(oldAttributes, newAttributes); otherTarget.targetDocument.retain(1); }