### Question:
GeogigFeatureStore extends ContentFeatureStore { @Override public void modifyFeatures(Name[] names, Object[] values, Filter filter) throws IOException { Preconditions.checkState(getDataStore().isAllowTransactions(), "Transactions not supported; head is not a local branch"); final WorkingTree workingTree = delegate.getWorkingTree(); final String path = delegate.getTypeTreePath(); Iterator<SimpleFeature> features = modifyingFeatureIterator(names, values, filter); final SimpleFeatureType nativeSchema = delegate.getNativeType(); features = Iterators.transform(features, new SchemaInforcer(nativeSchema)); try { ProgressListener listener = new DefaultProgressListener(); Integer count = (Integer) null; List<Node> target = (List<Node>) null; workingTree.insert(path, features, listener, target, count); } catch (Exception e) { throw new IOException(e); } } GeogigFeatureStore(ContentEntry entry); @Override GeoGigDataStore getDataStore(); GeogigFeatureSource getFeatureSource(); @Override ContentEntry getEntry(); @Override ResourceInfo getInfo(); @Override Name getName(); @Override QueryCapabilities getQueryCapabilities(); @Override ContentState getState(); @Override synchronized Transaction getTransaction(); @Override synchronized void setTransaction(Transaction transaction); @Override final List<FeatureId> addFeatures(
            FeatureCollection<SimpleFeatureType, SimpleFeature> featureCollection); @Override void modifyFeatures(Name[] names, Object[] values, Filter filter); @Override void removeFeatures(Filter filter);  }### Answer:
@Test public void testModifyFeatures() throws Exception { insertAndAdd(lines1, lines2, lines3, points1, points2, points3); geogig.command(CommitOp.class).call(); Id filter = ff.id(Collections.singleton(ff.featureId(idP1))); Transaction tx = new DefaultTransaction(); points.setTransaction(tx); try { SimpleFeature initial = points.getFeatures(filter).features().next(); assertEquals("StringProp1_1", initial.getAttribute("sp")); points.modifyFeatures("sp", "modified", filter); SimpleFeature modified = points.getFeatures(filter).features().next(); assertEquals("modified", modified.getAttribute("sp")); assertEquals("StringProp1_1", dataStore.getFeatureSource(pointsTypeName).getFeatures(filter).features() .next().getAttribute("sp")); tx.commit(); assertEquals("modified", dataStore.getFeatureSource(pointsTypeName).getFeatures(filter) .features().next().getAttribute("sp")); } catch (Exception e) { tx.rollback(); throw e; } finally { tx.close(); } points.setTransaction(Transaction.AUTO_COMMIT); SimpleFeature modified = points.getFeatures(filter).features().next(); assertEquals("modified", modified.getAttribute("sp")); }