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