1/*
2 * ProGuard -- shrinking, optimization, obfuscation, and preverification
3 *             of Java bytecode.
4 *
5 * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21package proguard.classfile.attribute.visitor;
22
23import proguard.classfile.*;
24import proguard.classfile.attribute.*;
25import proguard.classfile.attribute.annotation.*;
26import proguard.classfile.attribute.preverification.*;
27import proguard.util.*;
28
29import java.util.List;
30
31/**
32 * This AttributeVisitor delegates its visits another AttributeVisitor, but
33 * only when the visited attribute has a name that that matches a given regular
34 * expression.
35 *
36 * @author Eric Lafortune
37 */
38public class AttributeNameFilter
39implements   AttributeVisitor
40{
41    private final StringMatcher    regularExpressionMatcher;
42    private final AttributeVisitor attributeVisitor;
43
44
45    /**
46     * Creates a new AttributeNameFilter.
47     * @param regularExpression the regular expression against which attribute
48     *                          names will be matched.
49     * @param attributeVisitor  the <code>AttributeVisitor</code> to which
50     *                          visits will be delegated.
51     */
52    public AttributeNameFilter(String           regularExpression,
53                               AttributeVisitor attributeVisitor)
54    {
55        this(new ListParser(new NameParser()).parse(regularExpression),
56             attributeVisitor);
57    }
58
59
60    /**
61     * Creates a new AttributeNameFilter.
62     * @param regularExpression the regular expression against which attribute
63     *                          names will be matched.
64     * @param attributeVisitor  the <code>AttributeVisitor</code> to which
65     *                          visits will be delegated.
66     */
67    public AttributeNameFilter(List             regularExpression,
68                               AttributeVisitor attributeVisitor)
69    {
70        this(new ListParser(new NameParser()).parse(regularExpression),
71             attributeVisitor);
72    }
73
74
75    /**
76     * Creates a new AttributeNameFilter.
77     * @param regularExpressionMatcher the string matcher against which
78     *                                 attribute names will be matched.
79     * @param attributeVisitor         the <code>AttributeVisitor</code> to
80     *                                 which visits will be delegated.
81     */
82    public AttributeNameFilter(StringMatcher    regularExpressionMatcher,
83                               AttributeVisitor attributeVisitor)
84    {
85        this.regularExpressionMatcher = regularExpressionMatcher;
86        this.attributeVisitor         = attributeVisitor;
87    }
88
89
90    // Implementations for AttributeVisitor.
91
92    public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute)
93    {
94        if (accepted(clazz, unknownAttribute))
95        {
96            attributeVisitor.visitUnknownAttribute(clazz, unknownAttribute);
97        }
98    }
99
100
101    public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute)
102    {
103        if (accepted(clazz, bootstrapMethodsAttribute))
104        {
105            attributeVisitor.visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute);
106        }
107    }
108
109
110    public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute)
111    {
112        if (accepted(clazz, sourceFileAttribute))
113        {
114            attributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute);
115        }
116    }
117
118
119    public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute)
120    {
121        if (accepted(clazz, sourceDirAttribute))
122        {
123            attributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute);
124        }
125    }
126
127
128    public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute)
129    {
130        if (accepted(clazz, innerClassesAttribute))
131        {
132            attributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute);
133        }
134    }
135
136
137    public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)
138    {
139        if (accepted(clazz, enclosingMethodAttribute))
140        {
141            attributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute);
142        }
143    }
144
145
146    public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute)
147    {
148        if (accepted(clazz, deprecatedAttribute))
149        {
150            attributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute);
151        }
152    }
153
154
155    public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute)
156    {
157        if (accepted(clazz, deprecatedAttribute))
158        {
159            attributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute);
160        }
161    }
162
163
164    public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute)
165    {
166        if (accepted(clazz, deprecatedAttribute))
167        {
168            attributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute);
169        }
170    }
171
172
173    public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute)
174    {
175        if (accepted(clazz, syntheticAttribute))
176        {
177            attributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute);
178        }
179    }
180
181
182    public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute)
183    {
184        if (accepted(clazz, syntheticAttribute))
185        {
186            attributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute);
187        }
188    }
189
190
191    public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute)
192    {
193        if (accepted(clazz, syntheticAttribute))
194        {
195            attributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute);
196        }
197    }
198
199
200    public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)
201    {
202        if (accepted(clazz, signatureAttribute))
203        {
204            attributeVisitor.visitSignatureAttribute(clazz, signatureAttribute);
205        }
206    }
207
208
209    public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute)
210    {
211        if (accepted(clazz, signatureAttribute))
212        {
213            attributeVisitor.visitSignatureAttribute(clazz, field, signatureAttribute);
214        }
215    }
216
217
218    public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute)
219    {
220        if (accepted(clazz, signatureAttribute))
221        {
222            attributeVisitor.visitSignatureAttribute(clazz, method, signatureAttribute);
223        }
224    }
225
226
227    public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute)
228    {
229        if (accepted(clazz, constantValueAttribute))
230        {
231            attributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute);
232        }
233    }
234
235
236    public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute exceptionsAttribute)
237    {
238        if (accepted(clazz, exceptionsAttribute))
239        {
240            attributeVisitor.visitMethodParametersAttribute(clazz, method, exceptionsAttribute);
241        }
242    }
243
244
245    public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute)
246    {
247        if (accepted(clazz, exceptionsAttribute))
248        {
249            attributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute);
250        }
251    }
252
253
254    public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
255    {
256        if (accepted(clazz, codeAttribute))
257        {
258            attributeVisitor.visitCodeAttribute(clazz, method, codeAttribute);
259        }
260    }
261
262
263    public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute)
264    {
265        if (accepted(clazz, stackMapAttribute))
266        {
267            attributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute);
268        }
269    }
270
271
272    public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute)
273    {
274        if (accepted(clazz, stackMapTableAttribute))
275        {
276            attributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute);
277        }
278    }
279
280
281    public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute)
282    {
283        if (accepted(clazz, lineNumberTableAttribute))
284        {
285            attributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute);
286        }
287    }
288
289
290    public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)
291    {
292        if (accepted(clazz, localVariableTableAttribute))
293        {
294            attributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute);
295        }
296    }
297
298
299    public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)
300    {
301        if (accepted(clazz, localVariableTypeTableAttribute))
302        {
303            attributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute);
304        }
305    }
306
307
308    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
309    {
310        if (accepted(clazz, runtimeVisibleAnnotationsAttribute))
311        {
312            attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute);
313        }
314    }
315
316
317    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
318    {
319        if (accepted(clazz, runtimeVisibleAnnotationsAttribute))
320        {
321            attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute);
322        }
323    }
324
325
326    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
327    {
328        if (accepted(clazz, runtimeVisibleAnnotationsAttribute))
329        {
330            attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute);
331        }
332    }
333
334
335    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
336    {
337        if (accepted(clazz, runtimeInvisibleAnnotationsAttribute))
338        {
339            attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute);
340        }
341    }
342
343
344    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
345    {
346        if (accepted(clazz, runtimeInvisibleAnnotationsAttribute))
347        {
348            attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute);
349        }
350    }
351
352
353    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
354    {
355        if (accepted(clazz, runtimeInvisibleAnnotationsAttribute))
356        {
357            attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute);
358        }
359    }
360
361
362    public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute)
363    {
364        if (accepted(clazz, runtimeVisibleParameterAnnotationsAttribute))
365        {
366            attributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute);
367        }
368    }
369
370
371    public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute)
372    {
373        if (accepted(clazz, runtimeInvisibleParameterAnnotationsAttribute))
374        {
375            attributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute);
376        }
377    }
378
379
380    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
381    {
382        if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute))
383        {
384            attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute);
385        }
386    }
387
388
389    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
390    {
391        if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute))
392        {
393            attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute);
394        }
395    }
396
397
398    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
399    {
400        if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute))
401        {
402            attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute);
403        }
404    }
405
406
407    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
408    {
409        if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute))
410        {
411            attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute);
412        }
413    }
414
415
416    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
417    {
418        if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute))
419        {
420            attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute);
421        }
422    }
423
424
425    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
426    {
427        if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute))
428        {
429            attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute);
430        }
431    }
432
433
434    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
435    {
436        if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute))
437        {
438            attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute);
439        }
440    }
441
442
443    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
444    {
445        if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute))
446        {
447            attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute);
448        }
449    }
450
451
452    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
453    {
454        if (accepted(clazz, annotationDefaultAttribute))
455        {
456            attributeVisitor.visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute);
457        }
458    }
459
460
461    // Small utility methods.
462
463    private boolean accepted(Clazz clazz, Attribute attribute)
464    {
465        return regularExpressionMatcher.matches(attribute.getAttributeName(clazz));
466    }
467}
468