//$Id$ package org.hibernate.test.annotations.tuplizer; import java.io.Serializable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import org.hibernate.HibernateException; import org.hibernate.internal.util.ReflectHelper; import org.hibernate.tuple.Instantiator; /** * @author Emmanuel Bernard */ public class DynamicInstantiator implements Instantiator { private final String entityName; public DynamicInstantiator(String entityName) { this.entityName = entityName; } public Object instantiate(Serializable id) { if ( Cuisine.class.getName().equals( entityName ) ) { return ProxyHelper.newCuisineProxy( id ); } if ( Country.class.getName().equals( entityName ) ) { return ProxyHelper.newCountryProxy( id ); } else { throw new IllegalArgumentException( "unknown entity for instantiation [" + entityName + "]" ); } } public Object instantiate() { return instantiate( null ); } public boolean isInstance(Object object) { String resolvedEntityName = null; if ( Proxy.isProxyClass( object.getClass() ) ) { InvocationHandler handler = Proxy.getInvocationHandler( object ); if ( DataProxyHandler.class.isAssignableFrom( handler.getClass() ) ) { DataProxyHandler myHandler = ( DataProxyHandler ) handler; resolvedEntityName = myHandler.getEntityName(); } } try { return ReflectHelper.classForName( entityName ).isInstance( object ); } catch( Throwable t ) { throw new HibernateException( "could not get handle to entity-name as interface : " + t ); } // return entityName.equals( resolvedEntityName ); } }