From: <one...@us...> - 2003-02-15 08:01:31
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/type In directory sc8-pr-cvs1:/tmp/cvs-serv27994/sf/hibernate/type Modified Files: ComponentType.java Log Message: integrated latest cglib + reflection optimizer Index: ComponentType.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/type/ComponentType.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** ComponentType.java 3 Feb 2003 10:28:48 -0000 1.7 --- ComponentType.java 15 Feb 2003 08:00:55 -0000 1.8 *************** *** 8,14 **** --- 8,20 ---- import java.sql.SQLException; + import org.apache.commons.logging.Log; + import org.apache.commons.logging.LogFactory; + + import net.sf.cglib.MetaClass; + import net.sf.hibernate.HibernateException; import net.sf.hibernate.InstantiationException; import net.sf.hibernate.MappingException; + import net.sf.hibernate.PropertyAccessException; import net.sf.hibernate.engine.Cascades; import net.sf.hibernate.engine.Mapping; *************** *** 19,23 **** public class ComponentType extends AbstractType implements AbstractComponentType { ! private final Class componentClass; private final Constructor constructor; --- 25,31 ---- public class ComponentType extends AbstractType implements AbstractComponentType { ! ! private static final Log log = LogFactory.getLog(ComponentType.class); ! private final Class componentClass; private final Constructor constructor; *************** *** 31,34 **** --- 39,43 ---- private final String parentProperty; private final ReflectHelper.Setter parentSetter; + private MetaClass optimizer; public int[] sqlTypes(Mapping mapping) throws MappingException { *************** *** 68,74 **** --- 77,89 ---- getters = new ReflectHelper.Getter[propertySpan]; setters = new ReflectHelper.Setter[propertySpan]; + String getterNames[] = new String[propertySpan]; + String setterNames[] = new String[propertySpan]; + Class propTypes [] = new Class[propertySpan]; for ( int i=0; i<propertySpan; i++ ) { getters[i] = ReflectHelper.getGetter( componentClass, properties[i] ); setters[i] = ReflectHelper.getSetter( componentClass, properties[i] ); + getterNames[i] = getters[i].getMethod().getName(); + setterNames[i] = setters[i].getMethod().getName(); + propTypes[i] = getters[i].getMethod().getReturnType(); } this.parentSetter = (parentProperty==null) ? null : ReflectHelper.getSetter(componentClass, parentProperty); *************** *** 78,81 **** --- 93,107 ---- this.joinedFetch = joinedFetch; constructor = ReflectHelper.getDefaultConstructor(componentClass); + + MetaClass opt; + try { + opt = MetaClass.getInstance(componentClass.getClassLoader(), componentClass, getterNames, setterNames, propTypes); + opt.setPropertyValues( opt.newInstance(), opt.getPropertyValues( opt.newInstance() ) ); + } + catch (Throwable t) { + opt=null; + log.info( "reflection optimizer disabled for: " + componentClass.getName() ); + } + optimizer=opt; } *************** *** 170,193 **** public Object[] getPropertyValues(Object component) throws HibernateException { ! Object[] values = new Object[propertySpan]; ! for ( int i=0; i<propertySpan; i++ ) { ! values[i] = getPropertyValue(component, i); } - return values; } public void setPropertyValues(Object component, Object[] values) throws HibernateException { ! for ( int i=0; i<propertySpan; i++ ) { ! setters[i].set( component, values[i] ); } } public Type[] getSubtypes() { return types; } ! public String getName() { return componentClass.getName(); } public String toXML(Object value, SessionFactoryImplementor factory) { return (value==null) ? null : value.toString(); } public String[] getPropertyNames() { return propertyNames; --- 196,247 ---- public Object[] getPropertyValues(Object component) throws HibernateException { ! ! if(optimizer!=null) { ! try { ! return optimizer.getPropertyValues(component); ! } ! catch (Throwable t){ ! throw new PropertyAccessException(t, "exception getting property value with CGLIB", false, componentClass, "?"); ! } ! } ! else { ! Object[] values = new Object[propertySpan]; ! for ( int i=0; i<propertySpan; i++ ) { ! values[i] = getPropertyValue(component, i); ! } ! return values; } } public void setPropertyValues(Object component, Object[] values) throws HibernateException { ! ! if (optimizer!=null) { ! try { ! optimizer.setPropertyValues(component,values); ! return; ! } ! catch (Throwable t) { ! throw new PropertyAccessException(t, "exception setting property value with CGLIB", true, componentClass, "?"); ! } ! } ! else { ! for ( int i=0; i<propertySpan; i++ ) { ! setters[i].set( component, values[i] ); ! } } } + public Type[] getSubtypes() { return types; } ! public String getName() { ! return componentClass.getName(); ! } ! public String toXML(Object value, SessionFactoryImplementor factory) { return (value==null) ? null : value.toString(); } + public String[] getPropertyNames() { return propertyNames; *************** *** 201,204 **** --- 255,259 ---- values[i] = types[i].deepCopy( values[i] ); } + Object result = instantiate(); //TODO: note that this doesn't copy reference to parent. Is that okay?? setPropertyValues(result, values); *************** *** 207,216 **** public Object instantiate() throws HibernateException { ! try { ! return constructor.newInstance(null); ! } ! catch (Exception e) { ! throw new InstantiationException("Could not instantiate component: ", componentClass, e); } } --- 262,281 ---- public Object instantiate() throws HibernateException { ! if(optimizer!=null) { ! try { ! return optimizer.newInstance(); ! } ! catch(Throwable t) { ! throw new InstantiationException("Could not instantiate component with CGLIB: ", componentClass, t); ! } } + else { + try { + return constructor.newInstance(null); + } + catch (Exception e) { + throw new InstantiationException("Could not instantiate component: ", componentClass, e); + } + } } |