001/*
002  GRANITE DATA SERVICES
003  Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004
005  This file is part of Granite Data Services.
006
007  Granite Data Services is free software; you can redistribute it and/or modify
008  it under the terms of the GNU Library General Public License as published by
009  the Free Software Foundation; either version 2 of the License, or (at your
010  option) any later version.
011
012  Granite Data Services is distributed in the hope that it will be useful, but
013  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015  for more details.
016
017  You should have received a copy of the GNU Library General Public License
018  along with this library; if not, see <http://www.gnu.org/licenses/>.
019*/
020
021package org.granite.tide.seam.lazy;
022
023import static org.jboss.seam.annotations.Install.FRAMEWORK;
024
025import javax.persistence.EntityManager;
026
027import org.granite.tide.TidePersistenceManager;
028import org.hibernate.Session;
029import org.jboss.seam.Component;
030import org.jboss.seam.ScopeType;
031import org.jboss.seam.annotations.Install;
032import org.jboss.seam.annotations.Name;
033import org.jboss.seam.annotations.Scope;
034import org.jboss.seam.annotations.intercept.BypassInterceptors;
035
036/**
037 * Initializes a request for a passed in entity and a lazy property.
038 
039 * @author CIngram,VDanda
040 */
041@Name("org.granite.tide.seam.seamInitializer")
042@Scope(ScopeType.CONVERSATION)
043@Install(precedence=FRAMEWORK+1, classDependencies="org.hibernate.Session")
044@BypassInterceptors
045public class SeamHibernateInitializer extends SeamInitializer {
046
047    private static final long serialVersionUID = 1L;
048        
049        
050        /**
051         * Try to determine what type of persistence the application is using. 
052         * If the EntityManager is stored under entityManager or if the Hibernate session is 
053         * stored under session. Then the context will be found and used. This is only called if a 
054         * ITidePersistenceManager is not found, probably because the query was not run in a conversation.
055         * @return The appropriate manager for the persistence context being used, if it can be determined
056         * otherwise a null is returned. 
057         */  
058    @Override
059        protected TidePersistenceManager tryToDetermineInitiailzer() {
060        EntityManager em = findEntityManager();
061        if (em != null) 
062            return TideHibernatePersistenceFactory.createTidePersistence(null, em);
063
064                Session session = findHibernateSession();
065                if (session != null)
066                        return TideHibernatePersistenceFactory.createTidePersistence(null, session);
067                
068                return null;
069        }
070        
071    
072        /**
073         * Try to find the hibernateSession if possible. Assume that the session is stored under
074         * session.
075         * @return The Current Session
076         */
077        private Session findHibernateSession() {
078                return (Session) Component.getInstance("session");
079        }
080}
081