|
|
|
@ -6,10 +6,6 @@
|
|
|
|
|
*/ |
|
|
|
|
package com.fr.third.org.hibernate.tuple; |
|
|
|
|
|
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.io.Serializable; |
|
|
|
|
import java.lang.reflect.Constructor; |
|
|
|
|
|
|
|
|
|
import com.fr.third.org.hibernate.InstantiationException; |
|
|
|
|
import com.fr.third.org.hibernate.PropertyNotFoundException; |
|
|
|
|
import com.fr.third.org.hibernate.bytecode.spi.ReflectionOptimizer; |
|
|
|
@ -17,95 +13,94 @@ import com.fr.third.org.hibernate.internal.CoreLogging;
|
|
|
|
|
import com.fr.third.org.hibernate.internal.CoreMessageLogger; |
|
|
|
|
import com.fr.third.org.hibernate.internal.util.ReflectHelper; |
|
|
|
|
import com.fr.third.org.hibernate.mapping.Component; |
|
|
|
|
import com.fr.third.org.hibernate.tuple.entity.DefaultEntityRegister; |
|
|
|
|
|
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.io.Serializable; |
|
|
|
|
import java.lang.reflect.Constructor; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Defines a POJO-based instantiator for use from the tuplizers. |
|
|
|
|
*/ |
|
|
|
|
public class PojoInstantiator implements Instantiator, Serializable { |
|
|
|
|
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( PojoInstantiator.class.getName() ); |
|
|
|
|
private static final CoreMessageLogger LOG = CoreLogging.messageLogger(PojoInstantiator.class.getName()); |
|
|
|
|
|
|
|
|
|
private transient Constructor constructor; |
|
|
|
|
private transient Constructor constructor; |
|
|
|
|
|
|
|
|
|
private final Class mappedClass; |
|
|
|
|
private final transient ReflectionOptimizer.InstantiationOptimizer optimizer; |
|
|
|
|
private final boolean embeddedIdentifier; |
|
|
|
|
private final boolean isAbstract; |
|
|
|
|
private final Class mappedClass; |
|
|
|
|
private final transient ReflectionOptimizer.InstantiationOptimizer optimizer; |
|
|
|
|
private final boolean embeddedIdentifier; |
|
|
|
|
private final boolean isAbstract; |
|
|
|
|
|
|
|
|
|
public PojoInstantiator( |
|
|
|
|
Class mappedClass, |
|
|
|
|
ReflectionOptimizer.InstantiationOptimizer optimizer, |
|
|
|
|
boolean embeddedIdentifier) { |
|
|
|
|
this.mappedClass = mappedClass; |
|
|
|
|
this.optimizer = optimizer; |
|
|
|
|
this.embeddedIdentifier = embeddedIdentifier; |
|
|
|
|
this.isAbstract = ReflectHelper.isAbstractClass( mappedClass ); |
|
|
|
|
public PojoInstantiator( |
|
|
|
|
Class mappedClass, |
|
|
|
|
ReflectionOptimizer.InstantiationOptimizer optimizer, |
|
|
|
|
boolean embeddedIdentifier) { |
|
|
|
|
this.mappedClass = mappedClass; |
|
|
|
|
this.optimizer = optimizer; |
|
|
|
|
this.embeddedIdentifier = embeddedIdentifier; |
|
|
|
|
this.isAbstract = ReflectHelper.isAbstractClass(mappedClass); |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
constructor = ReflectHelper.getDefaultConstructor(mappedClass); |
|
|
|
|
} |
|
|
|
|
catch ( PropertyNotFoundException pnfe ) { |
|
|
|
|
LOG.noDefaultConstructor( mappedClass.getName() ); |
|
|
|
|
constructor = null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
try { |
|
|
|
|
constructor = ReflectHelper.getDefaultConstructor(mappedClass); |
|
|
|
|
} catch (PropertyNotFoundException pnfe) { |
|
|
|
|
LOG.noDefaultConstructor(mappedClass.getName()); |
|
|
|
|
constructor = null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public PojoInstantiator(Component component, ReflectionOptimizer.InstantiationOptimizer optimizer) { |
|
|
|
|
this.mappedClass = component.getComponentClass(); |
|
|
|
|
this.isAbstract = ReflectHelper.isAbstractClass( mappedClass ); |
|
|
|
|
this.optimizer = optimizer; |
|
|
|
|
public PojoInstantiator(Component component, ReflectionOptimizer.InstantiationOptimizer optimizer) { |
|
|
|
|
this.mappedClass = component.getComponentClass(); |
|
|
|
|
this.isAbstract = ReflectHelper.isAbstractClass(mappedClass); |
|
|
|
|
this.optimizer = optimizer; |
|
|
|
|
|
|
|
|
|
this.embeddedIdentifier = false; |
|
|
|
|
this.embeddedIdentifier = false; |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
constructor = ReflectHelper.getDefaultConstructor(mappedClass); |
|
|
|
|
} |
|
|
|
|
catch ( PropertyNotFoundException pnfe ) { |
|
|
|
|
LOG.noDefaultConstructor(mappedClass.getName()); |
|
|
|
|
constructor = null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
try { |
|
|
|
|
constructor = ReflectHelper.getDefaultConstructor(mappedClass); |
|
|
|
|
} catch (PropertyNotFoundException pnfe) { |
|
|
|
|
LOG.noDefaultConstructor(mappedClass.getName()); |
|
|
|
|
constructor = null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void readObject(java.io.ObjectInputStream stream) throws ClassNotFoundException, IOException { |
|
|
|
|
stream.defaultReadObject(); |
|
|
|
|
constructor = ReflectHelper.getDefaultConstructor( mappedClass ); |
|
|
|
|
} |
|
|
|
|
private void readObject(java.io.ObjectInputStream stream) throws ClassNotFoundException, IOException { |
|
|
|
|
stream.defaultReadObject(); |
|
|
|
|
constructor = ReflectHelper.getDefaultConstructor(mappedClass); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public Object instantiate() { |
|
|
|
|
if ( isAbstract ) { |
|
|
|
|
public Object instantiate() { |
|
|
|
|
if (isAbstract) { |
|
|
|
|
try { |
|
|
|
|
return Class.forName("com.fr.schedule.base.entity.output.DefaultOutputEntity").newInstance(); |
|
|
|
|
return DefaultEntityRegister.getInstance().getDefaultEntityClass().newInstance(); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
throw new InstantiationException("class not found: ", mappedClass); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else if ( optimizer != null ) { |
|
|
|
|
return optimizer.newInstance(); |
|
|
|
|
} |
|
|
|
|
else if ( constructor == null ) { |
|
|
|
|
throw new InstantiationException( "No default constructor for entity: ", mappedClass ); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
try { |
|
|
|
|
return applyInterception( constructor.newInstance( (Object[]) null ) ); |
|
|
|
|
} |
|
|
|
|
catch ( Exception e ) { |
|
|
|
|
throw new InstantiationException( "Could not instantiate entity: ", mappedClass, e ); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else if (optimizer != null) { |
|
|
|
|
return optimizer.newInstance(); |
|
|
|
|
} else if (constructor == null) { |
|
|
|
|
throw new InstantiationException("No default constructor for entity: ", mappedClass); |
|
|
|
|
} else { |
|
|
|
|
try { |
|
|
|
|
return applyInterception(constructor.newInstance((Object[]) null)); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
throw new InstantiationException("Could not instantiate entity: ", mappedClass, e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected Object applyInterception(Object entity) { |
|
|
|
|
return entity; |
|
|
|
|
} |
|
|
|
|
protected Object applyInterception(Object entity) { |
|
|
|
|
return entity; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public Object instantiate(Serializable id) { |
|
|
|
|
final boolean useEmbeddedIdentifierInstanceAsEntity = embeddedIdentifier && |
|
|
|
|
id != null && |
|
|
|
|
id.getClass().equals(mappedClass); |
|
|
|
|
return useEmbeddedIdentifierInstanceAsEntity ? id : instantiate(); |
|
|
|
|
} |
|
|
|
|
public Object instantiate(Serializable id) { |
|
|
|
|
final boolean useEmbeddedIdentifierInstanceAsEntity = embeddedIdentifier && |
|
|
|
|
id != null && |
|
|
|
|
id.getClass().equals(mappedClass); |
|
|
|
|
return useEmbeddedIdentifierInstanceAsEntity ? id : instantiate(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean isInstance(Object object) { |
|
|
|
|
return mappedClass.isInstance( object ); |
|
|
|
|
} |
|
|
|
|
public boolean isInstance(Object object) { |
|
|
|
|
return mappedClass.isInstance(object); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|