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    }