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