BulkBean.java revision 674060f01e9090cd21b3c5656cc3204912ad17a6
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 */
16package org.mockito.cglib.beans;
17
18import java.lang.reflect.Constructor;
19import java.lang.reflect.Method;
20import java.lang.reflect.Modifier;
21import java.util.*;
22
23import org.mockito.asm.ClassVisitor;
24import org.mockito.cglib.core.*;
25
26/**
27 * @author Juozas Baliuka
28 */
29abstract public class BulkBean
30{
31    private static final BulkBeanKey KEY_FACTORY =
32      (BulkBeanKey)KeyFactory.create(BulkBeanKey.class);
33
34    interface BulkBeanKey {
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
42    protected BulkBean() { }
43
44    abstract public void getPropertyValues(Object bean, Object[] values);
45    abstract public void setPropertyValues(Object bean, Object[] values);
46
47    public Object[] getPropertyValues(Object bean) {
48        Object[] values = new Object[getters.length];
49        getPropertyValues(bean, values);
50        return values;
51    }
52
53    public Class[] getPropertyTypes() {
54        return (Class[])types.clone();
55    }
56
57    public String[] getGetters() {
58        return (String[])getters.clone();
59    }
60
61    public String[] getSetters() {
62        return (String[])setters.clone();
63    }
64
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
81        public Generator() {
82            super(SOURCE);
83        }
84
85        public void setTarget(Class target) {
86            this.target = target;
87        }
88
89        public void setGetters(String[] getters) {
90            this.getters = getters;
91        }
92
93        public void setSetters(String[] setters) {
94            this.setters = setters;
95        }
96
97        public void setTypes(Class[] types) {
98            this.types = types;
99        }
100
101        protected ClassLoader getDefaultClassLoader() {
102            return target.getClassLoader();
103        }
104
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
113        public void generateClass(ClassVisitor v) throws Exception {
114            new BulkBeanEmitter(v, getClassName(), target, getters, setters, types);
115        }
116
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
134        protected Object nextInstance(Object instance) {
135            return instance;
136        }
137    }
138}
139