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      */
116     public static DependencyFilter classpathFilter(String... classpathTypes) {
117         return classpathFilter((classpathTypes != null) ? Arrays.asList(classpathTypes) : null);
118     }
119 
120     /**
121      * Creates a new filter that selects dependencies whose scope matches one or more of the specified classpath types.
122      * A classpath type is a set of scopes separated by either {@code ','} or {@code '+'}.
123      *
124      * @param classpathTypes The classpath types, may be {@code null} or empty to match no dependency.
125      * @return The new filter, never {@code null}.
126      * @see JavaScopes
127      */
128     public static DependencyFilter classpathFilter(Collection<String> classpathTypes) {
129         Collection<String> types = new HashSet<>();
130 
131         if (classpathTypes != null) {
132             for (String classpathType : classpathTypes) {
133                 String[] tokens = classpathType.split("[+,]");
134                 for (String token : tokens) {
135                     token = token.trim();
136                     if (token.length() > 0) {
137                         types.add(token);
138                     }
139                 }
140             }
141         }
142 
143         Collection<String> included = new HashSet<>();
144         for (String type : types) {
145             if (JavaScopes.COMPILE.equals(type)) {
146                 Collections.addAll(included, JavaScopes.COMPILE, JavaScopes.PROVIDED, JavaScopes.SYSTEM);
147             } else if (JavaScopes.RUNTIME.equals(type)) {
148                 Collections.addAll(included, JavaScopes.COMPILE, JavaScopes.RUNTIME);
149             } else if (JavaScopes.TEST.equals(type)) {
150                 Collections.addAll(
151                         included,
152                         JavaScopes.COMPILE,
153                         JavaScopes.PROVIDED,
154                         JavaScopes.SYSTEM,
155                         JavaScopes.RUNTIME,
156                         JavaScopes.TEST);
157             } else {
158                 included.add(type);
159             }
160         }
161 
162         Collection<String> excluded = new HashSet<>();
163         Collections.addAll(
164                 excluded,
165                 JavaScopes.COMPILE,
166                 JavaScopes.PROVIDED,
167                 JavaScopes.SYSTEM,
168                 JavaScopes.RUNTIME,
169                 JavaScopes.TEST);
170         excluded.removeAll(included);
171 
172         return new ScopeDependencyFilter(null, excluded);
173     }
174 }