+ switch (mod.getOperation()) {
+ case DELETE:
+ return ModificationType.DELETE;
+ case MERGE:
+ // Merge into non-existing data is a write
+ if (oldMeta == null) {
+ return ModificationType.WRITE;
+ }
+
+ // Data-based checks to narrow down types
+ final NormalizedNode<?, ?> data = newMeta.getData();
+
+ // leaf or anyxml are always written
+ if (!(data instanceof NormalizedNodeContainer)) {
+ return ModificationType.WRITE;
+ }
+
+ // Unkeyed collections are always written
+ if (data instanceof UnkeyedListNode || data instanceof OrderedMapNode || data instanceof OrderedLeafSetNode) {
+ return ModificationType.WRITE;
+ }
+
+ // Everything else is subtree modified
+ return ModificationType.SUBTREE_MODIFIED;
+ case TOUCH:
+ return ModificationType.SUBTREE_MODIFIED;
+ case NONE:
+ return ModificationType.UNMODIFIED;
+ case WRITE:
+ return ModificationType.WRITE;
+ }
+
+ throw new IllegalStateException("Unhandled internal operation " + mod.getOperation());