• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2003 The Apache Software Foundation
3  *
4  *  Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *  Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.mockito.cglib.beans;
17 
18 import java.lang.reflect.Constructor;
19 import java.lang.reflect.Method;
20 import java.lang.reflect.Modifier;
21 import java.util.*;
22 
23 import org.mockito.asm.ClassVisitor;
24 import org.mockito.cglib.core.*;
25 
26 /**
27  * @author Juozas Baliuka
28  */
29 abstract public class BulkBean
30 {
31     private static final BulkBeanKey KEY_FACTORY =
32       (BulkBeanKey)KeyFactory.create(BulkBeanKey.class);
33 
34     interface BulkBeanKey {
newInstance(String target, String[] getters, String[] setters, String[] types)35         public Object newInstance(String target, String[] getters, String[] setters, String[] types);
36     }
37 
38     protected Class target;
39     protected String[] getters, setters;
40     protected Class[] types;
41 
BulkBean()42     protected BulkBean() { }
43 
getPropertyValues(Object bean, Object[] values)44     abstract public void getPropertyValues(Object bean, Object[] values);
setPropertyValues(Object bean, Object[] values)45     abstract public void setPropertyValues(Object bean, Object[] values);
46 
getPropertyValues(Object bean)47     public Object[] getPropertyValues(Object bean) {
48         Object[] values = new Object[getters.length];
49         getPropertyValues(bean, values);
50         return values;
51     }
52 
getPropertyTypes()53     public Class[] getPropertyTypes() {
54         return (Class[])types.clone();
55     }
56 
getGetters()57     public String[] getGetters() {
58         return (String[])getters.clone();
59     }
60 
getSetters()61     public String[] getSetters() {
62         return (String[])setters.clone();
63     }
64 
create(Class target, String[] getters, String[] setters, Class[] types)65     public static BulkBean create(Class target, String[] getters, String[] setters, Class[] types) {
66         Generator gen = new Generator();
67         gen.setTarget(target);
68         gen.setGetters(getters);
69         gen.setSetters(setters);
70         gen.setTypes(types);
71         return gen.create();
72     }
73 
74     public static class Generator extends AbstractClassGenerator {
75         private static final Source SOURCE = new Source(BulkBean.class.getName());
76         private Class target;
77         private String[] getters;
78         private String[] setters;
79         private Class[] types;
80 
Generator()81         public Generator() {
82             super(SOURCE);
83         }
84 
setTarget(Class target)85         public void setTarget(Class target) {
86             this.target = target;
87         }
88 
setGetters(String[] getters)89         public void setGetters(String[] getters) {
90             this.getters = getters;
91         }
92 
setSetters(String[] setters)93         public void setSetters(String[] setters) {
94             this.setters = setters;
95         }
96 
setTypes(Class[] types)97         public void setTypes(Class[] types) {
98             this.types = types;
99         }
100 
getDefaultClassLoader()101         protected ClassLoader getDefaultClassLoader() {
102             return target.getClassLoader();
103         }
104 
create()105         public BulkBean create() {
106             setNamePrefix(target.getName());
107             String targetClassName = target.getName();
108             String[] typeClassNames = ReflectUtils.getNames(types);
109             Object key = KEY_FACTORY.newInstance(targetClassName, getters, setters, typeClassNames);
110             return (BulkBean)super.create(key);
111         }
112 
generateClass(ClassVisitor v)113         public void generateClass(ClassVisitor v) throws Exception {
114             new BulkBeanEmitter(v, getClassName(), target, getters, setters, types);
115         }
116 
firstInstance(Class type)117         protected Object firstInstance(Class type) {
118             BulkBean instance = (BulkBean)ReflectUtils.newInstance(type);
119             instance.target = target;
120 
121             int length = getters.length;
122             instance.getters = new String[length];
123             System.arraycopy(getters, 0, instance.getters, 0, length);
124 
125             instance.setters = new String[length];
126             System.arraycopy(setters, 0, instance.setters, 0, length);
127 
128             instance.types = new Class[types.length];
129             System.arraycopy(types, 0, instance.types, 0, types.length);
130 
131             return instance;
132         }
133 
nextInstance(Object instance)134         protected Object nextInstance(Object instance) {
135             return instance;
136         }
137     }
138 }
139