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