001    /*
002     * Copyright (C) 2007 The Guava Authors
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package com.google.common.base;
018    
019    import static com.google.common.base.Preconditions.checkNotNull;
020    
021    import com.google.common.annotations.Beta;
022    import com.google.common.annotations.GwtCompatible;
023    import com.google.common.annotations.GwtIncompatible;
024    
025    import java.io.Serializable;
026    import java.util.ArrayList;
027    import java.util.Arrays;
028    import java.util.Collection;
029    import java.util.List;
030    import java.util.regex.Pattern;
031    
032    import javax.annotation.Nullable;
033    
034    /**
035     * Static utility methods pertaining to {@code Predicate} instances.
036     *
037     * <p>All methods returns serializable predicates as long as they're given
038     * serializable parameters.
039     *
040     * @author Kevin Bourrillion
041     * @since 2.0 (imported from Google Collections Library)
042     */
043    @GwtCompatible(emulated = true)
044    public final class Predicates {
045      private Predicates() {}
046    
047      // TODO(kevinb): considering having these implement a VisitablePredicate
048      // interface which specifies an accept(PredicateVisitor) method.
049    
050      /**
051       * Returns a predicate that always evaluates to {@code true}.
052       */
053      @GwtCompatible(serializable = true)
054      public static <T> Predicate<T> alwaysTrue() {
055        return ObjectPredicate.ALWAYS_TRUE.withNarrowedType();
056      }
057    
058      /**
059       * Returns a predicate that always evaluates to {@code false}.
060       */
061      @GwtCompatible(serializable = true)
062      public static <T> Predicate<T> alwaysFalse() {
063        return ObjectPredicate.ALWAYS_FALSE.withNarrowedType();
064      }
065    
066      /**
067       * Returns a predicate that evaluates to {@code true} if the object reference
068       * being tested is null.
069       */
070      @GwtCompatible(serializable = true)
071      public static <T> Predicate<T> isNull() {
072        return ObjectPredicate.IS_NULL.withNarrowedType();
073      }
074    
075      /**
076       * Returns a predicate that evaluates to {@code true} if the object reference
077       * being tested is not null.
078       */
079      @GwtCompatible(serializable = true)
080      public static <T> Predicate<T> notNull() {
081        return ObjectPredicate.NOT_NULL.withNarrowedType();
082      }
083    
084      /**
085       * Returns a predicate that evaluates to {@code true} if the given predicate
086       * evaluates to {@code false}.
087       */
088      public static <T> Predicate<T> not(Predicate<T> predicate) {
089        return new NotPredicate<T>(predicate);
090      }
091    
092      /**
093       * Returns a predicate that evaluates to {@code true} if each of its
094       * components evaluates to {@code true}. The components are evaluated in
095       * order, and evaluation will be "short-circuited" as soon as a false
096       * predicate is found. It defensively copies the iterable passed in, so future
097       * changes to it won't alter the behavior of this predicate. If {@code
098       * components} is empty, the returned predicate will always evaluate to {@code
099       * true}.
100       */
101      public static <T> Predicate<T> and(
102          Iterable<? extends Predicate<? super T>> components) {
103        return new AndPredicate<T>(defensiveCopy(components));
104      }
105    
106      /**
107       * Returns a predicate that evaluates to {@code true} if each of its
108       * components evaluates to {@code true}. The components are evaluated in
109       * order, and evaluation will be "short-circuited" as soon as a false
110       * predicate is found. It defensively copies the array passed in, so future
111       * changes to it won't alter the behavior of this predicate. If {@code
112       * components} is empty, the returned predicate will always evaluate to {@code
113       * true}.
114       */
115      public static <T> Predicate<T> and(Predicate<? super T>... components) {
116        return new AndPredicate<T>(defensiveCopy(components));
117      }
118    
119      /**
120       * Returns a predicate that evaluates to {@code true} if both of its
121       * components evaluate to {@code true}. The components are evaluated in
122       * order, and evaluation will be "short-circuited" as soon as a false
123       * predicate is found.
124       */
125      public static <T> Predicate<T> and(Predicate<? super T> first,
126          Predicate<? super T> second) {
127        return new AndPredicate<T>(Predicates.<T>asList(
128            checkNotNull(first), checkNotNull(second)));
129      }
130    
131      /**
132       * Returns a predicate that evaluates to {@code true} if any one of its
133       * components evaluates to {@code true}. The components are evaluated in
134       * order, and evaluation will be "short-circuited" as soon as a
135       * true predicate is found. It defensively copies the iterable passed in, so
136       * future changes to it won't alter the behavior of this predicate. If {@code
137       * components} is empty, the returned predicate will always evaluate to {@code
138       * false}.
139       */
140      public static <T> Predicate<T> or(
141          Iterable<? extends Predicate<? super T>> components) {
142        return new OrPredicate<T>(defensiveCopy(components));
143      }
144    
145      /**
146       * Returns a predicate that evaluates to {@code true} if any one of its
147       * components evaluates to {@code true}. The components are evaluated in
148       * order, and evaluation will be "short-circuited" as soon as a
149       * true predicate is found. It defensively copies the array passed in, so
150       * future changes to it won't alter the behavior of this predicate. If {@code
151       * components} is empty, the returned predicate will always evaluate to {@code
152       * false}.
153       */
154      public static <T> Predicate<T> or(Predicate<? super T>... components) {
155        return new OrPredicate<T>(defensiveCopy(components));
156      }
157    
158      /**
159       * Returns a predicate that evaluates to {@code true} if either of its
160       * components evaluates to {@code true}. The components are evaluated in
161       * order, and evaluation will be "short-circuited" as soon as a
162       * true predicate is found.
163       */
164      public static <T> Predicate<T> or(
165          Predicate<? super T> first, Predicate<? super T> second) {
166        return new OrPredicate<T>(Predicates.<T>asList(
167            checkNotNull(first), checkNotNull(second)));
168      }
169    
170      /**
171       * Returns a predicate that evaluates to {@code true} if the object being
172       * tested {@code equals()} the given target or both are null.
173       */
174      public static <T> Predicate<T> equalTo(@Nullable T target) {
175        return (target == null)
176            ? Predicates.<T>isNull()
177            : new IsEqualToPredicate<T>(target);
178      }
179    
180      /**
181       * Returns a predicate that evaluates to {@code true} if the object being
182       * tested is an instance of the given class. If the object being tested
183       * is {@code null} this predicate evaluates to {@code false}.
184       *
185       * <p>If you want to filter an {@code Iterable} to narrow its type, consider
186       * using {@link com.google.common.collect.Iterables#filter(Iterable, Class)}
187       * in preference.
188       *
189       * <p><b>Warning:</b> contrary to the typical assumptions about predicates (as
190       * documented at {@link Predicate#apply}), the returned predicate may not be
191       * <i>consistent with equals</i>. For example, {@code
192       * instanceOf(ArrayList.class)} will yield different results for the two equal
193       * instances {@code Lists.newArrayList(1)} and {@code Arrays.asList(1)}.
194       */
195      @GwtIncompatible("Class.isInstance")
196      public static Predicate<Object> instanceOf(Class<?> clazz) {
197        return new InstanceOfPredicate(clazz);
198      }
199      
200      /**
201       * Returns a predicate that evaluates to {@code true} if the class being
202       * tested is assignable from the given class.  The returned predicate
203       * does not allow null inputs.
204       * 
205       * @since 10.0
206       */
207      @GwtIncompatible("Class.isAssignableFrom")
208      @Beta
209      public static Predicate<Class<?>> assignableFrom(Class<?> clazz) {
210        return new AssignableFromPredicate(clazz);
211      }
212    
213      /**
214       * Returns a predicate that evaluates to {@code true} if the object reference
215       * being tested is a member of the given collection. It does not defensively
216       * copy the collection passed in, so future changes to it will alter the
217       * behavior of the predicate.
218       *
219       * <p>This method can technically accept any {@code Collection<?>}, but using
220       * a typed collection helps prevent bugs. This approach doesn't block any
221       * potential users since it is always possible to use {@code
222       * Predicates.<Object>in()}.
223       *
224       * @param target the collection that may contain the function input
225       */
226      public static <T> Predicate<T> in(Collection<? extends T> target) {
227        return new InPredicate<T>(target);
228      }
229    
230      /**
231       * Returns the composition of a function and a predicate. For every {@code x},
232       * the generated predicate returns {@code predicate(function(x))}.
233       *
234       * @return the composition of the provided function and predicate
235       */
236      public static <A, B> Predicate<A> compose(
237          Predicate<B> predicate, Function<A, ? extends B> function) {
238        return new CompositionPredicate<A, B>(predicate, function);
239      }
240    
241      /**
242       * Returns a predicate that evaluates to {@code true} if the
243       * {@code CharSequence} being tested contains any match for the given
244       * regular expression pattern. The test used is equivalent to
245       * {@code Pattern.compile(pattern).matcher(arg).find()}
246       *
247       * @throws java.util.regex.PatternSyntaxException if the pattern is invalid
248       * @since 3.0
249       */
250      @GwtIncompatible(value = "java.util.regex.Pattern")
251      public static Predicate<CharSequence> containsPattern(String pattern) {
252        return new ContainsPatternPredicate(pattern);
253      }
254    
255      /**
256       * Returns a predicate that evaluates to {@code true} if the
257       * {@code CharSequence} being tested contains any match for the given
258       * regular expression pattern. The test used is equivalent to
259       * {@code pattern.matcher(arg).find()}
260       *
261       * @since 3.0
262       */
263      @GwtIncompatible(value = "java.util.regex.Pattern")
264      public static Predicate<CharSequence> contains(Pattern pattern) {
265        return new ContainsPatternPredicate(pattern);
266      }
267    
268      // End public API, begin private implementation classes.
269    
270      // Package private for GWT serialization.
271      enum ObjectPredicate implements Predicate<Object> {
272        ALWAYS_TRUE {
273          @Override public boolean apply(@Nullable Object o) {
274            return true;
275          }
276        },
277        ALWAYS_FALSE {
278          @Override public boolean apply(@Nullable Object o) {
279            return false;
280          }
281        },
282        IS_NULL {
283          @Override public boolean apply(@Nullable Object o) {
284            return o == null;
285          }
286        },
287        NOT_NULL {
288          @Override public boolean apply(@Nullable Object o) {
289            return o != null;
290          }
291        };
292        
293        @SuppressWarnings("unchecked") // these Object predicates work for any T
294        <T> Predicate<T> withNarrowedType() {
295          return (Predicate<T>) this;
296        }
297      }
298    
299      /** @see Predicates#not(Predicate) */
300      private static class NotPredicate<T> implements Predicate<T>, Serializable {
301        final Predicate<T> predicate;
302    
303        NotPredicate(Predicate<T> predicate) {
304          this.predicate = checkNotNull(predicate);
305        }
306        @Override
307        public boolean apply(T t) {
308          return !predicate.apply(t);
309        }
310        @Override public int hashCode() {
311          return ~predicate.hashCode();
312        }
313        @Override public boolean equals(@Nullable Object obj) {
314          if (obj instanceof NotPredicate) {
315            NotPredicate<?> that = (NotPredicate<?>) obj;
316            return predicate.equals(that.predicate);
317          }
318          return false;
319        }
320        @Override public String toString() {
321          return "Not(" + predicate.toString() + ")";
322        }
323        private static final long serialVersionUID = 0;
324      }
325    
326      private static final Joiner COMMA_JOINER = Joiner.on(",");
327    
328      /** @see Predicates#and(Iterable) */
329      private static class AndPredicate<T> implements Predicate<T>, Serializable {
330        private final List<? extends Predicate<? super T>> components;
331    
332        private AndPredicate(List<? extends Predicate<? super T>> components) {
333          this.components = components;
334        }
335        @Override
336        public boolean apply(T t) {
337          for (int i = 0; i < components.size(); i++) {
338            if (!components.get(i).apply(t)) {
339              return false;
340            }
341          }
342          return true;
343        }
344        @Override public int hashCode() {
345          // 0x12472c2c is a random number to help avoid collisions with OrPredicate
346          return components.hashCode() + 0x12472c2c;
347        }
348        @Override public boolean equals(@Nullable Object obj) {
349          if (obj instanceof AndPredicate) {
350            AndPredicate<?> that = (AndPredicate<?>) obj;
351            return components.equals(that.components);
352          }
353          return false;
354        }
355        @Override public String toString() {
356          return "And(" + COMMA_JOINER.join(components) + ")";
357        }
358        private static final long serialVersionUID = 0;
359      }
360    
361      /** @see Predicates#or(Iterable) */
362      private static class OrPredicate<T> implements Predicate<T>, Serializable {
363        private final List<? extends Predicate<? super T>> components;
364    
365        private OrPredicate(List<? extends Predicate<? super T>> components) {
366          this.components = components;
367        }
368        @Override
369        public boolean apply(T t) {
370          for (int i = 0; i < components.size(); i++) {
371            if (components.get(i).apply(t)) {
372              return true;
373            }
374          }
375          return false;
376        }
377        @Override public int hashCode() {
378          // 0x053c91cf is a random number to help avoid collisions with AndPredicate
379          return components.hashCode() + 0x053c91cf;
380        }
381        @Override public boolean equals(@Nullable Object obj) {
382          if (obj instanceof OrPredicate) {
383            OrPredicate<?> that = (OrPredicate<?>) obj;
384            return components.equals(that.components);
385          }
386          return false;
387        }
388        @Override public String toString() {
389          return "Or(" + COMMA_JOINER.join(components) + ")";
390        }
391        private static final long serialVersionUID = 0;
392      }
393    
394      /** @see Predicates#equalTo(Object) */
395      private static class IsEqualToPredicate<T>
396          implements Predicate<T>, Serializable {
397        private final T target;
398    
399        private IsEqualToPredicate(T target) {
400          this.target = target;
401        }
402        @Override
403        public boolean apply(T t) {
404          return target.equals(t);
405        }
406        @Override public int hashCode() {
407          return target.hashCode();
408        }
409        @Override public boolean equals(@Nullable Object obj) {
410          if (obj instanceof IsEqualToPredicate) {
411            IsEqualToPredicate<?> that = (IsEqualToPredicate<?>) obj;
412            return target.equals(that.target);
413          }
414          return false;
415        }
416        @Override public String toString() {
417          return "IsEqualTo(" + target + ")";
418        }
419        private static final long serialVersionUID = 0;
420      }
421    
422      /** @see Predicates#instanceOf(Class) */
423      @GwtIncompatible("Class.isInstance")
424      private static class InstanceOfPredicate
425          implements Predicate<Object>, Serializable {
426        private final Class<?> clazz;
427    
428        private InstanceOfPredicate(Class<?> clazz) {
429          this.clazz = checkNotNull(clazz);
430        }
431        @Override
432        public boolean apply(@Nullable Object o) {
433          return clazz.isInstance(o);
434        }
435        @Override public int hashCode() {
436          return clazz.hashCode();
437        }
438        @Override public boolean equals(@Nullable Object obj) {
439          if (obj instanceof InstanceOfPredicate) {
440            InstanceOfPredicate that = (InstanceOfPredicate) obj;
441            return clazz == that.clazz;
442          }
443          return false;
444        }
445        @Override public String toString() {
446          return "IsInstanceOf(" + clazz.getName() + ")";
447        }
448        private static final long serialVersionUID = 0;
449      }
450      
451      /** @see Predicates#assignableFrom(Class) */
452      @GwtIncompatible("Class.isAssignableFrom")
453      private static class AssignableFromPredicate
454          implements Predicate<Class<?>>, Serializable {
455        private final Class<?> clazz;
456    
457        private AssignableFromPredicate(Class<?> clazz) {
458          this.clazz = checkNotNull(clazz);
459        }
460        @Override
461        public boolean apply(Class<?> input) {
462          return clazz.isAssignableFrom(input);
463        }
464        @Override public int hashCode() {
465          return clazz.hashCode();
466        }
467        @Override public boolean equals(@Nullable Object obj) {
468          if (obj instanceof AssignableFromPredicate) {
469            AssignableFromPredicate that = (AssignableFromPredicate) obj;
470            return clazz == that.clazz;
471          }
472          return false;
473        }
474        @Override public String toString() {
475          return "IsAssignableFrom(" + clazz.getName() + ")";
476        }
477        private static final long serialVersionUID = 0;
478      }
479    
480      /** @see Predicates#in(Collection) */
481      private static class InPredicate<T> implements Predicate<T>, Serializable {
482        private final Collection<?> target;
483    
484        private InPredicate(Collection<?> target) {
485          this.target = checkNotNull(target);
486        }
487    
488        @Override
489        public boolean apply(T t) {
490          try {
491            return target.contains(t);
492          } catch (NullPointerException e) {
493            return false;
494          } catch (ClassCastException e) {
495            return false;
496          }
497        }
498    
499        @Override public boolean equals(@Nullable Object obj) {
500          if (obj instanceof InPredicate) {
501            InPredicate<?> that = (InPredicate<?>) obj;
502            return target.equals(that.target);
503          }
504          return false;
505        }
506    
507        @Override public int hashCode() {
508          return target.hashCode();
509        }
510    
511        @Override public String toString() {
512          return "In(" + target + ")";
513        }
514        private static final long serialVersionUID = 0;
515      }
516    
517      /** @see Predicates#compose(Predicate, Function) */
518      private static class CompositionPredicate<A, B>
519          implements Predicate<A>, Serializable {
520        final Predicate<B> p;
521        final Function<A, ? extends B> f;
522    
523        private CompositionPredicate(Predicate<B> p, Function<A, ? extends B> f) {
524          this.p = checkNotNull(p);
525          this.f = checkNotNull(f);
526        }
527    
528        @Override
529        public boolean apply(A a) {
530          return p.apply(f.apply(a));
531        }
532    
533        @Override public boolean equals(@Nullable Object obj) {
534          if (obj instanceof CompositionPredicate) {
535            CompositionPredicate<?, ?> that = (CompositionPredicate<?, ?>) obj;
536            return f.equals(that.f) && p.equals(that.p);
537          }
538          return false;
539        }
540    
541        @Override public int hashCode() {
542          return f.hashCode() ^ p.hashCode();
543        }
544    
545        @Override public String toString() {
546          return p.toString() + "(" + f.toString() + ")";
547        }
548    
549        private static final long serialVersionUID = 0;
550      }
551    
552      /**
553       * @see Predicates#contains(Pattern)
554       * @see Predicates#containsPattern(String)
555       */
556      @GwtIncompatible("Only used by other GWT-incompatible code.")
557      private static class ContainsPatternPredicate
558          implements Predicate<CharSequence>, Serializable {
559        final Pattern pattern;
560    
561        ContainsPatternPredicate(Pattern pattern) {
562          this.pattern = checkNotNull(pattern);
563        }
564    
565        ContainsPatternPredicate(String patternStr) {
566          this(Pattern.compile(patternStr));
567        }
568    
569        @Override
570        public boolean apply(CharSequence t) {
571          return pattern.matcher(t).find();
572        }
573    
574        @Override public int hashCode() {
575          // Pattern uses Object.hashCode, so we have to reach
576          // inside to build a hashCode consistent with equals.
577    
578          return Objects.hashCode(pattern.pattern(), pattern.flags());
579        }
580    
581        @Override public boolean equals(@Nullable Object obj) {
582          if (obj instanceof ContainsPatternPredicate) {
583            ContainsPatternPredicate that = (ContainsPatternPredicate) obj;
584    
585            // Pattern uses Object (identity) equality, so we have to reach
586            // inside to compare individual fields.
587            return Objects.equal(pattern.pattern(), that.pattern.pattern())
588                && Objects.equal(pattern.flags(), that.pattern.flags());
589          }
590          return false;
591        }
592    
593        @Override public String toString() {
594          return Objects.toStringHelper(this)
595              .add("pattern", pattern)
596              .add("pattern.flags", Integer.toHexString(pattern.flags()))
597              .toString();
598        }
599    
600        private static final long serialVersionUID = 0;
601      }
602    
603      @SuppressWarnings("unchecked")
604      private static <T> List<Predicate<? super T>> asList(
605          Predicate<? super T> first, Predicate<? super T> second) {
606        return Arrays.<Predicate<? super T>>asList(first, second);
607      }
608    
609      private static <T> List<T> defensiveCopy(T... array) {
610        return defensiveCopy(Arrays.asList(array));
611      }
612    
613      static <T> List<T> defensiveCopy(Iterable<T> iterable) {
614        ArrayList<T> list = new ArrayList<T>();
615        for (T element : iterable) {
616          list.add(checkNotNull(element));
617        }
618        return list;
619      }
620    }