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 import railo.runtime.type.Collection; 021 import railo.runtime.type.KeyImpl; 022 023 public class CFCInstantiator implements Instantiator { 024 025 private static final Collection.Key INIT = KeyImpl.intern("init"); 026 private String entityName; 027 private Set<String> isInstanceEntityNames = new HashSet<String>(); 028 029 public CFCInstantiator() { 030 this.entityName = null; 031 } 032 033 /** 034 * Constructor of the class 035 * @param mappingInfo 036 */ 037 public CFCInstantiator(PersistentClass mappingInfo) { 038 this.entityName = mappingInfo.getEntityName(); 039 isInstanceEntityNames.add( entityName ); 040 if ( mappingInfo.hasSubclasses() ) { 041 Iterator<PersistentClass> itr = mappingInfo.getSubclassClosureIterator(); 042 while ( itr.hasNext() ) { 043 final PersistentClass subclassInfo = itr.next(); 044 isInstanceEntityNames.add( subclassInfo.getEntityName() ); 045 } 046 } 047 } 048 049 /** 050 * @see org.hibernate.tuple.Instantiator#instantiate(java.io.Serializable) 051 */ 052 public final Object instantiate(Serializable id) { 053 return instantiate(); 054 } 055 056 /** 057 * @see org.hibernate.tuple.Instantiator#instantiate() 058 */ 059 public final Object instantiate() { 060 try { 061 PageContextImpl pc = (PageContextImpl) ThreadLocalPageContext.get(); 062 HibernateORMSession session=(HibernateORMSession) pc.getORMSession(true); 063 HibernateORMEngine engine=(HibernateORMEngine) session.getEngine(); 064 return engine.create(pc, session, entityName, true); 065 } 066 catch (PageException e) { 067 throw new HibernateRuntimeException(e); 068 } 069 } 070 071 /** 072 * @see org.hibernate.tuple.Instantiator#isInstance(java.lang.Object) 073 */ 074 public final boolean isInstance(Object object) { 075 Component cfc = Caster.toComponent(object,null); 076 if(cfc==null) return false; 077 return isInstanceEntityNames.contains( HibernateCaster.getEntityName(cfc)); 078 } 079 }