1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.aether.util.graph.version;
20
21 import java.util.Arrays;
22 import java.util.Collection;
23
24 import org.eclipse.aether.RepositoryException;
25 import org.eclipse.aether.collection.DependencyCollectionContext;
26 import org.eclipse.aether.collection.VersionFilter;
27
28
29
30
31
32 public class ChainedVersionFilter implements VersionFilter {
33
34 private final VersionFilter[] filters;
35
36 private final int hashCode;
37
38
39
40
41
42
43
44
45 public static VersionFilter newInstance(VersionFilter filter1, VersionFilter filter2) {
46 if (filter1 == null) {
47 return filter2;
48 }
49 if (filter2 == null) {
50 return filter1;
51 }
52 return new ChainedVersionFilter(new VersionFilter[] {filter1, filter2});
53 }
54
55
56
57
58
59
60
61 public static VersionFilter newInstance(VersionFilter... filters) {
62 if (filters.length <= 1) {
63 if (filters.length <= 0) {
64 return null;
65 }
66 return filters[0];
67 }
68 return new ChainedVersionFilter(filters.clone());
69 }
70
71
72
73
74
75
76
77 public static VersionFilter newInstance(Collection<? extends VersionFilter> filters) {
78 if (filters.size() <= 1) {
79 if (filters.isEmpty()) {
80 return null;
81 }
82 return filters.iterator().next();
83 }
84 return new ChainedVersionFilter(filters.toArray(new VersionFilter[0]));
85 }
86
87 private ChainedVersionFilter(VersionFilter[] filters) {
88 this.filters = filters;
89 this.hashCode = getClass().hashCode() * 31 + Arrays.hashCode(filters);
90 }
91
92 @Override
93 public void filterVersions(VersionFilterContext context) throws RepositoryException {
94 for (int i = 0, n = filters.length; i < n && context.getCount() > 0; i++) {
95 filters[i].filterVersions(context);
96 }
97 }
98
99 @Override
100 public VersionFilter deriveChildFilter(DependencyCollectionContext context) {
101 VersionFilter[] children = null;
102 int removed = 0;
103 for (int i = 0, n = filters.length; i < n; i++) {
104 VersionFilter child = filters[i].deriveChildFilter(context);
105 if (children != null) {
106 children[i - removed] = child;
107 } else if (child != filters[i]) {
108 children = new VersionFilter[filters.length];
109 System.arraycopy(filters, 0, children, 0, i);
110 children[i - removed] = child;
111 }
112 if (child == null) {
113 removed++;
114 }
115 }
116 if (children == null) {
117 return this;
118 }
119 if (removed > 0) {
120 int count = filters.length - removed;
121 if (count <= 0) {
122 return null;
123 }
124 if (count == 1) {
125 return children[0];
126 }
127 VersionFilter[] tmp = new VersionFilter[count];
128 System.arraycopy(children, 0, tmp, 0, count);
129 children = tmp;
130 }
131 return new ChainedVersionFilter(children);
132 }
133
134 @Override
135 public boolean equals(Object obj) {
136 if (this == obj) {
137 return true;
138 } else if (null == obj || !getClass().equals(obj.getClass())) {
139 return false;
140 }
141
142 ChainedVersionFilter that = (ChainedVersionFilter) obj;
143 return Arrays.equals(filters, that.filters);
144 }
145
146 @Override
147 public int hashCode() {
148 return hashCode;
149 }
150 }