public static ItemPath remainder(ItemPath main, ItemPath prefix) { ItemPathNormalizingIterator mainIterator = normalizingIterator(main); ItemPathNormalizingIterator prefixIterator = normalizingIterator(prefix); while (prefixIterator.hasNext()) { if (!mainIterator.hasNext()) { throw new IllegalArgumentException("Cannot subtract '"+prefix+"' from path '"+main+ "' because it is not a prefix (subpath): it is a superpath instead."); } Object mainSegment = mainIterator.next(); Object prefixSegment = prefixIterator.next(); if (!segmentsEquivalent(mainSegment, prefixSegment)) { throw new IllegalArgumentException("Cannot subtract segment '"+prefixSegment+"' from path '"+main+ "' because it does not contain corresponding segment; it has '"+mainSegment+"' instead."); } } return ItemPathImpl.createFromIterator(mainIterator); }
public static ItemPath.CompareResult compareComplex(@Nullable ItemPath path1, @Nullable ItemPath path2) { ItemPathNormalizingIterator iterator1 = normalizingIterator(path1); ItemPathNormalizingIterator iterator2 = normalizingIterator(path2); while (iterator1.hasNext() && iterator2.hasNext()) { Object o1 = iterator1.next(); Object o2 = iterator2.next(); if (!segmentsEquivalent(o1, o2)) { return ItemPath.CompareResult.NO_RELATION; } } if (iterator1.hasNext()) { return ItemPath.CompareResult.SUPERPATH; // "this" is longer than "other" } if (iterator2.hasNext()) { return ItemPath.CompareResult.SUBPATH; // "this" is shorter than "other" } return ItemPath.CompareResult.EQUIVALENT; }
private static ItemPathNormalizingIterator normalizingIterator(ItemPath path) { return new ItemPathNormalizingIterator(path); }