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