use of org.locationtech.geogig.api.RevFeature in project GeoGig by boundlessgeo.
the class OSMUnmapOp method unmapNode.
private void unmapNode(SimpleFeature feature, FeatureMapFlusher mapFlusher) {
boolean modified = false;
String id = feature.getID();
SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(OSMUtils.nodeType());
Optional<RevFeature> rawFeature = command(RevObjectParse.class).setRefSpec("WORK_HEAD:" + OSMUtils.NODE_TYPE_NAME + "/" + id).call(RevFeature.class);
Map<String, String> tagsMap = Maps.newHashMap();
long timestamp = System.currentTimeMillis();
int version = 1;
long changeset = -1;
String user = UNKNOWN_USER;
Collection<Tag> tags = Lists.newArrayList();
if (rawFeature.isPresent()) {
ImmutableList<Optional<Object>> values = rawFeature.get().getValues();
tags = OSMUtils.buildTagsCollectionFromString(values.get(NODE_TAGS_FIELD_INDEX).get().toString());
for (Tag tag : tags) {
tagsMap.put(tag.getKey(), tag.getValue());
}
Optional<Object> timestampOpt = values.get(NODE_TIMESTAMP_FIELD_INDEX);
if (timestampOpt.isPresent()) {
timestamp = ((Long) timestampOpt.get()).longValue();
}
Optional<Object> versionOpt = values.get(NODE_VERSION_FIELD_INDEX);
if (versionOpt.isPresent()) {
version = ((Integer) versionOpt.get()).intValue();
}
Optional<Object> changesetOpt = values.get(NODE_CHANGESET_FIELD_INDEX);
if (changesetOpt.isPresent()) {
changeset = ((Long) changesetOpt.get()).longValue();
}
Optional<Object> userOpt = values.get(NODE_USER_FIELD_INDEX);
if (userOpt.isPresent()) {
user = (String) userOpt.get();
}
}
Map<String, String> unaliased = Maps.newHashMap();
Collection<Property> properties = feature.getProperties();
for (Property property : properties) {
String name = property.getName().getLocalPart();
if (name.equals("id") || Geometry.class.isAssignableFrom(property.getDescriptor().getType().getBinding())) {
continue;
}
Object value = property.getValue();
if (value != null) {
String tagName = name;
if (mapping != null) {
if (unaliased.containsKey(name)) {
tagName = unaliased.get(name);
} else {
tagName = mapping.getTagNameFromAlias(path, tagName);
unaliased.put(name, tagName);
}
}
if (!DefaultField.isDefaultField(tagName)) {
if (tagsMap.containsKey(tagName)) {
if (!modified) {
String oldValue = tagsMap.get(tagName);
modified = !value.equals(oldValue);
}
} else {
modified = true;
}
tagsMap.put(tagName, value.toString());
}
}
}
if (!modified && rawFeature.isPresent()) {
// no changes after unmapping tags, so there's nothing else to do
return;
}
Collection<Tag> newTags = Lists.newArrayList();
Set<Entry<String, String>> entries = tagsMap.entrySet();
for (Entry<String, String> entry : entries) {
newTags.add(new Tag(entry.getKey(), entry.getValue()));
}
featureBuilder.set("tags", OSMUtils.buildTagsString(newTags));
featureBuilder.set("location", feature.getDefaultGeometry());
featureBuilder.set("changeset", changeset);
featureBuilder.set("timestamp", timestamp);
featureBuilder.set("version", version);
featureBuilder.set("user", user);
featureBuilder.set("visible", true);
if (rawFeature.isPresent()) {
// the feature has changed, so we cannot reuse some attributes.
// We reconstruct the feature and insert it
featureBuilder.set("timestamp", System.currentTimeMillis());
featureBuilder.set("changeset", null);
featureBuilder.set("version", null);
featureBuilder.set("visible", true);
mapFlusher.put("node", featureBuilder.buildFeature(id));
} else {
// The feature didn't exist, so we have to add it
mapFlusher.put("node", featureBuilder.buildFeature(id));
}
}
use of org.locationtech.geogig.api.RevFeature in project GeoGig by boundlessgeo.
the class RevFeatureSerializationTest method testFeatureReadWrite.
protected void testFeatureReadWrite(Feature feature) throws Exception {
RevFeature newFeature = RevFeatureBuilder.build(feature);
ObjectWriter<RevFeature> writer = factory.<RevFeature>createObjectWriter(TYPE.FEATURE);
ByteArrayOutputStream output = new ByteArrayOutputStream();
writer.write(newFeature, output);
byte[] data = output.toByteArray();
assertTrue(data.length > 0);
ObjectReader<RevFeature> reader = factory.<RevFeature>createObjectReader(TYPE.FEATURE);
ByteArrayInputStream input = new ByteArrayInputStream(data);
RevFeature feat = reader.read(newFeature.getId(), input);
assertNotNull(feat);
assertEquals(newFeature.getValues().size(), feat.getValues().size());
for (int i = 0; i < newFeature.getValues().size(); i++) {
assertEquals(newFeature.getValues().get(i).orNull(), feat.getValues().get(i).orNull());
}
}
use of org.locationtech.geogig.api.RevFeature in project GeoGig by boundlessgeo.
the class RevFeatureTextSerializationTest method testMalformedSerializedObject.
@Test
public void testMalformedSerializedObject() throws Exception {
// a wrong value
ByteArrayOutputStream out = new ByteArrayOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");
writer.write(TYPE.FEATURE.name() + "\n");
writer.write(FieldType.FLOAT.name() + "\tNUMBER" + "\n");
writer.flush();
ObjectReader<RevFeature> reader = factory.createFeatureReader();
try {
reader.read(ObjectId.forString("ID_STRING"), new ByteArrayInputStream(out.toByteArray()));
fail();
} catch (Exception e) {
assertTrue(e.getMessage().contains("wrong value"));
}
// an unrecognized class
out = new ByteArrayOutputStream();
writer = new OutputStreamWriter(out, "UTF-8");
writer.write(TYPE.FEATURE.name() + "\n");
writer.write(this.getClass().getName() + "\tvalue" + "\n");
writer.flush();
try {
reader.read(ObjectId.forString("ID_STRING"), new ByteArrayInputStream(out.toByteArray()));
fail();
} catch (Exception e) {
assertTrue(e.getMessage().contains("Wrong type name"));
}
// a wrong category
out = new ByteArrayOutputStream();
writer = new OutputStreamWriter(out, "UTF-8");
writer.write(TYPE.COMMIT.name() + "\n");
writer.flush();
reader = factory.createFeatureReader();
try {
reader.read(ObjectId.forString("ID_STRING"), new ByteArrayInputStream(out.toByteArray()));
fail();
} catch (Exception e) {
assertTrue(e.getMessage().equals("Wrong type: COMMIT"));
}
}
use of org.locationtech.geogig.api.RevFeature in project GeoGig by boundlessgeo.
the class Show method printFormatted.
public void printFormatted(GeogigCLI cli) throws IOException {
ConsoleReader console = cli.getConsole();
GeoGIG geogig = cli.getGeogig();
for (String ref : refs) {
Optional<RevObject> obj = geogig.command(RevObjectParse.class).setRefSpec(ref).call();
if (!obj.isPresent()) {
ref = getFullRef(ref);
obj = geogig.command(RevObjectParse.class).setRefSpec(ref).call();
}
checkParameter(obj.isPresent(), "refspec did not resolve to any object.");
RevObject revObject = obj.get();
if (revObject instanceof RevFeature) {
Optional<RevFeatureType> opt = geogig.command(ResolveFeatureType.class).setRefSpec(ref).call();
if (opt.isPresent()) {
RevFeatureType ft = opt.get();
ImmutableList<PropertyDescriptor> attribs = ft.sortedDescriptors();
RevFeature feature = (RevFeature) revObject;
Ansi ansi = super.newAnsi(console.getTerminal());
ansi.newline().fg(Color.YELLOW).a("ID: ").reset().a(feature.getId().toString()).newline();
ansi.fg(Color.YELLOW).a("FEATURE TYPE ID: ").reset().a(ft.getId().toString()).newline().newline();
ansi.a("ATTRIBUTES ").newline();
ansi.a("---------- ").newline();
ImmutableList<Optional<Object>> values = feature.getValues();
int i = 0;
for (Optional<Object> value : values) {
ansi.fg(Color.YELLOW).a(attribs.get(i).getName() + ": ").reset();
ansi.a(value.or("[NULL]").toString()).newline();
i++;
}
console.println(ansi.toString());
} else {
CharSequence s = geogig.command(CatObject.class).setObject(Suppliers.ofInstance(revObject)).call();
console.println(s);
}
} else if (revObject instanceof RevTree) {
RevTree tree = (RevTree) revObject;
Optional<RevFeatureType> opt = geogig.command(ResolveFeatureType.class).setRefSpec(ref).call();
checkParameter(opt.isPresent(), "Refspec must resolve to a commit, tree, feature or feature type");
RevFeatureType ft = opt.get();
Ansi ansi = super.newAnsi(console.getTerminal());
ansi.fg(Color.YELLOW).a("TREE ID: ").reset().a(tree.getId().toString()).newline();
ansi.fg(Color.YELLOW).a("SIZE: ").reset().a(Long.toString(tree.size())).newline();
ansi.fg(Color.YELLOW).a("NUMBER Of SUBTREES: ").reset().a(Integer.toString(tree.numTrees()).toString()).newline();
printFeatureType(ansi, ft, true);
console.println(ansi.toString());
} else if (revObject instanceof RevCommit) {
RevCommit commit = (RevCommit) revObject;
Ansi ansi = super.newAnsi(console.getTerminal());
ansi.a(Strings.padEnd("Commit:", 15, ' ')).fg(Color.YELLOW).a(commit.getId().toString()).reset().newline();
ansi.a(Strings.padEnd("Author:", 15, ' ')).fg(Color.GREEN).a(formatPerson(commit.getAuthor())).reset().newline();
ansi.a(Strings.padEnd("Committer:", 15, ' ')).fg(Color.GREEN).a(formatPerson(commit.getAuthor())).reset().newline();
ansi.a(Strings.padEnd("Author date:", 15, ' ')).a("(").fg(Color.RED).a(estimateSince(geogig.getPlatform(), commit.getAuthor().getTimestamp())).reset().a(") ").a(new Date(commit.getAuthor().getTimestamp())).newline();
ansi.a(Strings.padEnd("Committer date:", 15, ' ')).a("(").fg(Color.RED).a(estimateSince(geogig.getPlatform(), commit.getCommitter().getTimestamp())).reset().a(") ").a(new Date(commit.getCommitter().getTimestamp())).newline();
ansi.a(Strings.padEnd("Subject:", 15, ' ')).a(commit.getMessage()).newline();
console.println(ansi.toString());
} else if (revObject instanceof RevFeatureType) {
Ansi ansi = super.newAnsi(console.getTerminal());
printFeatureType(ansi, (RevFeatureType) revObject, false);
console.println(ansi.toString());
} else {
throw new InvalidParameterException("Refspec must resolve to a commit, tree, feature or feature type");
}
console.println();
}
}
use of org.locationtech.geogig.api.RevFeature in project GeoGig by boundlessgeo.
the class Show method printRaw.
private void printRaw(GeogigCLI cli) throws IOException {
ConsoleReader console = cli.getConsole();
GeoGIG geogig = cli.getGeogig();
for (String ref : refs) {
Optional<RevObject> obj = geogig.command(RevObjectParse.class).setRefSpec(ref).call();
if (!obj.isPresent()) {
ref = getFullRef(ref);
obj = geogig.command(RevObjectParse.class).setRefSpec(ref).call();
}
checkParameter(obj.isPresent(), "refspec did not resolve to any object.");
RevObject revObject = obj.get();
if (revObject instanceof RevFeature) {
Optional<RevFeatureType> opt = geogig.command(ResolveFeatureType.class).setRefSpec(ref).call();
if (opt.isPresent()) {
RevFeatureType ft = opt.get();
ImmutableList<PropertyDescriptor> attribs = ft.sortedDescriptors();
RevFeature feature = (RevFeature) revObject;
Ansi ansi = super.newAnsi(console.getTerminal());
ansi.a(ref).newline();
ansi.a(feature.getId().toString()).newline();
ImmutableList<Optional<Object>> values = feature.getValues();
int i = 0;
for (Optional<Object> value : values) {
PropertyDescriptor attrib = attribs.get(i);
ansi.a(attrib.getName()).newline();
PropertyType attrType = attrib.getType();
String typeName = FieldType.forBinding(attrType.getBinding()).name();
if (attrType instanceof GeometryType) {
GeometryType gt = (GeometryType) attrType;
CoordinateReferenceSystem crs = gt.getCoordinateReferenceSystem();
String crsText = CrsTextSerializer.serialize(crs);
ansi.a(typeName).a(" ").a(crsText).newline();
} else {
ansi.a(typeName).newline();
}
ansi.a(value.or("[NULL]").toString()).newline();
i++;
}
console.println(ansi.toString());
} else {
CharSequence s = geogig.command(CatObject.class).setObject(Suppliers.ofInstance(revObject)).call();
console.println(s);
}
} else {
CharSequence s = geogig.command(CatObject.class).setObject(Suppliers.ofInstance(revObject)).call();
console.println(s);
}
}
}
Aggregations