1 package org.eclipse.aether.util.graph.selector;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.Arrays;
23 import java.util.Collection;
24 import java.util.Collections;
25 import java.util.LinkedHashSet;
26 import java.util.Set;
27
28 import org.eclipse.aether.collection.DependencyCollectionContext;
29 import org.eclipse.aether.collection.DependencySelector;
30 import org.eclipse.aether.graph.Dependency;
31
32
33
34
35
36 public final class AndDependencySelector
37 implements DependencySelector
38 {
39
40 private final Set<? extends DependencySelector> selectors;
41
42 private int hashCode;
43
44
45
46
47
48
49
50 public AndDependencySelector( DependencySelector... selectors )
51 {
52 if ( selectors != null && selectors.length > 0 )
53 {
54 this.selectors = new LinkedHashSet<DependencySelector>( Arrays.asList( selectors ) );
55 }
56 else
57 {
58 this.selectors = Collections.emptySet();
59 }
60 }
61
62
63
64
65
66
67 public AndDependencySelector( Collection<? extends DependencySelector> selectors )
68 {
69 if ( selectors != null && !selectors.isEmpty() )
70 {
71 this.selectors = new LinkedHashSet<DependencySelector>( selectors );
72 }
73 else
74 {
75 this.selectors = Collections.emptySet();
76 }
77 }
78
79 private AndDependencySelector( Set<DependencySelector> selectors )
80 {
81 if ( selectors != null && !selectors.isEmpty() )
82 {
83 this.selectors = selectors;
84 }
85 else
86 {
87 this.selectors = Collections.emptySet();
88 }
89 }
90
91
92
93
94
95
96
97
98 public static DependencySelector newInstance( DependencySelector selector1, DependencySelector selector2 )
99 {
100 if ( selector1 == null )
101 {
102 return selector2;
103 }
104 else if ( selector2 == null || selector2.equals( selector1 ) )
105 {
106 return selector1;
107 }
108 return new AndDependencySelector( selector1, selector2 );
109 }
110
111 public boolean selectDependency( Dependency dependency )
112 {
113 for ( DependencySelector selector : selectors )
114 {
115 if ( !selector.selectDependency( dependency ) )
116 {
117 return false;
118 }
119 }
120 return true;
121 }
122
123 public DependencySelector deriveChildSelector( DependencyCollectionContext context )
124 {
125 int seen = 0;
126 Set<DependencySelector> childSelectors = null;
127
128 for ( DependencySelector selector : selectors )
129 {
130 DependencySelector childSelector = selector.deriveChildSelector( context );
131 if ( childSelectors != null )
132 {
133 if ( childSelector != null )
134 {
135 childSelectors.add( childSelector );
136 }
137 }
138 else if ( selector != childSelector )
139 {
140 childSelectors = new LinkedHashSet<DependencySelector>();
141 if ( seen > 0 )
142 {
143 for ( DependencySelector s : selectors )
144 {
145 if ( childSelectors.size() >= seen )
146 {
147 break;
148 }
149 childSelectors.add( s );
150 }
151 }
152 if ( childSelector != null )
153 {
154 childSelectors.add( childSelector );
155 }
156 }
157 else
158 {
159 seen++;
160 }
161 }
162
163 if ( childSelectors == null )
164 {
165 return this;
166 }
167 if ( childSelectors.size() <= 1 )
168 {
169 if ( childSelectors.isEmpty() )
170 {
171 return null;
172 }
173 return childSelectors.iterator().next();
174 }
175 return new AndDependencySelector( childSelectors );
176 }
177
178 @Override
179 public boolean equals( Object obj )
180 {
181 if ( this == obj )
182 {
183 return true;
184 }
185 else if ( null == obj || !getClass().equals( obj.getClass() ) )
186 {
187 return false;
188 }
189
190 AndDependencySelector that = (AndDependencySelector) obj;
191 return selectors.equals( that.selectors );
192 }
193
194 @Override
195 public int hashCode()
196 {
197 if ( hashCode == 0 )
198 {
199 int hash = 17;
200 hash = hash * 31 + selectors.hashCode();
201 hashCode = hash;
202 }
203 return hashCode;
204 }
205
206 }