package railo.runtime.orm.hibernate.tuplizer;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.tuple.Instantiator;
import railo.runtime.Component;
import railo.runtime.PageContext;
import railo.runtime.exp.PageException;
import railo.runtime.orm.hibernate.CommonUtil;
import railo.runtime.orm.hibernate.HibernateCaster;
import railo.runtime.orm.hibernate.HibernateORMEngine;
import railo.runtime.orm.hibernate.HibernateORMSession;
import railo.runtime.orm.hibernate.HibernatePageException;
import railo.runtime.orm.hibernate.HibernateUtil;
public class CFCInstantiator implements Instantiator {
private String entityName;
private Set<String> isInstanceEntityNames = new HashSet<String>();
public CFCInstantiator() {
this.entityName = null;
}
/**
* Constructor of the class
* @param mappingInfo
*/
public CFCInstantiator(PersistentClass mappingInfo) {
this.entityName = mappingInfo.getEntityName();
isInstanceEntityNames.add( entityName );
if ( mappingInfo.hasSubclasses() ) {
Iterator<PersistentClass> itr = mappingInfo.getSubclassClosureIterator();
while ( itr.hasNext() ) {
final PersistentClass subclassInfo = itr.next();
isInstanceEntityNames.add( subclassInfo.getEntityName() );
}
}
}
@Override
public final Object instantiate(Serializable id) {
return instantiate();
}
@Override
public final Object instantiate() {
try {
PageContext pc = CommonUtil.pc();
HibernateORMSession session=HibernateUtil.getORMSession(pc,true);
HibernateORMEngine engine=(HibernateORMEngine) session.getEngine();
Component c = engine.create(pc, session, entityName, true);
CommonUtil.setEntity(c,true);
return c;//new CFCProxy(c);
}
catch (PageException pe) {
throw new HibernatePageException(pe);
}
}
@Override
public final boolean isInstance(Object object) {
Component cfc = CommonUtil.toComponent(object,null);
if(cfc==null) return false;
return isInstanceEntityNames.contains( HibernateCaster.getEntityName(cfc));
}
}