View Javadoc
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