001: /*
002: * Copyright 2003 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package net.sf.cglib.beans;
017:
018: import java.lang.reflect.Constructor;
019: import java.lang.reflect.Method;
020: import java.lang.reflect.Modifier;
021: import java.util.*;
022: import net.sf.cglib.core.*;
023: import org.objectweb.asm.ClassVisitor;
024:
025: /**
026: * @author Juozas Baliuka
027: */
028: abstract public class BulkBean {
029: private static final BulkBeanKey KEY_FACTORY = (BulkBeanKey) KeyFactory
030: .create(BulkBeanKey.class);
031:
032: interface BulkBeanKey {
033: public Object newInstance(String target, String[] getters,
034: String[] setters, String[] types);
035: }
036:
037: protected Class target;
038: protected String[] getters, setters;
039: protected Class[] types;
040:
041: protected BulkBean() {
042: }
043:
044: abstract public void getPropertyValues(Object bean, Object[] values);
045:
046: abstract public void setPropertyValues(Object bean, Object[] values);
047:
048: public Object[] getPropertyValues(Object bean) {
049: Object[] values = new Object[getters.length];
050: getPropertyValues(bean, values);
051: return values;
052: }
053:
054: public Class[] getPropertyTypes() {
055: return (Class[]) types.clone();
056: }
057:
058: public String[] getGetters() {
059: return (String[]) getters.clone();
060: }
061:
062: public String[] getSetters() {
063: return (String[]) setters.clone();
064: }
065:
066: public static BulkBean create(Class target, String[] getters,
067: String[] setters, Class[] types) {
068: Generator gen = new Generator();
069: gen.setTarget(target);
070: gen.setGetters(getters);
071: gen.setSetters(setters);
072: gen.setTypes(types);
073: return gen.create();
074: }
075:
076: public static class Generator extends AbstractClassGenerator {
077: private static final Source SOURCE = new Source(BulkBean.class
078: .getName());
079: private Class target;
080: private String[] getters;
081: private String[] setters;
082: private Class[] types;
083:
084: public Generator() {
085: super (SOURCE);
086: }
087:
088: public void setTarget(Class target) {
089: this .target = target;
090: }
091:
092: public void setGetters(String[] getters) {
093: this .getters = getters;
094: }
095:
096: public void setSetters(String[] setters) {
097: this .setters = setters;
098: }
099:
100: public void setTypes(Class[] types) {
101: this .types = types;
102: }
103:
104: protected ClassLoader getDefaultClassLoader() {
105: return target.getClassLoader();
106: }
107:
108: public BulkBean create() {
109: setNamePrefix(target.getName());
110: String targetClassName = target.getName();
111: String[] typeClassNames = ReflectUtils.getNames(types);
112: Object key = KEY_FACTORY.newInstance(targetClassName,
113: getters, setters, typeClassNames);
114: return (BulkBean) super .create(key);
115: }
116:
117: public void generateClass(ClassVisitor v) throws Exception {
118: new BulkBeanEmitter(v, getClassName(), target, getters,
119: setters, types);
120: }
121:
122: protected Object firstInstance(Class type) {
123: BulkBean instance = (BulkBean) ReflectUtils
124: .newInstance(type);
125: instance.target = target;
126:
127: int length = getters.length;
128: instance.getters = new String[length];
129: System.arraycopy(getters, 0, instance.getters, 0, length);
130:
131: instance.setters = new String[length];
132: System.arraycopy(setters, 0, instance.setters, 0, length);
133:
134: instance.types = new Class[types.length];
135: System.arraycopy(types, 0, instance.types, 0, types.length);
136:
137: return instance;
138: }
139:
140: protected Object nextInstance(Object instance) {
141: return instance;
142: }
143: }
144: }
|