001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019package org.eclipse.aether.util.filter; 020 021import java.util.Arrays; 022import java.util.Collection; 023import java.util.Collections; 024import java.util.HashSet; 025 026import org.eclipse.aether.graph.DependencyFilter; 027import org.eclipse.aether.util.artifact.JavaScopes; 028 029/** 030 * A utility class assisting in the creation of dependency node filters. 031 */ 032public final class DependencyFilterUtils { 033 034 private DependencyFilterUtils() { 035 // hide constructor 036 } 037 038 /** 039 * Creates a new filter that negates the specified filter. 040 * 041 * @param filter The filter to negate, must not be {@code null}. 042 * @return The new filter, never {@code null}. 043 */ 044 public static DependencyFilter notFilter(DependencyFilter filter) { 045 return new NotDependencyFilter(filter); 046 } 047 048 /** 049 * Creates a new filter that combines the specified filters using a logical {@code AND}. If no filters are 050 * specified, the resulting filter accepts everything. 051 * 052 * @param filters The filters to combine, may be {@code null}. 053 * @return The new filter, never {@code null}. 054 */ 055 public static DependencyFilter andFilter(DependencyFilter... filters) { 056 if (filters != null && filters.length == 1) { 057 return filters[0]; 058 } else { 059 return new AndDependencyFilter(filters); 060 } 061 } 062 063 /** 064 * Creates a new filter that combines the specified filters using a logical {@code AND}. If no filters are 065 * specified, the resulting filter accepts everything. 066 * 067 * @param filters The filters to combine, may be {@code null}. 068 * @return The new filter, never {@code null}. 069 */ 070 public static DependencyFilter andFilter(Collection<DependencyFilter> filters) { 071 if (filters != null && filters.size() == 1) { 072 return filters.iterator().next(); 073 } else { 074 return new AndDependencyFilter(filters); 075 } 076 } 077 078 /** 079 * Creates a new filter that combines the specified filters using a logical {@code OR}. If no filters are specified, 080 * the resulting filter accepts nothing. 081 * 082 * @param filters The filters to combine, may be {@code null}. 083 * @return The new filter, never {@code null}. 084 */ 085 public static DependencyFilter orFilter(DependencyFilter... filters) { 086 if (filters != null && filters.length == 1) { 087 return filters[0]; 088 } else { 089 return new OrDependencyFilter(filters); 090 } 091 } 092 093 /** 094 * Creates a new filter that combines the specified filters using a logical {@code OR}. If no filters are specified, 095 * the resulting filter accepts nothing. 096 * 097 * @param filters The filters to combine, may be {@code null}. 098 * @return The new filter, never {@code null}. 099 */ 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 * @deprecated Resolver is oblivious about "scopes", it is consumer project which needs to lay these down and 117 * also assign proper semantics. Moreover, Resolver is oblivious about notions of "classpath", "modulepath", and 118 * any other similar uses. These should be handled by consumer project. 119 */ 120 @Deprecated 121 public static DependencyFilter classpathFilter(String... classpathTypes) { 122 return classpathFilter((classpathTypes != null) ? Arrays.asList(classpathTypes) : null); 123 } 124 125 /** 126 * Creates a new filter that selects dependencies whose scope matches one or more of the specified classpath types. 127 * A classpath type is a set of scopes separated by either {@code ','} or {@code '+'}. 128 * 129 * @param classpathTypes The classpath types, may be {@code null} or empty to match no dependency. 130 * @return The new filter, never {@code null}. 131 * @see JavaScopes 132 * 133 * @deprecated Resolver is oblivious about "scopes", it is consumer project which needs to lay these down and 134 * also assign proper semantics. Moreover, Resolver is oblivious about notions of "classpath", "modulepath", and 135 * any other similar uses. These should be handled by consumer project. 136 */ 137 @Deprecated 138 public static DependencyFilter classpathFilter(Collection<String> classpathTypes) { 139 Collection<String> types = new HashSet<>(); 140 141 if (classpathTypes != null) { 142 for (String classpathType : classpathTypes) { 143 String[] tokens = classpathType.split("[+,]"); 144 for (String token : tokens) { 145 token = token.trim(); 146 if (!token.isEmpty()) { 147 types.add(token); 148 } 149 } 150 } 151 } 152 153 Collection<String> included = new HashSet<>(); 154 for (String type : types) { 155 if (JavaScopes.COMPILE.equals(type)) { 156 Collections.addAll(included, JavaScopes.COMPILE, JavaScopes.PROVIDED, JavaScopes.SYSTEM); 157 } else if (JavaScopes.RUNTIME.equals(type)) { 158 Collections.addAll(included, JavaScopes.COMPILE, JavaScopes.RUNTIME); 159 } else if (JavaScopes.TEST.equals(type)) { 160 Collections.addAll( 161 included, 162 JavaScopes.COMPILE, 163 JavaScopes.PROVIDED, 164 JavaScopes.SYSTEM, 165 JavaScopes.RUNTIME, 166 JavaScopes.TEST); 167 } else { 168 included.add(type); 169 } 170 } 171 172 Collection<String> excluded = new HashSet<>(); 173 Collections.addAll( 174 excluded, 175 JavaScopes.COMPILE, 176 JavaScopes.PROVIDED, 177 JavaScopes.SYSTEM, 178 JavaScopes.RUNTIME, 179 JavaScopes.TEST); 180 excluded.removeAll(included); 181 182 return new ScopeDependencyFilter(null, excluded); 183 } 184}