1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 package org.eclipse.jgit.treewalk.filter;
46
47 import java.io.IOException;
48 import java.util.Collection;
49
50 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
51 import org.eclipse.jgit.errors.MissingObjectException;
52 import org.eclipse.jgit.internal.JGitText;
53 import org.eclipse.jgit.treewalk.TreeWalk;
54
55
56
57
58
59
60
61
62
63 public abstract class AndTreeFilter extends TreeFilter {
64
65
66
67
68
69
70
71
72
73 public static TreeFilter create(final TreeFilter a, final TreeFilter b) {
74 if (a == ALL)
75 return b;
76 if (b == ALL)
77 return a;
78 return new Binary(a, b);
79 }
80
81
82
83
84
85
86
87
88
89 public static TreeFilter create(final TreeFilter[] list) {
90 if (list.length == 2)
91 return create(list[0], list[1]);
92 if (list.length < 2)
93 throw new IllegalArgumentException(JGitText.get().atLeastTwoFiltersNeeded);
94 final TreeFilter[] subfilters = new TreeFilter[list.length];
95 System.arraycopy(list, 0, subfilters, 0, list.length);
96 return new List(subfilters);
97 }
98
99
100
101
102
103
104
105
106
107 public static TreeFilter create(final Collection<TreeFilter> list) {
108 if (list.size() < 2)
109 throw new IllegalArgumentException(JGitText.get().atLeastTwoFiltersNeeded);
110 final TreeFilter[] subfilters = new TreeFilter[list.size()];
111 list.toArray(subfilters);
112 if (subfilters.length == 2)
113 return create(subfilters[0], subfilters[1]);
114 return new List(subfilters);
115 }
116
117 private static class Binary extends AndTreeFilter {
118 private final TreeFilter a;
119
120 private final TreeFilter b;
121
122 Binary(final TreeFilter one, final TreeFilter two) {
123 a = one;
124 b = two;
125 }
126
127 @Override
128 public boolean include(final TreeWalk walker)
129 throws MissingObjectException, IncorrectObjectTypeException,
130 IOException {
131 return matchFilter(walker) <= 0;
132 }
133
134 @Override
135 public int matchFilter(TreeWalk walker)
136 throws MissingObjectException, IncorrectObjectTypeException,
137 IOException {
138 final int ra = a.matchFilter(walker);
139 if (ra == 1) {
140 return 1;
141 }
142 final int rb = b.matchFilter(walker);
143 if (rb == 1) {
144 return 1;
145 }
146 if (ra == -1 || rb == -1) {
147 return -1;
148 }
149 return 0;
150 }
151
152 @Override
153 public boolean shouldBeRecursive() {
154 return a.shouldBeRecursive() || b.shouldBeRecursive();
155 }
156
157 @Override
158 public TreeFilter clone() {
159 return new Binary(a.clone(), b.clone());
160 }
161
162 @SuppressWarnings("nls")
163 @Override
164 public String toString() {
165 return "(" + a.toString() + " AND " + b.toString() + ")";
166 }
167 }
168
169 private static class List extends AndTreeFilter {
170 private final TreeFilter[] subfilters;
171
172 List(final TreeFilter[] list) {
173 subfilters = list;
174 }
175
176 @Override
177 public boolean include(final TreeWalk walker)
178 throws MissingObjectException, IncorrectObjectTypeException,
179 IOException {
180 return matchFilter(walker) <= 0;
181 }
182
183 @Override
184 public int matchFilter(TreeWalk walker)
185 throws MissingObjectException, IncorrectObjectTypeException,
186 IOException {
187 int m = 0;
188 for (final TreeFilter f : subfilters) {
189 int r = f.matchFilter(walker);
190 if (r == 1) {
191 return 1;
192 }
193 if (r == -1) {
194 m = -1;
195 }
196 }
197 return m;
198 }
199
200 @Override
201 public boolean shouldBeRecursive() {
202 for (final TreeFilter f : subfilters)
203 if (f.shouldBeRecursive())
204 return true;
205 return false;
206 }
207
208 @Override
209 public TreeFilter clone() {
210 final TreeFilter[] s = new TreeFilter[subfilters.length];
211 for (int i = 0; i < s.length; i++)
212 s[i] = subfilters[i].clone();
213 return new List(s);
214 }
215
216 @SuppressWarnings("nls")
217 @Override
218 public String toString() {
219 final StringBuilder r = new StringBuilder();
220 r.append("(");
221 for (int i = 0; i < subfilters.length; i++) {
222 if (i > 0)
223 r.append(" AND ");
224 r.append(subfilters[i].toString());
225 }
226 r.append(")");
227 return r.toString();
228 }
229 }
230 }