001: /*
002: * ProGuard -- shrinking, optimization, obfuscation, and preverification
003: * of Java bytecode.
004: *
005: * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
006: *
007: * This program is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU General Public License as published by the Free
009: * Software Foundation; either version 2 of the License, or (at your option)
010: * any later version.
011: *
012: * This program is distributed in the hope that it will be useful, but WITHOUT
013: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
015: * more details.
016: *
017: * You should have received a copy of the GNU General Public License along
018: * with this program; if not, write to the Free Software Foundation, Inc.,
019: * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: */
021: package proguard.classfile.attribute.visitor;
022:
023: import proguard.classfile.*;
024: import proguard.classfile.attribute.*;
025: import proguard.classfile.attribute.annotation.*;
026: import proguard.classfile.attribute.preverification.*;
027: import proguard.util.StringMatcher;
028:
029: /**
030: * This AttributeVisitor delegates its visits another AttributeVisitor, but
031: * only when the visited attribute has a name that passes a given string
032: * matcher.
033: *
034: * @author Eric Lafortune
035: */
036: public class AttributeNameFilter implements AttributeVisitor {
037: private final StringMatcher stringMatcher;
038: private final AttributeVisitor attributeVisitor;
039:
040: /**
041: * Creates a new AttributeNameFilter.
042: * @param stringMatcher the string matcher that will check the attribute
043: * names.
044: * @param attributeVisitor the <code>AttributeVisitor</code> to which
045: * visits will be delegated.
046: */
047: public AttributeNameFilter(StringMatcher stringMatcher,
048: AttributeVisitor attributeVisitor) {
049: this .stringMatcher = stringMatcher;
050: this .attributeVisitor = attributeVisitor;
051: }
052:
053: // Implementations for AttributeVisitor.
054:
055: public void visitUnknownAttribute(Clazz clazz,
056: UnknownAttribute unknownAttribute) {
057: if (accepted(clazz, unknownAttribute)) {
058: unknownAttribute.accept(clazz, attributeVisitor);
059: }
060: }
061:
062: public void visitSourceFileAttribute(Clazz clazz,
063: SourceFileAttribute sourceFileAttribute) {
064: if (accepted(clazz, sourceFileAttribute)) {
065: sourceFileAttribute.accept(clazz, attributeVisitor);
066: }
067: }
068:
069: public void visitSourceDirAttribute(Clazz clazz,
070: SourceDirAttribute sourceDirAttribute) {
071: if (accepted(clazz, sourceDirAttribute)) {
072: sourceDirAttribute.accept(clazz, attributeVisitor);
073: }
074: }
075:
076: public void visitInnerClassesAttribute(Clazz clazz,
077: InnerClassesAttribute innerClassesAttribute) {
078: if (accepted(clazz, innerClassesAttribute)) {
079: innerClassesAttribute.accept(clazz, attributeVisitor);
080: }
081: }
082:
083: public void visitEnclosingMethodAttribute(Clazz clazz,
084: EnclosingMethodAttribute enclosingMethodAttribute) {
085: if (accepted(clazz, enclosingMethodAttribute)) {
086: enclosingMethodAttribute.accept(clazz, attributeVisitor);
087: }
088: }
089:
090: public void visitDeprecatedAttribute(Clazz clazz,
091: DeprecatedAttribute deprecatedAttribute) {
092: if (accepted(clazz, deprecatedAttribute)) {
093: deprecatedAttribute.accept(clazz, attributeVisitor);
094: }
095: }
096:
097: public void visitDeprecatedAttribute(Clazz clazz, Field field,
098: DeprecatedAttribute deprecatedAttribute) {
099: if (accepted(clazz, deprecatedAttribute)) {
100: deprecatedAttribute.accept(clazz, field, attributeVisitor);
101: }
102: }
103:
104: public void visitDeprecatedAttribute(Clazz clazz, Method method,
105: DeprecatedAttribute deprecatedAttribute) {
106: if (accepted(clazz, deprecatedAttribute)) {
107: deprecatedAttribute.accept(clazz, method, attributeVisitor);
108: }
109: }
110:
111: public void visitSyntheticAttribute(Clazz clazz,
112: SyntheticAttribute syntheticAttribute) {
113: if (accepted(clazz, syntheticAttribute)) {
114: syntheticAttribute.accept(clazz, attributeVisitor);
115: }
116: }
117:
118: public void visitSyntheticAttribute(Clazz clazz, Field field,
119: SyntheticAttribute syntheticAttribute) {
120: if (accepted(clazz, syntheticAttribute)) {
121: syntheticAttribute.accept(clazz, field, attributeVisitor);
122: }
123: }
124:
125: public void visitSyntheticAttribute(Clazz clazz, Method method,
126: SyntheticAttribute syntheticAttribute) {
127: if (accepted(clazz, syntheticAttribute)) {
128: syntheticAttribute.accept(clazz, method, attributeVisitor);
129: }
130: }
131:
132: public void visitSignatureAttribute(Clazz clazz,
133: SignatureAttribute signatureAttribute) {
134: if (accepted(clazz, signatureAttribute)) {
135: signatureAttribute.accept(clazz, attributeVisitor);
136: }
137: }
138:
139: public void visitSignatureAttribute(Clazz clazz, Field field,
140: SignatureAttribute signatureAttribute) {
141: if (accepted(clazz, signatureAttribute)) {
142: signatureAttribute.accept(clazz, field, attributeVisitor);
143: }
144: }
145:
146: public void visitSignatureAttribute(Clazz clazz, Method method,
147: SignatureAttribute signatureAttribute) {
148: if (accepted(clazz, signatureAttribute)) {
149: signatureAttribute.accept(clazz, method, attributeVisitor);
150: }
151: }
152:
153: public void visitConstantValueAttribute(Clazz clazz, Field field,
154: ConstantValueAttribute constantValueAttribute) {
155: if (accepted(clazz, constantValueAttribute)) {
156: constantValueAttribute.accept(clazz, field,
157: attributeVisitor);
158: }
159: }
160:
161: public void visitExceptionsAttribute(Clazz clazz, Method method,
162: ExceptionsAttribute exceptionsAttribute) {
163: if (accepted(clazz, exceptionsAttribute)) {
164: exceptionsAttribute.accept(clazz, method, attributeVisitor);
165: }
166: }
167:
168: public void visitCodeAttribute(Clazz clazz, Method method,
169: CodeAttribute codeAttribute) {
170: if (accepted(clazz, codeAttribute)) {
171: codeAttribute.accept(clazz, method, attributeVisitor);
172: }
173: }
174:
175: public void visitStackMapAttribute(Clazz clazz, Method method,
176: CodeAttribute codeAttribute,
177: StackMapAttribute stackMapAttribute) {
178: if (accepted(clazz, stackMapAttribute)) {
179: stackMapAttribute.accept(clazz, method, codeAttribute,
180: attributeVisitor);
181: }
182: }
183:
184: public void visitStackMapTableAttribute(Clazz clazz, Method method,
185: CodeAttribute codeAttribute,
186: StackMapTableAttribute stackMapTableAttribute) {
187: if (accepted(clazz, stackMapTableAttribute)) {
188: stackMapTableAttribute.accept(clazz, method, codeAttribute,
189: attributeVisitor);
190: }
191: }
192:
193: public void visitLineNumberTableAttribute(Clazz clazz,
194: Method method, CodeAttribute codeAttribute,
195: LineNumberTableAttribute lineNumberTableAttribute) {
196: if (accepted(clazz, lineNumberTableAttribute)) {
197: lineNumberTableAttribute.accept(clazz, method,
198: codeAttribute, attributeVisitor);
199: }
200: }
201:
202: public void visitLocalVariableTableAttribute(Clazz clazz,
203: Method method, CodeAttribute codeAttribute,
204: LocalVariableTableAttribute localVariableTableAttribute) {
205: if (accepted(clazz, localVariableTableAttribute)) {
206: localVariableTableAttribute.accept(clazz, method,
207: codeAttribute, attributeVisitor);
208: }
209: }
210:
211: public void visitLocalVariableTypeTableAttribute(
212: Clazz clazz,
213: Method method,
214: CodeAttribute codeAttribute,
215: LocalVariableTypeTableAttribute localVariableTypeTableAttribute) {
216: if (accepted(clazz, localVariableTypeTableAttribute)) {
217: localVariableTypeTableAttribute.accept(clazz, method,
218: codeAttribute, attributeVisitor);
219: }
220: }
221:
222: public void visitRuntimeVisibleAnnotationsAttribute(
223: Clazz clazz,
224: RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) {
225: if (accepted(clazz, runtimeVisibleAnnotationsAttribute)) {
226: runtimeVisibleAnnotationsAttribute.accept(clazz,
227: attributeVisitor);
228: }
229: }
230:
231: public void visitRuntimeVisibleAnnotationsAttribute(
232: Clazz clazz,
233: Field field,
234: RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) {
235: if (accepted(clazz, runtimeVisibleAnnotationsAttribute)) {
236: runtimeVisibleAnnotationsAttribute.accept(clazz, field,
237: attributeVisitor);
238: }
239: }
240:
241: public void visitRuntimeVisibleAnnotationsAttribute(
242: Clazz clazz,
243: Method method,
244: RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) {
245: if (accepted(clazz, runtimeVisibleAnnotationsAttribute)) {
246: runtimeVisibleAnnotationsAttribute.accept(clazz, method,
247: attributeVisitor);
248: }
249: }
250:
251: public void visitRuntimeInvisibleAnnotationsAttribute(
252: Clazz clazz,
253: RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) {
254: if (accepted(clazz, runtimeInvisibleAnnotationsAttribute)) {
255: runtimeInvisibleAnnotationsAttribute.accept(clazz,
256: attributeVisitor);
257: }
258: }
259:
260: public void visitRuntimeInvisibleAnnotationsAttribute(
261: Clazz clazz,
262: Field field,
263: RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) {
264: if (accepted(clazz, runtimeInvisibleAnnotationsAttribute)) {
265: runtimeInvisibleAnnotationsAttribute.accept(clazz, field,
266: attributeVisitor);
267: }
268: }
269:
270: public void visitRuntimeInvisibleAnnotationsAttribute(
271: Clazz clazz,
272: Method method,
273: RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) {
274: if (accepted(clazz, runtimeInvisibleAnnotationsAttribute)) {
275: runtimeInvisibleAnnotationsAttribute.accept(clazz, method,
276: attributeVisitor);
277: }
278: }
279:
280: public void visitRuntimeVisibleParameterAnnotationsAttribute(
281: Clazz clazz,
282: Method method,
283: RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) {
284: if (accepted(clazz, runtimeVisibleParameterAnnotationsAttribute)) {
285: runtimeVisibleParameterAnnotationsAttribute.accept(clazz,
286: method, attributeVisitor);
287: }
288: }
289:
290: public void visitRuntimeInvisibleParameterAnnotationsAttribute(
291: Clazz clazz,
292: Method method,
293: RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) {
294: if (accepted(clazz,
295: runtimeInvisibleParameterAnnotationsAttribute)) {
296: runtimeInvisibleParameterAnnotationsAttribute.accept(clazz,
297: method, attributeVisitor);
298: }
299: }
300:
301: public void visitAnnotationDefaultAttribute(Clazz clazz,
302: Method method,
303: AnnotationDefaultAttribute annotationDefaultAttribute) {
304: if (accepted(clazz, annotationDefaultAttribute)) {
305: annotationDefaultAttribute.accept(clazz, method,
306: attributeVisitor);
307: }
308: }
309:
310: // Small utility methods.
311:
312: private boolean accepted(Clazz clazz, Attribute attribute) {
313: return stringMatcher.matches(attribute.getAttributeName(clazz));
314: }
315: }
|