View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.eclipse.aether.util.filter;
20  
21  import java.util.Arrays;
22  import java.util.Collection;
23  import java.util.Collections;
24  import java.util.HashSet;
25  
26  import org.eclipse.aether.graph.DependencyFilter;
27  import org.eclipse.aether.util.artifact.JavaScopes;
28  
29  /**
30   * A utility class assisting in the creation of dependency node filters.
31   */
32  public final class DependencyFilterUtils {
33  
34      private DependencyFilterUtils() {
35          // hide constructor
36      }
37  
38      /**
39       * Creates a new filter that negates the specified filter.
40       *
41       * @param filter the filter to negate, must not be {@code null}
42       * @return the new filter, never {@code null}
43       */
44      public static DependencyFilter notFilter(DependencyFilter filter) {
45          return new NotDependencyFilter(filter);
46      }
47  
48      /**
49       * Creates a new filter that combines the specified filters using a logical {@code AND}. If no filters are
50       * specified, the resulting filter accepts everything.
51       *
52       * @param filters the filters to combine, may be {@code null}
53       * @return the new filter, never {@code null}
54       */
55      public static DependencyFilter andFilter(DependencyFilter... filters) {
56          if (filters != null && filters.length == 1) {
57              return filters[0];
58          } else {
59              return new AndDependencyFilter(filters);
60          }
61      }
62  
63      /**
64       * Creates a new filter that combines the specified filters using a logical {@code AND}. If no filters are
65       * specified, the resulting filter accepts everything.
66       *
67       * @param filters the filters to combine, may be {@code null}
68       * @return the new filter, never {@code null}
69       */
70      public static DependencyFilter andFilter(Collection<DependencyFilter> filters) {
71          if (filters != null && filters.size() == 1) {
72              return filters.iterator().next();
73          } else {
74              return new AndDependencyFilter(filters);
75          }
76      }
77  
78      /**
79       * Creates a new filter that combines the specified filters using a logical {@code OR}. If no filters are specified,
80       * the resulting filter accepts nothing.
81       *
82       * @param filters the filters to combine, may be {@code null}
83       * @return the new filter, never {@code null}
84       */
85      public static DependencyFilter orFilter(DependencyFilter... filters) {
86          if (filters != null && filters.length == 1) {
87              return filters[0];
88          } else {
89              return new OrDependencyFilter(filters);
90          }
91      }
92  
93      /**
94       * Creates a new filter that combines the specified filters using a logical {@code OR}. If no filters are specified,
95       * the resulting filter accepts nothing.
96       *
97       * @param filters the filters to combine, may be {@code null}
98       * @return the new filter, never {@code null}
99       */
100     public static DependencyFilter orFilter(Collection<DependencyFilter> filters) {
101         if (filters != null && filters.size() == 1) {
102             return filters.iterator().next();
103         } else {
104             return new OrDependencyFilter(filters);
105         }
106     }
107 
108     /**
109      * Creates a new filter that selects dependencies whose scope matches one or more of the specified classpath types.
110      * A classpath type is a set of scopes separated by either {@code ','} or {@code '+'}.
111      *
112      * @param classpathTypes the classpath types, may be {@code null} or empty to match no dependency
113      * @return the new filter, never {@code null}
114      * @see JavaScopes
115      * @deprecated resolver is oblivious about "scopes", it is consumer project which needs to lay these down and
116      * also assign proper semantics. Moreover, Resolver is oblivious about notions of "classpath", "modulepath", and
117      * any other similar uses. These should be handled by consumer project.
118      */
119     @Deprecated
120     public static DependencyFilter classpathFilter(String... classpathTypes) {
121         return classpathFilter((classpathTypes != null) ? Arrays.asList(classpathTypes) : null);
122     }
123 
124     /**
125      * Creates a new filter that selects dependencies whose scope matches one or more of the specified classpath types.
126      * A classpath type is a set of scopes separated by either {@code ','} or {@code '+'}.
127      *
128      * @param classpathTypes the classpath types, may be {@code null} or empty to match no dependency
129      * @return the new filter, never {@code null}
130      * @see JavaScopes
131      * @deprecated resolver is oblivious about "scopes", it is consumer project which needs to lay these down and
132      * also assign proper semantics. Moreover, Resolver is oblivious about notions of "classpath", "modulepath", and
133      * any other similar uses. These should be handled by consumer project.
134      */
135     @Deprecated
136     public static DependencyFilter classpathFilter(Collection<String> classpathTypes) {
137         Collection<String> types = new HashSet<>();
138 
139         if (classpathTypes != null) {
140             for (String classpathType : classpathTypes) {
141                 String[] tokens = classpathType.split("[+,]");
142                 for (String token : tokens) {
143                     token = token.trim();
144                     if (!token.isEmpty()) {
145                         types.add(token);
146                     }
147                 }
148             }
149         }
150 
151         Collection<String> included = new HashSet<>();
152         for (String type : types) {
153             if (JavaScopes.COMPILE.equals(type)) {
154                 Collections.addAll(included, JavaScopes.COMPILE, JavaScopes.PROVIDED, JavaScopes.SYSTEM);
155             } else if (JavaScopes.RUNTIME.equals(type)) {
156                 Collections.addAll(included, JavaScopes.COMPILE, JavaScopes.RUNTIME);
157             } else if (JavaScopes.TEST.equals(type)) {
158                 Collections.addAll(
159                         included,
160                         JavaScopes.COMPILE,
161                         JavaScopes.PROVIDED,
162                         JavaScopes.SYSTEM,
163                         JavaScopes.RUNTIME,
164                         JavaScopes.TEST);
165             } else {
166                 included.add(type);
167             }
168         }
169 
170         Collection<String> excluded = new HashSet<>();
171         Collections.addAll(
172                 excluded,
173                 JavaScopes.COMPILE,
174                 JavaScopes.PROVIDED,
175                 JavaScopes.SYSTEM,
176                 JavaScopes.RUNTIME,
177                 JavaScopes.TEST);
178         excluded.removeAll(included);
179 
180         return new ScopeDependencyFilter(null, excluded);
181     }
182 }