1674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/*
2674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Copyright 2003 The Apache Software Foundation
3674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
4674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *  Licensed under the Apache License, Version 2.0 (the "License");
5674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * you may not use this file except in compliance with the License.
6674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * You may obtain a copy of the License at
7674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
8674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *      http://www.apache.org/licenses/LICENSE-2.0
9674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
10674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *  Unless required by applicable law or agreed to in writing, software
11674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * distributed under the License is distributed on an "AS IS" BASIS,
12674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * See the License for the specific language governing permissions and
14674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * limitations under the License.
15674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */
16674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpackage org.mockito.cglib.transform;
17674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
18674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.*;
19674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
20674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpublic class ClassVisitorTee implements ClassVisitor {
21674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private ClassVisitor cv1, cv2;
22674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
23674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public ClassVisitorTee(ClassVisitor cv1, ClassVisitor cv2) {
24674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.cv1 = cv1;
25674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.cv2 = cv2;
26674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
27674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
28674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visit(int version,
29674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                      int access,
30674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                      String name,
31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                      String signature,
32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                      String superName,
33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                      String[] interfaces) {
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv1.visit(version, access, name, signature, superName, interfaces);
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv2.visit(version, access, name, signature, superName, interfaces);
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitEnd() {
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv1.visitEnd();
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv2.visitEnd();
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv1 = cv2 = null;
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitInnerClass(String name, String outerName, String innerName, int access) {
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv1.visitInnerClass(name, outerName, innerName, access);
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv2.visitInnerClass(name, outerName, innerName, access);
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public FieldVisitor visitField(int access,
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                   String name,
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                   String desc,
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                   String signature,
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                   Object value) {
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        FieldVisitor fv1 = cv1.visitField(access, name, desc, signature, value);
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        FieldVisitor fv2 = cv2.visitField(access, name, desc, signature, value);
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (fv1 == null)
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return fv2;
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (fv2 == null)
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return fv1;
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return new FieldVisitorTee(fv1, fv2);
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public MethodVisitor visitMethod(int access,
65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                     String name,
66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                     String desc,
67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                     String signature,
68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                     String[] exceptions) {
69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        MethodVisitor mv1 = cv1.visitMethod(access, name, desc, signature, exceptions);
70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        MethodVisitor mv2 = cv2.visitMethod(access, name, desc, signature, exceptions);
71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (mv1 == null)
72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return mv2;
73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (mv2 == null)
74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return mv1;
75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return new MethodVisitorTee(mv1, mv2);
76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitSource(String source, String debug) {
79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv1.visitSource(source, debug);
80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv2.visitSource(source, debug);
81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitOuterClass(String owner, String name, String desc) {
84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv1.visitOuterClass(owner, name, desc);
85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv2.visitOuterClass(owner, name, desc);
86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return AnnotationVisitorTee.getInstance(cv1.visitAnnotation(desc, visible),
90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                                cv2.visitAnnotation(desc, visible));
91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitAttribute(Attribute attrs) {
94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv1.visitAttribute(attrs);
95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        cv2.visitAttribute(attrs);
96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
98