/** * @see org.geotools.data.FeatureStore#modifyFeatures(org.opengis.feature.type.Name[], * java.lang.Object[], org.opengis.filter.Filter) */ @Override public void modifyFeatures( final Name[] attributeNames, final Object[] attributeValues, final Filter filter) throws IOException { final FeatureStore<T, F> unversioned = getUnversionedStore(); final boolean versioned = isVersioned(); Id affectedFeaturesFitler = null; Filter unversionedFilter = filter; if (versioned) { checkTransaction(); // throws exception if filter has a resourceid that doesn't match // the current version checkEditFilterMatchesCurrentVersion(filter); unversionedFilter = VersionFilters.getUnversioningFilter(filter); if (unversionedFilter instanceof Id) { affectedFeaturesFitler = (Id) unversionedFilter; } else { FeatureCollection<T, F> affectedFeatures; affectedFeatures = unversioned.getFeatures(unversionedFilter); FeatureIterator<F> iterator = affectedFeatures.features(); Set<Identifier> affectedIds = new HashSet<Identifier>(); try { while (iterator.hasNext()) { affectedIds.add(iterator.next().getIdentifier()); } } finally { iterator.close(); } final FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(null); affectedFeaturesFitler = ff.id(affectedIds); } } unversioned.modifyFeatures(attributeNames, attributeValues, unversionedFilter); if (versioned && affectedFeaturesFitler != null && affectedFeaturesFitler.getIdentifiers().size() > 0) { try { FeatureCollection newValues = unversioned.getFeatures(affectedFeaturesFitler); getVersioningState().stageUpdate(getSchema().getName(), newValues); } catch (Exception e) { Throwables.propagate(e); } } }
/** * Throws an IllegalArgumentException if {@code filter} contains a resource filter that doesn't * match the current version of a feature * * @param filter original upate filter */ private void checkEditFilterMatchesCurrentVersion(final Filter filter) { final Id versionFilter = VersionFilters.getVersioningFilter(filter); if (versionFilter == null) { return; } // don't allow non current versions GeoGIT ggit = new GeoGIT(repository); VersionQuery query = new VersionQuery(ggit, getSchema().getName()); for (Identifier id : versionFilter.getIdentifiers()) { ResourceId rid = (ResourceId) id; List<Ref> requested; List<Ref> current; try { requested = Lists.newArrayList(query.get(rid)); current = Lists.newArrayList(query.get(new ResourceIdImpl(rid.getID(), null))); } catch (Exception e) { throw new RuntimeException(e); } if (!current.equals(requested)) { throw new IllegalArgumentException( "Requested resource id filter doesn't match curent version for feature " + rid.getID()); } } }