use of org.locationtech.geogig.api.RevFeatureType in project GeoGig by boundlessgeo.
the class CatWebOp method run.
/**
* Runs the command and builds the appropriate response
*
* @param context - the context to use for this command
*
* @throws CommandSpecException
*/
@Override
public void run(CommandContext context) {
Preconditions.checkArgument(object != null && !object.equals(ObjectId.NULL));
final Context geogig = this.getCommandLocator(context);
Preconditions.checkState(geogig.stagingDatabase().exists(object));
final RevObject revObject = geogig.stagingDatabase().get(object);
switch(revObject.getType()) {
case COMMIT:
context.setResponseContent(new CommandResponse() {
@Override
public void write(ResponseWriter out) throws Exception {
out.start();
out.writeCommit((RevCommit) revObject, "commit", null, null, null);
out.finish();
}
});
break;
case TREE:
context.setResponseContent(new CommandResponse() {
@Override
public void write(ResponseWriter out) throws Exception {
out.start();
out.writeTree((RevTree) revObject, "tree");
out.finish();
}
});
break;
case FEATURE:
context.setResponseContent(new CommandResponse() {
@Override
public void write(ResponseWriter out) throws Exception {
out.start();
out.writeFeature((RevFeature) revObject, "feature");
out.finish();
}
});
break;
case FEATURETYPE:
context.setResponseContent(new CommandResponse() {
@Override
public void write(ResponseWriter out) throws Exception {
out.start();
out.writeFeatureType((RevFeatureType) revObject, "featuretype");
out.finish();
}
});
break;
case TAG:
context.setResponseContent(new CommandResponse() {
@Override
public void write(ResponseWriter out) throws Exception {
out.start();
out.writeTag((RevTag) revObject, "tag");
out.finish();
}
});
break;
}
}
use of org.locationtech.geogig.api.RevFeatureType 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.RevFeatureType in project GeoGig by boundlessgeo.
the class Insert method createFeature.
private Feature createFeature(List<String> featureChanges, Map<String, SimpleFeatureBuilder> featureTypes) {
String path = featureChanges.get(0);
String tree = NodeRef.parentPath(path);
String featureId = NodeRef.nodeFromPath(path);
if (!featureTypes.containsKey(tree)) {
Optional<RevFeatureType> opt = geogig.command(ResolveFeatureType.class).setRefSpec("WORK_HEAD:" + tree).call();
checkParameter(opt.isPresent(), "The parent tree does not exist: " + tree);
SimpleFeatureBuilder builder = new SimpleFeatureBuilder((SimpleFeatureType) opt.get().type());
featureTypes.put(tree, builder);
}
SimpleFeatureBuilder ftb = featureTypes.get(tree);
SimpleFeatureType ft = ftb.getFeatureType();
for (int i = 1; i < featureChanges.size(); i++) {
String[] tokens = featureChanges.get(i).split("\t");
Preconditions.checkArgument(tokens.length == 2, "Wrong attribute definition: " + featureChanges.get(i));
String fieldName = tokens[0];
AttributeDescriptor desc = ft.getDescriptor(fieldName);
Preconditions.checkNotNull(desc, "Wrong attribute in feature description");
FieldType type = FieldType.forBinding(desc.getType().getBinding());
Object value = TextValueSerializer.fromString(type, tokens[1]);
ftb.set(tokens[0], value);
}
return ftb.buildFeature(featureId);
}
use of org.locationtech.geogig.api.RevFeatureType 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.RevFeatureType 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();
}
Aggregations