AttributeNameFilter.java revision db267bc191f906f55eaef21a27110cce2ec57fdf
1/*
2 * ProGuard -- shrinking, optimization, obfuscation, and preverification
3 *             of Java bytecode.
4 *
5 * Copyright (c) 2002-2009 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.StringMatcher;
28
29/**
30 * This AttributeVisitor delegates its visits another AttributeVisitor, but
31 * only when the visited attribute has a name that passes a given string
32 * matcher.
33 *
34 * @author Eric Lafortune
35 */
36public class AttributeNameFilter
37implements   AttributeVisitor
38{
39    private final StringMatcher    stringMatcher;
40    private final AttributeVisitor attributeVisitor;
41
42
43    /**
44     * Creates a new AttributeNameFilter.
45     * @param stringMatcher    the string matcher that will check the attribute
46     *                         names.
47     * @param attributeVisitor the <code>AttributeVisitor</code> to which
48     *                         visits will be delegated.
49     */
50    public AttributeNameFilter(StringMatcher    stringMatcher,
51                               AttributeVisitor attributeVisitor)
52    {
53        this.stringMatcher    = stringMatcher;
54        this.attributeVisitor = attributeVisitor;
55    }
56
57
58    // Implementations for AttributeVisitor.
59
60    public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute)
61    {
62        if (accepted(clazz, unknownAttribute))
63        {
64            unknownAttribute.accept(clazz, attributeVisitor);
65        }
66    }
67
68
69    public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute)
70    {
71        if (accepted(clazz, sourceFileAttribute))
72        {
73            sourceFileAttribute.accept(clazz, attributeVisitor);
74        }
75    }
76
77
78    public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute)
79    {
80        if (accepted(clazz, sourceDirAttribute))
81        {
82            sourceDirAttribute.accept(clazz, attributeVisitor);
83        }
84    }
85
86
87    public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute)
88    {
89        if (accepted(clazz, innerClassesAttribute))
90        {
91            innerClassesAttribute.accept(clazz, attributeVisitor);
92        }
93    }
94
95
96    public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)
97    {
98        if (accepted(clazz, enclosingMethodAttribute))
99        {
100            enclosingMethodAttribute.accept(clazz, attributeVisitor);
101        }
102    }
103
104
105    public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute)
106    {
107        if (accepted(clazz, deprecatedAttribute))
108        {
109            deprecatedAttribute.accept(clazz, attributeVisitor);
110        }
111    }
112
113
114    public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute)
115    {
116        if (accepted(clazz, deprecatedAttribute))
117        {
118            deprecatedAttribute.accept(clazz, field, attributeVisitor);
119        }
120    }
121
122
123    public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute)
124    {
125        if (accepted(clazz, deprecatedAttribute))
126        {
127            deprecatedAttribute.accept(clazz, method, attributeVisitor);
128        }
129    }
130
131
132    public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute)
133    {
134        if (accepted(clazz, syntheticAttribute))
135        {
136            syntheticAttribute.accept(clazz, attributeVisitor);
137        }
138    }
139
140
141    public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute)
142    {
143        if (accepted(clazz, syntheticAttribute))
144        {
145            syntheticAttribute.accept(clazz, field, attributeVisitor);
146        }
147    }
148
149
150    public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute)
151    {
152        if (accepted(clazz, syntheticAttribute))
153        {
154            syntheticAttribute.accept(clazz, method, attributeVisitor);
155        }
156    }
157
158
159    public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)
160    {
161        if (accepted(clazz, signatureAttribute))
162        {
163            signatureAttribute.accept(clazz, attributeVisitor);
164        }
165    }
166
167
168    public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute)
169    {
170        if (accepted(clazz, signatureAttribute))
171        {
172            signatureAttribute.accept(clazz, field, attributeVisitor);
173        }
174    }
175
176
177    public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute)
178    {
179        if (accepted(clazz, signatureAttribute))
180        {
181            signatureAttribute.accept(clazz, method, attributeVisitor);
182        }
183    }
184
185
186    public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute)
187    {
188        if (accepted(clazz, constantValueAttribute))
189        {
190            constantValueAttribute.accept(clazz, field, attributeVisitor);
191        }
192    }
193
194
195    public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute)
196    {
197        if (accepted(clazz, exceptionsAttribute))
198        {
199            exceptionsAttribute.accept(clazz, method, attributeVisitor);
200        }
201    }
202
203
204    public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
205    {
206        if (accepted(clazz, codeAttribute))
207        {
208            codeAttribute.accept(clazz, method, attributeVisitor);
209        }
210    }
211
212
213    public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute)
214    {
215        if (accepted(clazz, stackMapAttribute))
216        {
217            stackMapAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
218        }
219    }
220
221
222    public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute)
223    {
224        if (accepted(clazz, stackMapTableAttribute))
225        {
226            stackMapTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
227        }
228    }
229
230
231    public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute)
232    {
233        if (accepted(clazz, lineNumberTableAttribute))
234        {
235            lineNumberTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
236        }
237    }
238
239
240    public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)
241    {
242        if (accepted(clazz, localVariableTableAttribute))
243        {
244            localVariableTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
245        }
246    }
247
248
249    public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)
250    {
251        if (accepted(clazz, localVariableTypeTableAttribute))
252        {
253            localVariableTypeTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
254        }
255    }
256
257
258    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
259    {
260        if (accepted(clazz, runtimeVisibleAnnotationsAttribute))
261        {
262            runtimeVisibleAnnotationsAttribute.accept(clazz, attributeVisitor);
263        }
264    }
265
266
267    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
268    {
269        if (accepted(clazz, runtimeVisibleAnnotationsAttribute))
270        {
271            runtimeVisibleAnnotationsAttribute.accept(clazz, field, attributeVisitor);
272        }
273    }
274
275
276    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
277    {
278        if (accepted(clazz, runtimeVisibleAnnotationsAttribute))
279        {
280            runtimeVisibleAnnotationsAttribute.accept(clazz, method, attributeVisitor);
281        }
282    }
283
284
285    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
286    {
287        if (accepted(clazz, runtimeInvisibleAnnotationsAttribute))
288        {
289            runtimeInvisibleAnnotationsAttribute.accept(clazz, attributeVisitor);
290        }
291    }
292
293
294    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
295    {
296        if (accepted(clazz, runtimeInvisibleAnnotationsAttribute))
297        {
298            runtimeInvisibleAnnotationsAttribute.accept(clazz, field, attributeVisitor);
299        }
300    }
301
302
303    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
304    {
305        if (accepted(clazz, runtimeInvisibleAnnotationsAttribute))
306        {
307            runtimeInvisibleAnnotationsAttribute.accept(clazz, method, attributeVisitor);
308        }
309    }
310
311
312    public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute)
313    {
314        if (accepted(clazz, runtimeVisibleParameterAnnotationsAttribute))
315        {
316            runtimeVisibleParameterAnnotationsAttribute.accept(clazz, method, attributeVisitor);
317        }
318    }
319
320
321    public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute)
322    {
323        if (accepted(clazz, runtimeInvisibleParameterAnnotationsAttribute))
324        {
325            runtimeInvisibleParameterAnnotationsAttribute.accept(clazz, method, attributeVisitor);
326        }
327    }
328
329
330    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
331    {
332        if (accepted(clazz, annotationDefaultAttribute))
333        {
334            annotationDefaultAttribute.accept(clazz, method, attributeVisitor);
335        }
336    }
337
338
339    // Small utility methods.
340
341    private boolean accepted(Clazz clazz, Attribute attribute)
342    {
343        return stringMatcher.matches(attribute.getAttributeName(clazz));
344    }
345}
346