Author: jsorel
Date: Wed Feb 14 10:37:11 2018
New Revision: 1824217
URL: http://svn.apache.org/viewvc?rev=1824217&view=rev
Log:
Storage : split Aggregate/FeatureSet in read/write interfaces, add
FileSystemResource and Transaction
Added:
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceTransaction.java
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TransactionalResource.java
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableAggregate.java
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableFeatureSet.java
Modified:
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/Aggregate.java
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSet.java
Added:
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceTransaction.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceTransaction.java?rev=1824217&view=auto
==============================================================================
---
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceTransaction.java
(added)
+++
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceTransaction.java
Wed Feb 14 10:37:11 2018
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.internal.storage;
+
+import org.apache.sis.storage.Aggregate;
+import org.apache.sis.storage.DataStoreException;
+import org.apache.sis.storage.Resource;
+
+/**
+ * A transaction resource.
+ * This transaction include both this resource and all children resources
+ * if it is an {@linkplain Aggregate}.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @since 1.0
+ * @module
+ */
+public interface ResourceTransaction extends Resource {
+
+ /**
+ * Apply all the changes made in this transaction.
+ *
+ * @throws DataStoreException
+ */
+ void commit() throws DataStoreException;
+
+ /**
+ * Revert all changes made in this session.
+ *
+ * @throws DataStoreException
+ */
+ void rollback() throws DataStoreException;
+
+}
Added:
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TransactionalResource.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TransactionalResource.java?rev=1824217&view=auto
==============================================================================
---
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TransactionalResource.java
(added)
+++
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TransactionalResource.java
Wed Feb 14 10:37:11 2018
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.internal.storage;
+
+import org.apache.sis.storage.DataStoreException;
+import org.apache.sis.storage.Resource;
+
+/**
+ * This interface identify resources which support a transactional procedure.
+ * Example : Databases, WFS
+ *
+ * @author Johann Sorel (Geomatys)
+ * @since 1.0
+ * @module
+ */
+public interface TransactionalResource extends Resource {
+
+ /**
+ * Start a new transaction on this resource.
+ * The returned resource should have the same capabilities of this
+ * resource and writing capabilities.
+ *
+ * @return new TransactionResource
+ * @throws org.apache.sis.storage.DataStoreException
+ */
+ ResourceTransaction newTransaction() throws DataStoreException;
+
+}
Modified:
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/Aggregate.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/Aggregate.java?rev=1824217&r1=1824216&r2=1824217&view=diff
==============================================================================
---
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/Aggregate.java
[UTF-8] (original)
+++
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/Aggregate.java
[UTF-8] Wed Feb 14 10:37:11 2018
@@ -17,10 +17,6 @@
package org.apache.sis.storage;
import java.util.Collection;
-import org.opengis.metadata.Metadata;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.apache.sis.internal.storage.Resources;
-
/**
* A collection of resources. An aggregate can have two or more components.
@@ -91,52 +87,4 @@ public interface Aggregate extends Resou
*/
Collection<Resource> components() throws DataStoreException;
- /**
- * Adds a new {@code Resource} in this {@code Aggregate}.
- * The given {@link Resource} will be copied, and the <cite>effectively
added</cite> resource returned.
- * The effectively added resource may differ from the given resource in
many aspects.
- * The possible changes may include the followings but not only:
- * <ul>
- * <li>types and properties names</li>
- * <li>{@link CoordinateReferenceSystem}</li>
- * <li>{@link Metadata}</li>
- * </ul>
- *
- * <div class="note"><b>Warning:</b>
- * copying informations between stores may produce differences in many
aspects.
- * The range of changes depends both on the original {@link Resource}
structure
- * and the target {@code Resource} structure. If the differences are too
large,
- * then this {@code Aggregate} may throw an exception.
- * </div>
- *
- * <p>The {@link Capability#WRITABLE} flag if present in the {@link
Resource#getCapabilities() } set
- * indicate this method should be implemented</p>
- *
- * <p>The default implementation throws {@link
ReadOnlyStorageException}.</p>
- *
- * @param resource the resource to copy in this {@code Aggregate}.
- * @return the effectively added resource. May be {@code resource} itself
if it has been added verbatim.
- * @throws ReadOnlyStorageException if this instance does not support
write operations.
- * @throws DataStoreException if the given resource can not be stored in
this {@code Aggregate} for another reason.
- */
- default Resource add(Resource resource) throws ReadOnlyStorageException,
DataStoreException {
- throw new ReadOnlyStorageException(this,
Resources.Keys.StoreIsReadOnly);
- }
-
- /**
- * Removes a {@code Resource} from this {@code Aggregate}.
- * This operation is destructive: the {@link Resource} and it's related
data will be removed.
- *
- * <p>The {@link Capability#WRITABLE} flag if present in the {@link
Resource#getCapabilities() } set
- * indicate this method should be implemented</p>
- *
- * <p>The default implementation throws {@link
ReadOnlyStorageException}.</p>
- *
- * @param resource child resource to remove, should not be null.
- * @throws ReadOnlyStorageException if this instance does not support
write operations.
- * @throws DataStoreException if the given resource could not be removed
for another reason.
- */
- default void remove(Resource resource) throws ReadOnlyStorageException,
DataStoreException {
- throw new ReadOnlyStorageException(this,
Resources.Keys.StoreIsReadOnly);
- }
}
Modified:
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSet.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSet.java?rev=1824217&r1=1824216&r2=1824217&view=diff
==============================================================================
---
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSet.java
[UTF-8] (original)
+++
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSet.java
[UTF-8] Wed Feb 14 10:37:11 2018
@@ -16,12 +16,7 @@
*/
package org.apache.sis.storage;
-import java.util.Iterator;
-import org.apache.sis.internal.storage.Resources;
-
// Branch-dependent imports
-import java.util.function.Predicate;
-import java.util.function.UnaryOperator;
import java.util.stream.Stream;
import org.opengis.feature.Feature;
import org.opengis.feature.FeatureType;
@@ -75,33 +70,6 @@ public interface FeatureSet extends Data
FeatureType getType() throws DataStoreException;
/**
- * Redefine the feature type of this feature set, including all features.
- * This operation may take an undefined time since all features in the set
must be transformed.
- *
- * <p>
- * An {@linkplain org.apache.sis.storage.IllegalFeatureTypeException}
will be throw
- * when the provided type contains incompatible attribute changes.
- * </p>
- *
- * <p>
- * In the case of a newly created feature set, this method can be used to
define
- * stored feature type.
- * </p>
- *
- * <p>
- * Default implementation throw a {@linkplain
org.apache.sis.storage.ReadOnlyStorageException}.
- * </p>
- *
- * @param newType new feature type definition, (not {@code null}).
- * @throws ReadOnlyStorageException if this instance does not support
schema update
- * @throws IllegalFeatureTypeException if the given type is not compatible
- * @throws DataStoreException if another error occurred while changing
feature type.
- */
- default void updateType(FeatureType newType) throws
ReadOnlyStorageException, IllegalFeatureTypeException, DataStoreException {
- throw new ReadOnlyStorageException(this,
Resources.Keys.StoreIsReadOnly);
- }
-
- /**
* Requests a subset of features and feature properties from this resource.
* The filtering can be applied in two domains:
*
@@ -168,71 +136,4 @@ public interface FeatureSet extends Data
*/
Stream<Feature> features(boolean parallel) throws DataStoreException;
- /**
- * Inserts new features in this {@code FeatureSet}.
- * Any feature already present in the {@link FeatureSet} will remain
unmodified.
- *
- * <div class="note"><b>API note:</b>
- * this method expects an {@link Iterator} rather then a {@link
java.util.stream.Stream} for easing
- * inter-operability with various API. Implementing a custom {@link
Iterator} requires less effort
- * than implementing a {@link Stream}. On the other side if the user has a
{@link Stream},
- * obtaining an {@link Iterator} can be done by a call to {@link
Stream#iterator()}.</div>
- *
- * <p>The {@link Capability#WRITABLE} flag if present in the {@link
Resource#getCapabilities() } set
- * indicate this method should be implemented</p>
- *
- * <p>The default implementation throws {@link
ReadOnlyStorageException}.</p>
- *
- * @param features features to insert in this {@code FeatureSet}.
- * @throws ReadOnlyStorageException if this instance does not support
write operations.
- * @throws DataStoreException if another error occurred while storing new
features.
- */
- default void add(Iterator<? extends Feature> features) throws
ReadOnlyStorageException, DataStoreException {
- throw new ReadOnlyStorageException(this,
Resources.Keys.StoreIsReadOnly);
- }
-
- /**
- * Removes all features from this {@code FeatureSet} which matches the
given predicate.
- *
- * <p>The {@link Capability#WRITABLE} flag if present in the {@link
Resource#getCapabilities() } set
- * indicate this method should be implemented</p>
- *
- * <p>The default implementation throws {@link
ReadOnlyStorageException}.</p>
- *
- * @param filter a predicate which returns true for resources to be
removed.
- * @return {@code true} if any elements were removed.
- * @throws ReadOnlyStorageException if this instance does not support
write operations.
- * @throws DataStoreException if another error occurred while removing
features.
- */
- default boolean removeIf(Predicate<? super Feature> filter) throws
ReadOnlyStorageException, DataStoreException {
- throw new ReadOnlyStorageException(this,
Resources.Keys.StoreIsReadOnly);
- }
-
- /**
- * Updates all features from this {@code FeatureSet} which matches the
given predicate.
- * For each {@link Feature} instance matching the given {@link Predicate},
- * the <code>{@linkplain UnaryOperator#apply
UnaryOperator.apply(Feature)}</code> method will be invoked.
- * {@code UnaryOperator}s are free to modify the given {@code Feature}
<i>in-place</i> or to return a
- * different feature instance. Two behaviors are possible:
- * <ul>
- * <li>If the operator returns a non-null {@link Feature}, then the
modified feature is stored
- * in replacement of the previous feature (not necessarily at the
same location).</li>
- * <li>If the operator returns {@code null}, then the feature will be
removed from the {@code FeatureSet}.</li>
- * </ul>
- *
- * <p>The {@link Capability#WRITABLE} flag if present in the {@link
Resource#getCapabilities() } set
- * indicate this method should be implemented</p>
- *
- * <p>The default implementation throws {@link
ReadOnlyStorageException}.</p>
- *
- * @param filter a predicate which returns true for resources to be
updated.
- * @param updater operation called for each matching {@link Feature}.
- * @throws ReadOnlyStorageException if this instance does not support
write operations.
- * @throws DataStoreException if another error occurred while replacing
features.
- */
- default void replaceIf(Predicate<? super Feature> filter,
UnaryOperator<Feature> updater)
- throws ReadOnlyStorageException, DataStoreException
- {
- throw new ReadOnlyStorageException(this,
Resources.Keys.StoreIsReadOnly);
- }
}
Added:
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableAggregate.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableAggregate.java?rev=1824217&view=auto
==============================================================================
---
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableAggregate.java
(added)
+++
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableAggregate.java
Wed Feb 14 10:37:11 2018
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.storage;
+
+import org.apache.sis.internal.storage.Resources;
+
+/**
+ * Subtype of {@linkplain Aggregate} with writing capabilities.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 1.0
+ * @since 1.0
+ * @module
+ */
+public interface WritableAggregate extends Aggregate {
+
+ /**
+ * Adds a new {@code Resource} in this {@code Aggregate}.
+ * The given {@link Resource} will be copied, and the <cite>effectively
added</cite> resource returned.
+ * The effectively added resource may differ from the given resource in
many aspects.
+ * The possible changes may include the followings but not only:
+ * <ul>
+ * <li>types and properties names</li>
+ * <li>{@link CoordinateReferenceSystem}</li>
+ * <li>{@link Metadata}</li>
+ * </ul>
+ *
+ * <div class="note"><b>Warning:</b>
+ * copying informations between stores may produce differences in many
aspects.
+ * The range of changes depends both on the original {@link Resource}
structure
+ * and the target {@code Resource} structure. If the differences are too
large,
+ * then this {@code Aggregate} may throw an exception.
+ * </div>
+ *
+ * <p>The {@link Capability#WRITABLE} flag if present in the {@link
Resource#getCapabilities() } set
+ * indicate this method should be implemented</p>
+ *
+ * <p>The default implementation throws {@link
ReadOnlyStorageException}.</p>
+ *
+ * @param resource the resource to copy in this {@code Aggregate}.
+ * @return the effectively added resource. May be {@code resource} itself
if it has been added verbatim.
+ * @throws ReadOnlyStorageException if this instance does not support
write operations.
+ * @throws DataStoreException if the given resource can not be stored in
this {@code Aggregate} for another reason.
+ */
+ default Resource add(Resource resource) throws ReadOnlyStorageException,
DataStoreException {
+ throw new ReadOnlyStorageException(this,
Resources.Keys.StoreIsReadOnly);
+ }
+
+ /**
+ * Removes a {@code Resource} from this {@code Aggregate}.
+ * This operation is destructive: the {@link Resource} and it's related
data will be removed.
+ *
+ * <p>The {@link Capability#WRITABLE} flag if present in the {@link
Resource#getCapabilities() } set
+ * indicate this method should be implemented</p>
+ *
+ * <p>The default implementation throws {@link
ReadOnlyStorageException}.</p>
+ *
+ * @param resource child resource to remove, should not be null.
+ * @throws ReadOnlyStorageException if this instance does not support
write operations.
+ * @throws DataStoreException if the given resource could not be removed
for another reason.
+ */
+ default void remove(Resource resource) throws ReadOnlyStorageException,
DataStoreException {
+ throw new ReadOnlyStorageException(this,
Resources.Keys.StoreIsReadOnly);
+ }
+
+}
Added:
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableFeatureSet.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableFeatureSet.java?rev=1824217&view=auto
==============================================================================
---
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableFeatureSet.java
(added)
+++
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableFeatureSet.java
Wed Feb 14 10:37:11 2018
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.storage;
+
+import java.util.Iterator;
+import java.util.function.Predicate;
+import java.util.function.UnaryOperator;
+import org.apache.sis.internal.storage.Resources;
+import org.opengis.feature.Feature;
+import org.opengis.feature.FeatureType;
+
+/**
+ * Subtype of {@linkplain FeatureSet} with writing capabilities.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 1.0
+ * @since 1.0
+ * @module
+ */
+public interface WritableFeatureSet extends FeatureSet {
+
+ /**
+ * Redefine the feature type of this feature set, including all features.
+ * This operation may take an undefined time since all features in the set
must be transformed.
+ *
+ * <p>
+ * An {@linkplain org.apache.sis.storage.IllegalFeatureTypeException}
will be throw
+ * when the provided type contains incompatible attribute changes.
+ * </p>
+ *
+ * <p>
+ * In the case of a newly created feature set, this method can be used to
define
+ * stored feature type.
+ * </p>
+ *
+ * <p>
+ * Default implementation throw a {@linkplain
org.apache.sis.storage.ReadOnlyStorageException}.
+ * </p>
+ *
+ * @param newType new feature type definition, (not {@code null}).
+ * @throws ReadOnlyStorageException if this instance does not support
schema update
+ * @throws IllegalFeatureTypeException if the given type is not compatible
+ * @throws DataStoreException if another error occurred while changing
feature type.
+ */
+ default void updateType(FeatureType newType) throws
ReadOnlyStorageException, IllegalFeatureTypeException, DataStoreException {
+ throw new ReadOnlyStorageException(this,
Resources.Keys.StoreIsReadOnly);
+ }
+
+ /**
+ * Inserts new features in this {@code FeatureSet}.
+ * Any feature already present in the {@link FeatureSet} will remain
unmodified.
+ *
+ * <div class="note"><b>API note:</b>
+ * this method expects an {@link Iterator} rather then a {@link
java.util.stream.Stream} for easing
+ * inter-operability with various API. Implementing a custom {@link
Iterator} requires less effort
+ * than implementing a {@link Stream}. On the other side if the user has a
{@link Stream},
+ * obtaining an {@link Iterator} can be done by a call to {@link
Stream#iterator()}.</div>
+ *
+ * <p>The {@link Capability#WRITABLE} flag if present in the {@link
Resource#getCapabilities() } set
+ * indicate this method should be implemented</p>
+ *
+ * <p>The default implementation throws {@link
ReadOnlyStorageException}.</p>
+ *
+ * @param features features to insert in this {@code FeatureSet}.
+ * @throws ReadOnlyStorageException if this instance does not support
write operations.
+ * @throws DataStoreException if another error occurred while storing new
features.
+ */
+ default void add(Iterator<? extends Feature> features) throws
ReadOnlyStorageException, DataStoreException {
+ throw new ReadOnlyStorageException(this,
Resources.Keys.StoreIsReadOnly);
+ }
+
+ /**
+ * Removes all features from this {@code FeatureSet} which matches the
given predicate.
+ *
+ * <p>The {@link Capability#WRITABLE} flag if present in the {@link
Resource#getCapabilities() } set
+ * indicate this method should be implemented</p>
+ *
+ * <p>The default implementation throws {@link
ReadOnlyStorageException}.</p>
+ *
+ * @param filter a predicate which returns true for resources to be
removed.
+ * @return {@code true} if any elements were removed.
+ * @throws ReadOnlyStorageException if this instance does not support
write operations.
+ * @throws DataStoreException if another error occurred while removing
features.
+ */
+ default boolean removeIf(Predicate<? super Feature> filter) throws
ReadOnlyStorageException, DataStoreException {
+ throw new ReadOnlyStorageException(this,
Resources.Keys.StoreIsReadOnly);
+ }
+
+ /**
+ * Updates all features from this {@code FeatureSet} which matches the
given predicate.
+ * For each {@link Feature} instance matching the given {@link Predicate},
+ * the <code>{@linkplain UnaryOperator#apply
UnaryOperator.apply(Feature)}</code> method will be invoked.
+ * {@code UnaryOperator}s are free to modify the given {@code Feature}
<i>in-place</i> or to return a
+ * different feature instance. Two behaviors are possible:
+ * <ul>
+ * <li>If the operator returns a non-null {@link Feature}, then the
modified feature is stored
+ * in replacement of the previous feature (not necessarily at the
same location).</li>
+ * <li>If the operator returns {@code null}, then the feature will be
removed from the {@code FeatureSet}.</li>
+ * </ul>
+ *
+ * <p>The {@link Capability#WRITABLE} flag if present in the {@link
Resource#getCapabilities() } set
+ * indicate this method should be implemented</p>
+ *
+ * <p>The default implementation throws {@link
ReadOnlyStorageException}.</p>
+ *
+ * @param filter a predicate which returns true for resources to be
updated.
+ * @param updater operation called for each matching {@link Feature}.
+ * @throws ReadOnlyStorageException if this instance does not support
write operations.
+ * @throws DataStoreException if another error occurred while replacing
features.
+ */
+ default void replaceIf(Predicate<? super Feature> filter,
UnaryOperator<Feature> updater)
+ throws ReadOnlyStorageException, DataStoreException
+ {
+ throw new ReadOnlyStorageException(this,
Resources.Keys.StoreIsReadOnly);
+ }
+}