001 package railo.runtime.orm.hibernate.tuplizer; 002 003 import java.io.Serializable; 004 import java.util.HashSet; 005 import java.util.Iterator; 006 import java.util.Set; 007 008 import org.hibernate.mapping.PersistentClass; 009 import org.hibernate.tuple.Instantiator; 010 011 import railo.runtime.Component; 012 import railo.runtime.PageContextImpl; 013 import railo.runtime.engine.ThreadLocalPageContext; 014 import railo.runtime.exp.PageException; 015 import railo.runtime.op.Caster; 016 import railo.runtime.orm.hibernate.HibernateCaster; 017 import railo.runtime.orm.hibernate.HibernateORMEngine; 018 import railo.runtime.orm.hibernate.HibernateORMSession; 019 import railo.runtime.orm.hibernate.HibernateRuntimeException; 020 021 public class CFCInstantiator implements Instantiator { 022 023 //private static final Collection.Key INIT = KeyImpl.intern("init"); 024 private String entityName; 025 private Set<String> isInstanceEntityNames = new HashSet<String>(); 026 027 public CFCInstantiator() { 028 this.entityName = null; 029 } 030 031 /** 032 * Constructor of the class 033 * @param mappingInfo 034 */ 035 public CFCInstantiator(PersistentClass mappingInfo) { 036 this.entityName = mappingInfo.getEntityName(); 037 isInstanceEntityNames.add( entityName ); 038 if ( mappingInfo.hasSubclasses() ) { 039 Iterator<PersistentClass> itr = mappingInfo.getSubclassClosureIterator(); 040 while ( itr.hasNext() ) { 041 final PersistentClass subclassInfo = itr.next(); 042 isInstanceEntityNames.add( subclassInfo.getEntityName() ); 043 } 044 } 045 } 046 047 @Override 048 public final Object instantiate(Serializable id) { 049 return instantiate(); 050 } 051 052 @Override 053 public final Object instantiate() { 054 try { 055 PageContextImpl pc = (PageContextImpl) ThreadLocalPageContext.get(); 056 HibernateORMSession session=(HibernateORMSession) pc.getORMSession(true); 057 HibernateORMEngine engine=(HibernateORMEngine) session.getEngine(); 058 return engine.create(pc, session, entityName, true); 059 } 060 catch (PageException e) { 061 throw new HibernateRuntimeException(e); 062 } 063 } 064 065 @Override 066 public final boolean isInstance(Object object) { 067 Component cfc = Caster.toComponent(object,null); 068 if(cfc==null) return false; 069 return isInstanceEntityNames.contains( HibernateCaster.getEntityName(cfc)); 070 } 071 }