use of org.locationtech.geogig.api.NodeRef in project GeoGig by boundlessgeo.
the class DiffTree method runInternal.
/**
* Executes the diff-tree command with the specified options.
*/
@Override
protected void runInternal(GeogigCLI cli) throws IOException {
if (refSpec.size() > 2) {
throw new CommandFailedException("Tree refspecs list is too long :" + refSpec);
}
if (treeStats && describe) {
throw new CommandFailedException("Cannot use --describe and --tree-stats simultaneously");
}
GeoGIG geogig = cli.getGeogig();
org.locationtech.geogig.api.plumbing.DiffTree diff = geogig.command(org.locationtech.geogig.api.plumbing.DiffTree.class);
String oldVersion = resolveOldVersion();
String newVersion = resolveNewVersion();
diff.setOldVersion(oldVersion).setNewVersion(newVersion);
Iterator<DiffEntry> diffEntries;
if (paths.isEmpty()) {
diffEntries = diff.setProgressListener(cli.getProgressListener()).call();
} else {
diffEntries = Iterators.emptyIterator();
for (String path : paths) {
Iterator<DiffEntry> moreEntries = diff.setPathFilter(path).setProgressListener(cli.getProgressListener()).call();
diffEntries = Iterators.concat(diffEntries, moreEntries);
}
}
DiffEntry diffEntry;
HashMap<String, Long[]> stats = Maps.newHashMap();
while (diffEntries.hasNext()) {
diffEntry = diffEntries.next();
StringBuilder sb = new StringBuilder();
String path = diffEntry.newPath() != null ? diffEntry.newPath() : diffEntry.oldPath();
if (describe) {
sb.append(diffEntry.changeType().toString().charAt(0)).append(' ').append(path).append(LINE_BREAK);
if (diffEntry.changeType() == ChangeType.MODIFIED) {
FeatureDiff featureDiff = geogig.command(DiffFeature.class).setNewVersion(Suppliers.ofInstance(diffEntry.getNewObject())).setOldVersion(Suppliers.ofInstance(diffEntry.getOldObject())).call();
Map<PropertyDescriptor, AttributeDiff> diffs = featureDiff.getDiffs();
HashSet<PropertyDescriptor> diffDescriptors = Sets.newHashSet(diffs.keySet());
NodeRef noderef = diffEntry.changeType() != ChangeType.REMOVED ? diffEntry.getNewObject() : diffEntry.getOldObject();
RevFeatureType featureType = geogig.command(RevObjectParse.class).setObjectId(noderef.getMetadataId()).call(RevFeatureType.class).get();
Optional<RevObject> obj = geogig.command(RevObjectParse.class).setObjectId(noderef.objectId()).call();
RevFeature feature = (RevFeature) obj.get();
ImmutableList<Optional<Object>> values = feature.getValues();
ImmutableList<PropertyDescriptor> descriptors = featureType.sortedDescriptors();
int idx = 0;
for (PropertyDescriptor descriptor : descriptors) {
if (diffs.containsKey(descriptor)) {
AttributeDiff ad = diffs.get(descriptor);
sb.append(ad.getType().toString().charAt(0) + " " + descriptor.getName().toString() + LINE_BREAK);
if (!ad.getType().equals(TYPE.ADDED)) {
Object value = ad.getOldValue().orNull();
sb.append(TextValueSerializer.asString(Optional.fromNullable(value)));
sb.append(LINE_BREAK);
}
if (!ad.getType().equals(TYPE.REMOVED)) {
Object value = ad.getNewValue().orNull();
sb.append(TextValueSerializer.asString(Optional.fromNullable(value)));
sb.append(LINE_BREAK);
}
diffDescriptors.remove(descriptor);
} else {
sb.append("U ").append(descriptor.getName().toString()).append(LINE_BREAK);
sb.append(TextValueSerializer.asString(values.get(idx))).append(LINE_BREAK);
}
idx++;
}
for (PropertyDescriptor descriptor : diffDescriptors) {
AttributeDiff ad = diffs.get(descriptor);
sb.append(ad.getType().toString().charAt(0) + " " + descriptor.getName().toString() + LINE_BREAK);
if (!ad.getType().equals(TYPE.ADDED)) {
Object value = ad.getOldValue().orNull();
sb.append(TextValueSerializer.asString(Optional.fromNullable(value)));
sb.append(LINE_BREAK);
}
if (!ad.getType().equals(TYPE.REMOVED)) {
Object value = ad.getNewValue().orNull();
sb.append(TextValueSerializer.asString(Optional.fromNullable(value)));
sb.append(LINE_BREAK);
}
}
} else {
NodeRef noderef = diffEntry.changeType() == ChangeType.ADDED ? diffEntry.getNewObject() : diffEntry.getOldObject();
RevFeatureType featureType = geogig.command(RevObjectParse.class).setObjectId(noderef.getMetadataId()).call(RevFeatureType.class).get();
Optional<RevObject> obj = geogig.command(RevObjectParse.class).setObjectId(noderef.objectId()).call();
RevFeature feature = (RevFeature) obj.get();
ImmutableList<Optional<Object>> values = feature.getValues();
int i = 0;
for (Optional<Object> value : values) {
sb.append(diffEntry.changeType().toString().charAt(0));
sb.append(' ');
sb.append(featureType.sortedDescriptors().get(i).getName().toString());
sb.append(LINE_BREAK);
sb.append(TextValueSerializer.asString(value));
sb.append(LINE_BREAK);
i++;
}
sb.append(LINE_BREAK);
}
sb.append(LINE_BREAK);
cli.getConsole().println(sb.toString());
} else if (treeStats) {
String parent = NodeRef.parentPath(path);
if (!stats.containsKey(parent)) {
stats.put(parent, new Long[] { 0l, 0l, 0l });
}
Long[] counts = stats.get(parent);
if (diffEntry.changeType() == ChangeType.ADDED) {
counts[0]++;
} else if (diffEntry.changeType() == ChangeType.REMOVED) {
counts[1]++;
} else if (diffEntry.changeType() == ChangeType.MODIFIED) {
counts[2]++;
}
} else {
sb.append(path).append(' ');
sb.append(diffEntry.oldObjectId().toString());
sb.append(' ');
sb.append(diffEntry.newObjectId().toString());
cli.getConsole().println(sb.toString());
}
}
if (treeStats) {
for (String path : stats.keySet()) {
StringBuffer sb = new StringBuffer();
sb.append(path);
Long[] counts = stats.get(path);
for (int i = 0; i < counts.length; i++) {
sb.append(" " + counts[i].toString());
}
cli.getConsole().println(sb.toString());
}
}
}
use of org.locationtech.geogig.api.NodeRef in project GeoGig by boundlessgeo.
the class WorkingTreeInsertHelper method findOrCreateTree.
private NodeRef findOrCreateTree(final String treePath, final FeatureType type) {
RevTree tree = context.command(FindOrCreateSubtree.class).setChildPath(treePath).setIndex(true).setParent(workHead).setParentPath(NodeRef.ROOT).call();
ObjectId metadataId = ObjectId.NULL;
if (type != null) {
RevFeatureType revFeatureType = RevFeatureTypeImpl.build(type);
if (tree.isEmpty()) {
indexDatabase.put(revFeatureType);
}
metadataId = revFeatureType.getId();
}
Envelope bounds = SpatialOps.boundsOf(tree);
Node node = Node.create(NodeRef.nodeFromPath(treePath), tree.getId(), metadataId, TYPE.TREE, bounds);
String parentPath = NodeRef.parentPath(treePath);
return new NodeRef(node, parentPath, ObjectId.NULL);
}
use of org.locationtech.geogig.api.NodeRef in project GeoGig by boundlessgeo.
the class WorkingTree method createTypeTree.
public synchronized NodeRef createTypeTree(final String treePath, final FeatureType featureType) {
final RevTree workHead = getTree();
Optional<NodeRef> typeTreeRef = context.command(FindTreeChild.class).setIndex(true).setParent(workHead).setChildPath(treePath).call();
final RevFeatureType revType = RevFeatureTypeImpl.build(featureType);
if (typeTreeRef.isPresent()) {
throw new IllegalArgumentException("Tree already exists at " + treePath);
}
indexDatabase.put(revType);
final ObjectId metadataId = revType.getId();
final RevTree newTree = new RevTreeBuilder(indexDatabase).build();
ObjectId newWorkHeadId = context.command(WriteBack.class).setToIndex(true).setAncestor(workHead.builder(indexDatabase)).setChildPath(treePath).setTree(newTree).setMetadataId(metadataId).call();
updateWorkHead(newWorkHeadId);
return context.command(FindTreeChild.class).setIndex(true).setParent(getTree()).setChildPath(treePath).call().get();
}
use of org.locationtech.geogig.api.NodeRef in project GeoGig by boundlessgeo.
the class WorkingTree method insert.
/**
* Insert a single feature into the working tree and updates the WORK_HEAD ref.
*
* @param parentTreePath path of the parent tree to insert the feature into
* @param feature the feature to insert
*/
public Node insert(final String parentTreePath, final Feature feature) {
final FeatureType featureType = feature.getType();
NodeRef treeRef;
Optional<NodeRef> typeTreeRef = context.command(FindTreeChild.class).setIndex(true).setParent(getTree()).setChildPath(parentTreePath).call();
ObjectId metadataId;
if (typeTreeRef.isPresent()) {
treeRef = typeTreeRef.get();
RevFeatureType newFeatureType = RevFeatureTypeImpl.build(featureType);
metadataId = newFeatureType.getId().equals(treeRef.getMetadataId()) ? ObjectId.NULL : newFeatureType.getId();
if (!newFeatureType.getId().equals(treeRef.getMetadataId())) {
indexDatabase.put(newFeatureType);
}
} else {
treeRef = createTypeTree(parentTreePath, featureType);
// treeRef.getMetadataId();
metadataId = ObjectId.NULL;
}
// ObjectId metadataId = treeRef.getMetadataId();
final Node node = putInDatabase(feature, metadataId);
RevTreeBuilder parentTree = context.command(FindOrCreateSubtree.class).setIndex(true).setParent(Suppliers.ofInstance(Optional.of(getTree()))).setChildPath(parentTreePath).call().builder(indexDatabase);
parentTree.put(node);
final ObjectId treeMetadataId = treeRef.getMetadataId();
ObjectId newTree = context.command(WriteBack.class).setAncestor(getTreeSupplier()).setChildPath(parentTreePath).setToIndex(true).setTree(parentTree.build()).setMetadataId(treeMetadataId).call();
updateWorkHead(newTree);
final String featurePath = NodeRef.appendChild(parentTreePath, node.getName());
Optional<NodeRef> featureRef = context.command(FindTreeChild.class).setIndex(true).setParent(getTree()).setChildPath(featurePath).call();
return featureRef.get().getNode();
}
use of org.locationtech.geogig.api.NodeRef in project GeoGig by boundlessgeo.
the class FormatCommonV1 method readNodeRef.
public static NodeRef readNodeRef(DataInput in) throws IOException {
Node node = readNode(in);
final byte[] metadataId = new byte[20];
in.readFully(metadataId);
String parentPath = in.readUTF();
return new NodeRef(node, parentPath, ObjectId.createNoClone(metadataId));
}
Aggregations