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    }