JCR-5068: work in progress
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java index 4662cb5..826f77f 100644 --- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java +++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java
@@ -18,7 +18,6 @@ import org.apache.jackrabbit.JcrConstants; import org.apache.jackrabbit.commons.iterator.FilterIterator; -import org.apache.jackrabbit.commons.predicate.Predicate; import javax.jcr.Item; import javax.jcr.Node; @@ -427,17 +426,13 @@ * Filtering ignored properties from the given properties. */ private Iterator<Property> filterProperties(Iterator<Property> properties) { - return new FilterIterator<Property>(properties, new Predicate() { - public boolean evaluate(Object object) { + return new FilterIterator<Property>(properties, prop -> { try { - Property p = (Property) object; - return !ignoredProperties.contains(p.getName()); + return !ignoredProperties.contains(prop.getName()); } catch (RepositoryException ignore) { return true; - } - } - }); + }}); } private static class WrappedRepositoryException extends RuntimeException {
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilterIterator.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilterIterator.java index d613fdb..a57aa8a 100644 --- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilterIterator.java +++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilterIterator.java
@@ -16,10 +16,9 @@ */ package org.apache.jackrabbit.commons.iterator; -import org.apache.jackrabbit.commons.predicate.Predicate; - import java.util.Iterator; import java.util.NoSuchElementException; +import java.util.function.Predicate; /** * Iterator filtering out items which do not match a given predicate. @@ -27,7 +26,7 @@ */ public class FilterIterator<T> implements Iterator<T> { private final Iterator<T> iterator; - private final Predicate predicate; + private final Predicate<T> predicate; private T next = null; @@ -37,7 +36,14 @@ * @param iterator iterator to filter * @param predicate only item matching this predicate are included */ - public FilterIterator(Iterator<T> iterator, Predicate predicate) { + public FilterIterator(Iterator<T> iterator, Predicate<T> predicate) { + super(); + this.iterator = iterator; + this.predicate = predicate; + } + + @SuppressWarnings("deprecation") + public FilterIterator(Iterator<T> iterator, org.apache.jackrabbit.commons.predicate.Predicate<T> predicate) { super(); this.iterator = iterator; this.predicate = predicate; @@ -46,7 +52,7 @@ public boolean hasNext() { while (next == null && iterator.hasNext()) { T e = iterator.next(); - if (predicate.evaluate(e)) { + if (predicate.test(e)) { next = e; } } @@ -72,5 +78,4 @@ public void remove() { throw new UnsupportedOperationException(); } - }
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilteredRangeIterator.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilteredRangeIterator.java index 596d18a..771ced0 100644 --- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilteredRangeIterator.java +++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilteredRangeIterator.java
@@ -18,11 +18,10 @@ import java.util.Iterator; import java.util.NoSuchElementException; +import java.util.function.Predicate; import javax.jcr.RangeIterator; -import org.apache.jackrabbit.commons.predicate.Predicate; - /** * Filtering decorator for iterators. */ @@ -36,6 +35,7 @@ /** * Predicate used for filtering. */ + @SuppressWarnings("rawtypes") private final Predicate predicate; /** @@ -73,7 +73,14 @@ * @param bufferSize */ public FilteredRangeIterator( - Iterator<?> iterator, Predicate predicate, int bufferSize) { + Iterator<?> iterator, Predicate<?> predicate, int bufferSize) { + this.iterator = iterator; + this.predicate = predicate; + this.buffer = new Object[bufferSize]; + } + + public FilteredRangeIterator( + Iterator<?> iterator, org.apache.jackrabbit.commons.predicate.Predicate<?> predicate, int bufferSize) { this.iterator = iterator; this.predicate = predicate; this.buffer = new Object[bufferSize]; @@ -85,7 +92,11 @@ * @param iterator underlying iterator * @param predicate predicate used for filtering */ - public FilteredRangeIterator(Iterator<?> iterator, Predicate predicate) { + public FilteredRangeIterator(Iterator<?> iterator, Predicate<?> predicate) { + this(iterator, predicate, 1000); + } + + public FilteredRangeIterator(Iterator<?> iterator, org.apache.jackrabbit.commons.predicate.Predicate<?> predicate) { this(iterator, predicate, 1000); } @@ -98,12 +109,13 @@ * @param iterator underlying iterator */ public FilteredRangeIterator(Iterator<?> iterator) { - this(iterator, Predicate.TRUE, 1000); + this(iterator, x -> true, 1000); } /** * Pre-fetches more items into the buffer. */ + @SuppressWarnings("unchecked") private void fetch() { if (bufferPosition == bufferSize) { position += bufferSize; @@ -111,7 +123,7 @@ bufferSize = 0; while (bufferSize < buffer.length && iterator.hasNext()) { Object object = iterator.next(); - if (predicate.evaluate(object)) { + if (predicate.test(object)) { buffer[bufferSize++] = object; } }
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/package-info.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/package-info.java index 409352a..e56d8c3 100644 --- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/package-info.java +++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/package-info.java
@@ -14,5 +14,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@org.osgi.annotation.versioning.Version("2.4.0") +@org.osgi.annotation.versioning.Version("2.5.0") package org.apache.jackrabbit.commons.iterator;
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicate.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicate.java index e9ecbb9..10a7319 100644 --- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicate.java +++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicate.java
@@ -19,8 +19,10 @@ /** * Interface for object predicates, i.e. functions that evaluate a given * object to a boolean value. + * @deprecated Use {@link java.util.function.Predicate} instead */ -public interface Predicate { +@Deprecated +public interface Predicate<T> extends java.util.function.Predicate<T> { /** * Evaluates the predicate for the given object. @@ -28,12 +30,17 @@ * @param object some object * @return predicate result */ - boolean evaluate(Object object); + boolean evaluate(T object); + + default boolean test(T object) { + return evaluate(object); + } /** * Constant predicate that returns <code>true</code> for all objects. */ - Predicate TRUE = new Predicate() { + @SuppressWarnings({ "unchecked", "rawtypes" }) + Predicate<? extends Object> TRUE = new Predicate() { public boolean evaluate(Object object) { return true; } @@ -42,10 +49,10 @@ /** * Constant predicate that returns <code>false</code> for all objects. */ - Predicate FALSE = new Predicate() { + @SuppressWarnings({ "unchecked", "rawtypes" }) + Predicate<? extends Object> FALSE = new Predicate() { public boolean evaluate(Object object) { return false; } }; - }
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicates.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicates.java index 006613c..2b09a6c 100644 --- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicates.java +++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicates.java
@@ -27,15 +27,37 @@ * Creates an AND predicate over all the given component predicates. * All the component predicates must evaluate to <code>true</code> * for the AND predicate to do so. + * @param <T> * * @param predicates component predicates * @return AND predicate */ - public static Predicate and(final Predicate... predicates) { - return new Predicate() { - public boolean evaluate(Object object) { - for (Predicate predicate : predicates) { - if (!predicate.evaluate(object)) { + @SuppressWarnings({ "unchecked", "deprecation" }) + public static <T> Predicate<T> and(final java.util.function.Predicate<? super T>... predicates) { + return computeAnd(predicates); + } + + /** + * Creates an AND predicate over all the given component predicates. + * All the component predicates must evaluate to <code>true</code> + * for the AND predicate to do so. + * @param <T> + * + * @param predicates component predicates + * @return AND predicate + */ + @SuppressWarnings("unchecked") + @Deprecated + public static <T> Predicate<T> and(Predicate<? super T>... predicates) { + return computeAnd(predicates); + } + + @SuppressWarnings({ "deprecation", "unchecked" }) + private static <T> Predicate<T> computeAnd(final java.util.function.Predicate<? super T>... predicates) { + return new Predicate<T>() { + public boolean evaluate(T object) { + for (java.util.function.Predicate<? super T> predicate : predicates) { + if (!predicate.test(object)) { return false; } } @@ -52,11 +74,31 @@ * @param predicates component predicates * @return OR predicate */ - public static Predicate or(final Predicate... predicates) { - return new Predicate() { - public boolean evaluate(Object object) { - for (Predicate predicate : predicates) { - if (predicate.evaluate(object)) { + @SuppressWarnings({ "unchecked", "deprecation" }) + public static <T> Predicate<T> or(final java.util.function.Predicate<? super T>... predicates) { + return computeOr(predicates); + } + + /** + * Creates an OR predicate over all the given component predicates. + * At least one of the component predicates must evaluate to + * <code>true</code> for the OR predicate to do so. + * + * @param predicates component predicates + * @return OR predicate + */ + @SuppressWarnings("unchecked") + @Deprecated + public static <T> Predicate<T> or(Predicate<? super T>... predicates) { + return computeOr(predicates); + } + + @SuppressWarnings({ "deprecation", "unchecked" }) + private static <T> Predicate<T> computeOr(java.util.function.Predicate<? super T>... predicates) { + return new Predicate<T>() { + public boolean evaluate(T object) { + for (java.util.function.Predicate<? super T> predicate : predicates) { + if (predicate.test(object)) { return true; } } @@ -73,12 +115,28 @@ * @param predicate component predicate * @return NOT predicate */ - public static Predicate not(final Predicate predicate) { - return new Predicate() { - public boolean evaluate(Object object) { - return !predicate.evaluate(object); + public static <T> java.util.function.Predicate<T> not(java.util.function.Predicate<? super T> target) { + return new java.util.function.Predicate<T>() { + public boolean test(T object) { + return !target.test(object); } }; } + /** + * Creates a NOT predicate for the given component predicate. + * The NOT predicate evaluates to <code>true</code> when the component + * predicate doesn't, and vice versa. + * + * @param predicate component predicate + * @return NOT predicate + */ + @SuppressWarnings("deprecation") + public static <T> Predicate<T> not(Predicate<? super T> target) { + return new Predicate<T>() { + public boolean evaluate(T object) { + return !target.test(object); + } + }; + } }
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/package-info.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/package-info.java index 5e49a54..fd13862 100644 --- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/package-info.java +++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/package-info.java
@@ -14,5 +14,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@org.osgi.annotation.versioning.Version("2.2") +@org.osgi.annotation.versioning.Version("2.3") package org.apache.jackrabbit.commons.predicate;