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.core;
17674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
18674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.ClassAdapter;
19674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.ClassReader;
20674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
21674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.*;
22674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
23674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// TODO: optimize (ClassReader buffers entire class before accept)
24674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpublic class ClassNameReader {
25674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private ClassNameReader() {
26674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
27674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
28674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static final EarlyExitException EARLY_EXIT = new EarlyExitException();
29674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static class EarlyExitException extends RuntimeException { }
30674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static String getClassName(ClassReader r) {
32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return getClassInfo(r)[0];
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static String[] getClassInfo(ClassReader r) {
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final List array = new ArrayList();
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        try {
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            r.accept(new ClassAdapter(null) {
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                public void visit(int version,
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                  int access,
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                  String name,
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                  String signature,
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                  String superName,
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                  String[] interfaces) {
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    array.add( name.replace('/', '.') );
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    if(superName != null){
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                      array.add( superName.replace('/', '.') );
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    }
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    for(int i = 0; i < interfaces.length; i++  ){
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                       array.add( interfaces[i].replace('/', '.') );
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    }
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    throw EARLY_EXIT;
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } catch (EarlyExitException e) { }
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return (String[])array.toArray( new String[]{} );
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
63