Пример #1
0
  /**
   * @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);
      }
    }
  }
Пример #2
0
 /**
  * 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());
     }
   }
 }