1 /*
2 * The Apache Software License, Version 1.1
3 *
4 * Copyright (c) 2002 The Apache Software Foundation. All rights
5 * reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
18 *
19 * 3. The end-user documentation included with the redistribution,
20 * if any, must include the following acknowledgment:
21 * "This product includes software developed by the
22 * Apache Software Foundation (http://www.apache.org/)."
23 * Alternately, this acknowledgment may appear in the software itself,
24 * if and wherever such third-party acknowledgments normally appear.
25 *
26 * 4. The names "Apache" and "Apache Software Foundation" must
27 * not be used to endorse or promote products derived from this
28 * software without prior written permission. For written
29 * permission, please contact apache@apache.org.
30 *
31 * 5. Products derived from this software may not be called "Apache",
32 * nor may "Apache" appear in their name, without prior written
33 * permission of the Apache Software Foundation.
34 *
35 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46 * SUCH DAMAGE.
47 * ====================================================================
48 *
49 * This software consists of voluntary contributions made by many
50 * individuals on behalf of the Apache Software Foundation. For more
51 * information on the Apache Software Foundation, please see
52 * <http://www.apache.org/>.
53 */
54 package net.sf.cglib.beans;
55
56 import java.beans.PropertyDescriptor;
57 import java.util.*;
58 import net.sf.cglib.core.*;
59 import org.objectweb.asm.ClassVisitor;
60 import org.objectweb.asm.Type;
61
62 /***
63 * @author Juozas Baliuka, Chris Nokleberg
64 */
65 public class BeanGenerator extends AbstractClassGenerator
66 {
67 private static final Source SOURCE = new Source(BeanGenerator.class.getName());
68 private static final BeanGeneratorKey KEY_FACTORY =
69 (BeanGeneratorKey)KeyFactory.create(BeanGeneratorKey.class);
70
71 interface BeanGeneratorKey {
72 public Object newInstance(Class superclass, Map props);
73 }
74
75 private Class superclass;
76 private Map props = new HashMap();
77 private boolean classOnly;
78
79 public BeanGenerator() {
80 super(SOURCE);
81 }
82
83 /***
84 * Set the class which the generated class will extend. The class
85 * must not be declared as final, and must have a non-private
86 * no-argument constructor.
87 * @param superclass class to extend, or null to extend Object
88 */
89 public void setSuperclass(Class superclass) {
90 if (superclass != null && superclass.equals(Object.class)) {
91 superclass = null;
92 }
93 this.superclass = superclass;
94 }
95
96 public void addProperty(String name, Class type) {
97 if (props.containsKey(name)) {
98 throw new IllegalArgumentException("Duplicate property name \"" + name + "\"");
99 }
100 props.put(name, Type.getType(type));
101 }
102
103 protected ClassLoader getDefaultClassLoader() {
104 if (superclass != null) {
105 return superclass.getClassLoader();
106 } else {
107 return null;
108 }
109 }
110
111 public Object create() {
112 classOnly = false;
113 return createHelper();
114 }
115
116 public Object createClass() {
117 classOnly = true;
118 return createHelper();
119 }
120
121 private Object createHelper() {
122 if (superclass != null) {
123 setNamePrefix(superclass.getName());
124 }
125 Object key = KEY_FACTORY.newInstance(superclass, props);
126 return super.create(key);
127 }
128
129 public void generateClass(ClassVisitor v) throws Exception {
130 int size = props.size();
131 String[] names = (String[])props.keySet().toArray(new String[size]);
132 Type[] types = new Type[size];
133 for (int i = 0; i < size; i++) {
134 types[i] = (Type)props.get(names[i]);
135 }
136 ClassEmitter ce = new ClassEmitter(v);
137 ce.begin_class(Constants.ACC_PUBLIC,
138 getClassName(),
139 superclass != null ? Type.getType(superclass) : Constants.TYPE_OBJECT,
140 null,
141 null);
142 EmitUtils.null_constructor(ce);
143 EmitUtils.add_properties(ce, names, types);
144 ce.end_class();
145 }
146
147 protected Object firstInstance(Class type) {
148 if (classOnly) {
149 return type;
150 } else {
151 return ReflectUtils.newInstance(type);
152 }
153 }
154
155 protected Object nextInstance(Object instance) {
156 Class protoclass = (instance instanceof Class) ? (Class)instance : instance.getClass();
157 if (classOnly) {
158 return protoclass;
159 } else {
160 return ReflectUtils.newInstance(protoclass);
161 }
162 }
163
164 public static void addProperties(BeanGenerator gen, Map props) {
165 for (Iterator it = props.keySet().iterator(); it.hasNext();) {
166 String name = (String)it.next();
167 gen.addProperty(name, (Class)props.get(name));
168 }
169 }
170
171 public static void addProperties(BeanGenerator gen, Class type) {
172 addProperties(gen, ReflectUtils.getBeanProperties(type));
173 }
174
175 public static void addProperties(BeanGenerator gen, PropertyDescriptor[] descriptors) {
176 for (int i = 0; i < descriptors.length; i++) {
177 gen.addProperty(descriptors[i].getName(), descriptors[i].getPropertyType());
178 }
179 }
180 }
This page was automatically generated by Maven