/** * @return {@code true} if the objects in this entry represent a deleted feature */ public boolean isDelete() { return ChangeType.REMOVED.equals(changeType()); }
/** * @return {@code true} if the objects in this entry represent a changed feature */ public boolean isChange() { return ChangeType.MODIFIED.equals(changeType()); }
@Override public boolean apply(@Nullable DiffEntry input) { return input.changeType().equals(ChangeType.ADDED); } });
/** * @return {@code true} if the objects in this entry represent an added feature */ public boolean isAdd() { return ChangeType.ADDED.equals(changeType()); }
/** * @return the {@code DiffEntry} in the form of a readable {@code String} */ @Override public String toString() { StringBuilder sb = new StringBuilder(changeType().toString()); if (!isAdd()) { sb.append(" [").append(oldObject).append("] "); } if (isChange()) { sb.append("->"); } if (!isDelete()) { sb.append(" [").append(newObject).append("]"); } return sb.toString(); }
public @Override SimpleFeature apply(DiffObjectInfo<RevFeature> info) { DiffEntry entry = info.entry(); final String id = entry.name(); RevFeature oldFeature = info.oldValue().orElse(null); RevFeature newFeature = info.newValue().orElse(null); final ChangeType changeType = info.entry().changeType(); diffFeatureBuilder.set(BulkFeatureRetriever.DIFF_FEATURE_CHANGETYPE_ATTNAME, Integer.valueOf(changeType.value())); List<String> nativeTypeNames = this.nativeAttNames; for (int i = 0; i < nativeTypeNames.size(); i++) { String attNameFlattenedOld = flattenedAttNames.get(2 * i); String attNameFlattenedNew = flattenedAttNames.get(2 * i + 1); Object o = oldFeature == null ? null : oldFeature.get(i).orNull(); Object n = newFeature == null ? null : newFeature.get(i).orNull(); diffFeatureBuilder.set(attNameFlattenedOld, o); diffFeatureBuilder.set(attNameFlattenedNew, n); } return diffFeatureBuilder.buildFeature(id); } }
public @Override SimpleFeature apply(DiffObjectInfo<RevFeature> info) { DiffEntry entry = info.entry(); final String id = entry.name(); RevFeature oldFeature = info.oldValue().orElse(null); RevFeature newFeature = info.newValue().orElse(null); SimpleFeature oldValue; SimpleFeature newValue; oldValue = (SimpleFeature) (oldFeature == null ? null : valueBuilder.build(id, oldFeature, geometryFactory)); newValue = (SimpleFeature) (newFeature == null ? null : valueBuilder.build(id, newFeature, geometryFactory)); SimpleFeature diffFeature; diffFeatureBuilder.reset(); final ChangeType changeType = info.entry().changeType(); diffFeatureBuilder.set(BulkFeatureRetriever.DIFF_FEATURE_CHANGETYPE_ATTNAME, Integer.valueOf(changeType.value())); diffFeatureBuilder.set("old", oldValue); diffFeatureBuilder.set("new", newValue); diffFeature = diffFeatureBuilder.buildFeature(id); return diffFeature; } }
@Test public void testTreeModifiedByAddingExtraFeature() throws Exception { insertAndAdd(points1, points2); insert(points3); List<DiffEntry> difflist = toList(diffOp.setReportTrees(true).call()); assertNotNull(difflist); assertEquals(2, difflist.size()); assertEquals(ChangeType.MODIFIED, difflist.get(0).changeType()); assertEquals(TYPE.TREE, difflist.get(0).getOldObject().getType()); assertEquals(ChangeType.ADDED, difflist.get(1).changeType()); assertEquals(TYPE.FEATURE, difflist.get(1).getNewObject().getType()); }
@Override public void print(GeoGIG geogig, Console console, DiffEntry entry) throws IOException { Ansi ansi = AnsiDecorator.newAnsi(console.isAnsiSupported()); final NodeRef newObject = entry.getNewObject(); final NodeRef oldObject = entry.getOldObject(); String oldMode = shortOid(oldObject == null ? ObjectId.NULL : oldObject.getMetadataId()); String newMode = shortOid(newObject == null ? ObjectId.NULL : newObject.getMetadataId()); String oldId = shortOid(oldObject == null ? ObjectId.NULL : oldObject.getObjectId()); String newId = shortOid(newObject == null ? ObjectId.NULL : newObject.getObjectId()); ansi.a(oldMode).a(" "); ansi.a(newMode).a(" "); ansi.a(oldId).a(" "); ansi.a(newId).a(" "); ansi.fg(entry.changeType() == ADDED ? GREEN : (entry.changeType() == MODIFIED ? YELLOW : RED)); char type = entry.changeType().toString().charAt(0); ansi.a(" ").a(type).reset(); ansi.a(" ").a(formatPath(entry)); console.println(ansi.toString()); }
@Override public void print(GeoGIG geogig, Console console, DiffEntry entry) throws IOException { Ansi ansi = AnsiDecorator.newAnsi(console.isAnsiSupported()); final NodeRef newObject = entry.getNewObject(); final NodeRef oldObject = entry.getOldObject(); String oldMode = shortOid(oldObject == null ? ObjectId.NULL : oldObject.getMetadataId()); String newMode = shortOid(newObject == null ? ObjectId.NULL : newObject.getMetadataId()); String oldId = shortOid(oldObject == null ? ObjectId.NULL : oldObject.getObjectId()); String newId = shortOid(newObject == null ? ObjectId.NULL : newObject.getObjectId()); ansi.a(oldMode).a(" "); ansi.a(newMode).a(" "); ansi.a(oldId).a(" "); ansi.a(newId).a(" "); ansi.fg(entry.changeType() == ADDED ? GREEN : (entry.changeType() == MODIFIED ? YELLOW : RED)); char type = entry.changeType().toString().charAt(0); ansi.a(" ").a(type).reset(); ansi.a(" ").a(formatPath(entry)); console.println(ansi.toString()); }
@Test public void testAddMultipleFeaturesWithPathFilter() throws Exception { insert(points1); insert(points2); insert(lines1); geogig.command(AddOp.class).addPattern("Points").call(); List<DiffEntry> unstaged = toList(repo.workingTree().getUnstaged(null)); assertEquals(2, unstaged.size()); assertEquals(linesName, unstaged.get(0).newName()); assertEquals(ChangeType.ADDED, unstaged.get(0).changeType()); assertEquals(TYPE.TREE, unstaged.get(0).getNewObject().getType()); }
@Test public void testAddNewPathUsingPathFilter() throws Exception { insert(points1); insert(points2); geogig.command(AddOp.class).addPattern("Points/Points.1").call(); List<DiffEntry> unstaged = toList(repo.index().getStaged(null)); assertEquals(unstaged.toString(), 2, unstaged.size()); assertEquals(ChangeType.ADDED, unstaged.get(0).changeType()); assertEquals(RevObject.TYPE.TREE, unstaged.get(0).getNewObject().getType()); assertEquals("Points", unstaged.get(0).newName()); RevFeatureType ft = RevFeatureType.builder().type(pointsType).build(); ObjectId expectedTreeMdId = ft.getId(); assertEquals(expectedTreeMdId, unstaged.get(0).getNewObject().getMetadataId()); assertEquals(ChangeType.ADDED, unstaged.get(1).changeType()); assertEquals(RevObject.TYPE.FEATURE, unstaged.get(1).getNewObject().getType()); assertEquals("Points.1", unstaged.get(1).newName()); assertFalse("feature node's metadata id should not be set, as it uses the parent tree one", unstaged.get(1).getNewObject().getNode().getMetadataId().isPresent()); }
@SuppressWarnings("unused") @Test public void testMultipleDeletes() throws Exception { // two commits on different trees final ObjectId oid11 = insertAndAdd(points1); final ObjectId oid12 = insertAndAdd(points2); final ObjectId oid13 = insertAndAdd(points3); final RevCommit commit1 = geogig.command(CommitOp.class).setAll(true).call(); final ObjectId oid21 = insertAndAdd(lines1); final RevCommit commit2 = geogig.command(CommitOp.class).setAll(true).call(); deleteAndAdd(points1); deleteAndAdd(points3); final RevCommit commit3 = geogig.command(CommitOp.class).setAll(true).call(); List<DiffEntry> diffs; // filter on namespace1, no changes between commit1 and commit2 diffOp.setOldVersion(commit1.getId()).setNewVersion(commit3.getId()); diffOp.setFilter(pointsName); diffs = toList(diffOp.call()); assertEquals(2, diffs.size()); assertEquals(ChangeType.REMOVED, diffs.get(0).changeType()); assertEquals(ChangeType.REMOVED, diffs.get(1).changeType()); Set<ObjectId> ids = Sets.newHashSet(diffs.get(0).oldObjectId(), diffs.get(1).oldObjectId()); assertEquals(Sets.newHashSet(oid11, oid13), ids); }
@Test public void testReportTreesEmptyTreeFromFeatureDeletion() throws Exception { insert(lines1); delete(lines1); List<DiffEntry> difflist = toList(diffOp.setReportTrees(true).setOldVersion(ObjectId.NULL) .setNewVersion(Ref.WORK_HEAD).call()); assertNotNull(difflist); assertEquals(1, difflist.size()); assertEquals(linesName, difflist.get(0).newName()); DiffEntry de = difflist.get(0); assertNull(de.getOldObject()); assertNotNull(de.getNewObject()); assertEquals(linesName, de.newPath()); assertEquals(DiffEntry.ChangeType.ADDED, de.changeType()); assertEquals(ObjectId.NULL, de.oldObjectId()); assertFalse(de.getNewObject().getMetadataId().isNull()); }
@Test public void testReportTreesEmptyTree() throws Exception { WorkingTree workingTree = geogig.getRepository().workingTree(); workingTree.createTypeTree(linesName, linesType); List<DiffEntry> difflist = toList(diffOp.setReportTrees(true).setOldVersion(ObjectId.NULL) .setNewVersion(Ref.WORK_HEAD).call()); assertNotNull(difflist); assertEquals(1, difflist.size()); DiffEntry de = difflist.get(0); assertNull(de.getOldObject()); assertNotNull(de.getNewObject()); assertEquals(linesName, de.newPath()); assertEquals(DiffEntry.ChangeType.ADDED, de.changeType()); assertEquals(ObjectId.NULL, de.oldObjectId()); assertFalse(de.getNewObject().getMetadataId().isNull()); }
@Test public void testSingleAdditionReverseOrder() throws Exception { final ObjectId newOid = insertAndAdd(points1); final RevCommit commit = geogig.command(CommitOp.class).setAll(true).call(); List<DiffEntry> difflist = toList( diffOp.setOldVersion(commit.getId()).setNewVersion(ObjectId.NULL).call()); assertNotNull(difflist); assertEquals(1, difflist.size()); DiffEntry de = difflist.get(0); assertNull(de.getNewObject()); assertNotNull(de.getOldObject()); assertEquals(DiffEntry.ChangeType.REMOVED, de.changeType()); assertEquals(ObjectId.NULL, de.newObjectId()); assertEquals(newOid, de.oldObjectId()); assertFalse(de.getOldObject().getMetadataId().isNull()); }
@Test public void testSingleDeletion() throws Exception { final ObjectId featureContentId = insertAndAdd(points1); final RevCommit addCommit = geogig.command(CommitOp.class).setAll(true).call(); assertTrue(deleteAndAdd(points1)); final RevCommit deleteCommit = geogig.command(CommitOp.class).setAll(true).call(); List<DiffEntry> difflist = toList( diffOp.setOldVersion(addCommit.getId()).setNewVersion(deleteCommit.getId()).call()); final String path = NodeRef.appendChild(pointsName, points1.getIdentifier().getID()); assertNotNull(difflist); assertEquals(1, difflist.size()); DiffEntry de = difflist.get(0); assertEquals(path, de.oldPath()); assertEquals(DiffEntry.ChangeType.REMOVED, de.changeType()); assertEquals(featureContentId, de.oldObjectId()); assertEquals(ObjectId.NULL, de.newObjectId()); }
@Test public void testSingleModification() throws Exception { final ObjectId oldOid = insertAndAdd(points1); final RevCommit insertCommit = geogig.command(CommitOp.class).setAll(true).call(); final ObjectId newOid = insertAndAdd(points1_modified); final RevCommit changeCommit = geogig.command(CommitOp.class).setAll(true).call(); List<DiffEntry> difflist = toList(diffOp.setOldVersion(insertCommit.getId()) .setNewVersion(changeCommit.getId()).call()); assertNotNull(difflist); assertEquals(1, difflist.size()); DiffEntry de = difflist.get(0); String expectedPath = NodeRef.appendChild(pointsName, points1.getIdentifier().getID()); assertEquals(expectedPath, de.newPath()); assertEquals(DiffEntry.ChangeType.MODIFIED, de.changeType()); assertEquals(oldOid, de.oldObjectId()); assertEquals(newOid, de.newObjectId()); }
@Test public void testSingleAddition() throws Exception { final ObjectId newOid = insertAndAdd(points1); geogig.command(CommitOp.class).setAll(true).call(); List<DiffEntry> difflist = toList( diffOp.setOldVersion(ObjectId.NULL).setNewVersion(Ref.HEAD).call()); assertNotNull(difflist); assertEquals(1, difflist.size()); DiffEntry de = difflist.get(0); assertNull(de.getOldObject()); assertNotNull(de.getNewObject()); String expectedPath = NodeRef.appendChild(pointsName, points1.getIdentifier().getID()); assertEquals(expectedPath, de.newPath()); assertEquals(DiffEntry.ChangeType.ADDED, de.changeType()); assertEquals(ObjectId.NULL, de.oldObjectId()); assertEquals(newOid, de.newObjectId()); assertFalse(de.getNewObject().getMetadataId().isNull()); }
@Test public void testSingleDeletionReverseOrder() throws Exception { final ObjectId featureContentId = insertAndAdd(points1); final RevCommit addCommit = geogig.command(CommitOp.class).setAll(true).call(); assertTrue(deleteAndAdd(points1)); final RevCommit deleteCommit = geogig.command(CommitOp.class).setAll(true).call(); // set old/new version in reverse order List<DiffEntry> difflist = toList( diffOp.setOldVersion(deleteCommit.getId()).setNewVersion(addCommit.getId()).call()); final String path = NodeRef.appendChild(pointsName, points1.getIdentifier().getID()); // then the diff should report an ADD instead of a DELETE assertNotNull(difflist); assertEquals(1, difflist.size()); DiffEntry de = difflist.get(0); assertNull(de.oldPath()); assertEquals(path, de.newPath()); assertEquals(DiffEntry.ChangeType.ADDED, de.changeType()); assertEquals(ObjectId.NULL, de.oldObjectId()); assertEquals(featureContentId, de.newObjectId()); }