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.obfuscate.AttributeShrinker;
028:
029: /**
030: * This AttributeVisitor delegates its visits to one of two other
031: * AttributeVisitor instances, depending on whether the visited attribute
032: * is strictly required or not.
033: *
034: * @see AttributeShrinker
035: *
036: * @author Eric Lafortune
037: */
038: public class RequiredAttributeFilter implements AttributeVisitor {
039: private final AttributeVisitor requiredAttributeVisitor;
040: private final AttributeVisitor optionalAttributeVisitor;
041:
042: /**
043: * Creates a new RequiredAttributeFilter for visiting required attributes.
044: * @param requiredAttributeVisitor the visitor that will visit required
045: * attributes.
046: */
047: public RequiredAttributeFilter(
048: AttributeVisitor requiredAttributeVisitor) {
049: this (requiredAttributeVisitor, null);
050: }
051:
052: /**
053: * Creates a new RequiredAttributeFilter for visiting required and
054: * optional attributes.
055: * @param requiredAttributeVisitor the visitor that will visit required
056: * attributes.
057: * @param optionalAttributeVisitor the visitor that will visit optional
058: * attributes.
059: */
060: public RequiredAttributeFilter(
061: AttributeVisitor requiredAttributeVisitor,
062: AttributeVisitor optionalAttributeVisitor) {
063: this .requiredAttributeVisitor = requiredAttributeVisitor;
064: this .optionalAttributeVisitor = optionalAttributeVisitor;
065: }
066:
067: // Implementations for AttributeVisitor.
068:
069: public void visitUnknownAttribute(Clazz clazz,
070: UnknownAttribute unknownAttribute) {
071: if (optionalAttributeVisitor != null) {
072: unknownAttribute.accept(clazz, optionalAttributeVisitor);
073: }
074: }
075:
076: public void visitSourceFileAttribute(Clazz clazz,
077: SourceFileAttribute sourceFileAttribute) {
078: if (optionalAttributeVisitor != null) {
079: sourceFileAttribute.accept(clazz, optionalAttributeVisitor);
080: }
081: }
082:
083: public void visitSourceDirAttribute(Clazz clazz,
084: SourceDirAttribute sourceDirAttribute) {
085: if (optionalAttributeVisitor != null) {
086: sourceDirAttribute.accept(clazz, optionalAttributeVisitor);
087: }
088: }
089:
090: public void visitInnerClassesAttribute(Clazz clazz,
091: InnerClassesAttribute innerClassesAttribute) {
092: if (optionalAttributeVisitor != null) {
093: innerClassesAttribute.accept(clazz,
094: optionalAttributeVisitor);
095: }
096: }
097:
098: public void visitEnclosingMethodAttribute(Clazz clazz,
099: EnclosingMethodAttribute enclosingMethodAttribute) {
100: if (optionalAttributeVisitor != null) {
101: enclosingMethodAttribute.accept(clazz,
102: optionalAttributeVisitor);
103: }
104: }
105:
106: public void visitDeprecatedAttribute(Clazz clazz,
107: DeprecatedAttribute deprecatedAttribute) {
108: if (optionalAttributeVisitor != null) {
109: deprecatedAttribute.accept(clazz, optionalAttributeVisitor);
110: }
111: }
112:
113: public void visitDeprecatedAttribute(Clazz clazz, Field field,
114: DeprecatedAttribute deprecatedAttribute) {
115: if (optionalAttributeVisitor != null) {
116: deprecatedAttribute.accept(clazz, field,
117: optionalAttributeVisitor);
118: }
119: }
120:
121: public void visitDeprecatedAttribute(Clazz clazz, Method method,
122: DeprecatedAttribute deprecatedAttribute) {
123: if (optionalAttributeVisitor != null) {
124: deprecatedAttribute.accept(clazz, method,
125: optionalAttributeVisitor);
126: }
127: }
128:
129: public void visitSyntheticAttribute(Clazz clazz,
130: SyntheticAttribute syntheticAttribute) {
131: if (optionalAttributeVisitor != null) {
132: syntheticAttribute.accept(clazz, optionalAttributeVisitor);
133: }
134: }
135:
136: public void visitSyntheticAttribute(Clazz clazz, Field field,
137: SyntheticAttribute syntheticAttribute) {
138: if (optionalAttributeVisitor != null) {
139: syntheticAttribute.accept(clazz, field,
140: optionalAttributeVisitor);
141: }
142: }
143:
144: public void visitSyntheticAttribute(Clazz clazz, Method method,
145: SyntheticAttribute syntheticAttribute) {
146: if (optionalAttributeVisitor != null) {
147: syntheticAttribute.accept(clazz, method,
148: optionalAttributeVisitor);
149: }
150: }
151:
152: public void visitSignatureAttribute(Clazz clazz,
153: SignatureAttribute signatureAttribute) {
154: if (optionalAttributeVisitor != null) {
155: signatureAttribute.accept(clazz, optionalAttributeVisitor);
156: }
157: }
158:
159: public void visitSignatureAttribute(Clazz clazz, Field field,
160: SignatureAttribute signatureAttribute) {
161: if (optionalAttributeVisitor != null) {
162: signatureAttribute.accept(clazz, field,
163: optionalAttributeVisitor);
164: }
165: }
166:
167: public void visitSignatureAttribute(Clazz clazz, Method method,
168: SignatureAttribute signatureAttribute) {
169: if (optionalAttributeVisitor != null) {
170: signatureAttribute.accept(clazz, method,
171: optionalAttributeVisitor);
172: }
173: }
174:
175: public void visitConstantValueAttribute(Clazz clazz, Field field,
176: ConstantValueAttribute constantValueAttribute) {
177: if (requiredAttributeVisitor != null) {
178: constantValueAttribute.accept(clazz, field,
179: requiredAttributeVisitor);
180: }
181: }
182:
183: public void visitExceptionsAttribute(Clazz clazz, Method method,
184: ExceptionsAttribute exceptionsAttribute) {
185: if (optionalAttributeVisitor != null) {
186: exceptionsAttribute.accept(clazz, method,
187: optionalAttributeVisitor);
188: }
189: }
190:
191: public void visitCodeAttribute(Clazz clazz, Method method,
192: CodeAttribute codeAttribute) {
193: if (requiredAttributeVisitor != null) {
194: codeAttribute.accept(clazz, method,
195: requiredAttributeVisitor);
196: }
197: }
198:
199: public void visitStackMapAttribute(Clazz clazz, Method method,
200: CodeAttribute codeAttribute,
201: StackMapAttribute stackMapAttribute) {
202: if (optionalAttributeVisitor != null) {
203: stackMapAttribute.accept(clazz, method, codeAttribute,
204: optionalAttributeVisitor);
205: }
206: }
207:
208: public void visitStackMapTableAttribute(Clazz clazz, Method method,
209: CodeAttribute codeAttribute,
210: StackMapTableAttribute stackMapTableAttribute) {
211: if (requiredAttributeVisitor != null) {
212: stackMapTableAttribute.accept(clazz, method, codeAttribute,
213: requiredAttributeVisitor);
214: }
215: }
216:
217: public void visitLineNumberTableAttribute(Clazz clazz,
218: Method method, CodeAttribute codeAttribute,
219: LineNumberTableAttribute lineNumberTableAttribute) {
220: if (optionalAttributeVisitor != null) {
221: lineNumberTableAttribute.accept(clazz, method,
222: codeAttribute, optionalAttributeVisitor);
223: }
224: }
225:
226: public void visitLocalVariableTableAttribute(Clazz clazz,
227: Method method, CodeAttribute codeAttribute,
228: LocalVariableTableAttribute localVariableTableAttribute) {
229: if (optionalAttributeVisitor != null) {
230: localVariableTableAttribute.accept(clazz, method,
231: codeAttribute, optionalAttributeVisitor);
232: }
233: }
234:
235: public void visitLocalVariableTypeTableAttribute(
236: Clazz clazz,
237: Method method,
238: CodeAttribute codeAttribute,
239: LocalVariableTypeTableAttribute localVariableTypeTableAttribute) {
240: if (optionalAttributeVisitor != null) {
241: localVariableTypeTableAttribute.accept(clazz, method,
242: codeAttribute, optionalAttributeVisitor);
243: }
244: }
245:
246: public void visitRuntimeVisibleAnnotationsAttribute(
247: Clazz clazz,
248: RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) {
249: if (optionalAttributeVisitor != null) {
250: runtimeVisibleAnnotationsAttribute.accept(clazz,
251: optionalAttributeVisitor);
252: }
253: }
254:
255: public void visitRuntimeVisibleAnnotationsAttribute(
256: Clazz clazz,
257: Field field,
258: RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) {
259: if (optionalAttributeVisitor != null) {
260: runtimeVisibleAnnotationsAttribute.accept(clazz, field,
261: optionalAttributeVisitor);
262: }
263: }
264:
265: public void visitRuntimeVisibleAnnotationsAttribute(
266: Clazz clazz,
267: Method method,
268: RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) {
269: if (optionalAttributeVisitor != null) {
270: runtimeVisibleAnnotationsAttribute.accept(clazz, method,
271: optionalAttributeVisitor);
272: }
273: }
274:
275: public void visitRuntimeInvisibleAnnotationsAttribute(
276: Clazz clazz,
277: RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) {
278: if (optionalAttributeVisitor != null) {
279: runtimeInvisibleAnnotationsAttribute.accept(clazz,
280: optionalAttributeVisitor);
281: }
282: }
283:
284: public void visitRuntimeInvisibleAnnotationsAttribute(
285: Clazz clazz,
286: Field field,
287: RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) {
288: if (optionalAttributeVisitor != null) {
289: runtimeInvisibleAnnotationsAttribute.accept(clazz, field,
290: optionalAttributeVisitor);
291: }
292: }
293:
294: public void visitRuntimeInvisibleAnnotationsAttribute(
295: Clazz clazz,
296: Method method,
297: RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) {
298: if (optionalAttributeVisitor != null) {
299: runtimeInvisibleAnnotationsAttribute.accept(clazz, method,
300: optionalAttributeVisitor);
301: }
302: }
303:
304: public void visitRuntimeVisibleParameterAnnotationsAttribute(
305: Clazz clazz,
306: Method method,
307: RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) {
308: if (optionalAttributeVisitor != null) {
309: runtimeVisibleParameterAnnotationsAttribute.accept(clazz,
310: method, optionalAttributeVisitor);
311: }
312: }
313:
314: public void visitRuntimeInvisibleParameterAnnotationsAttribute(
315: Clazz clazz,
316: Method method,
317: RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) {
318: if (optionalAttributeVisitor != null) {
319: runtimeInvisibleParameterAnnotationsAttribute.accept(clazz,
320: method, optionalAttributeVisitor);
321: }
322: }
323:
324: public void visitAnnotationDefaultAttribute(Clazz clazz,
325: Method method,
326: AnnotationDefaultAttribute annotationDefaultAttribute) {
327: if (optionalAttributeVisitor != null) {
328: annotationDefaultAttribute.accept(clazz, method,
329: optionalAttributeVisitor);
330: }
331: }
332: }
|