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 javax.persistence.EntityManager;
024
025import org.granite.tide.TidePersistenceManager;
026import org.hibernate.Session;
027import org.jboss.seam.Component;
028import org.jboss.seam.Component.BijectedAttribute;
029import org.jboss.seam.annotations.In;
030import org.jboss.seam.framework.PersistenceController;
031
032
033/**
034 * Factory for creating the correct ITidePersistenceManager based on the 
035 * persistence strategy passed in. Supported types are 
036 * EntityManager,Session, EntityQuery, EntityHome, HibernateEntityHome and a
037 * injected(@In) EntityManager or HibernateSession
038 * @author CIngram
039 */
040public class TideHibernatePersistenceFactory {
041
042        
043        /**
044         * Create the ITidePersistenceManager. Supported types are 
045     * EntityManager,Session, EntityQuery, EntityHome, HibernateEntityHome and a
046     * injected(@In) EntityManager or HibernateSession
047         * 
048         * @param component
049         * @param persistenceType
050         * @return a ITidePersistenceManager.
051         */
052        public static TidePersistenceManager createTidePersistence(Component component, Object persistenceType) {
053                TidePersistenceManager pm = TidePersistenceFactory.createTidePersistence(component, persistenceType);
054                if (pm != null) {
055                    return pm;
056                } else if (persistenceType instanceof Session) {
057                        return createTidePersistence(component, (Session)persistenceType);
058                }
059                
060                return null;
061        }
062        
063        
064        /**
065         * Create a ITideInterceptor for a EntityManager.
066         * 
067         * @param component
068         * @param persistenceType
069         * @return a ITidePersistenceManager.
070         */
071        public static TidePersistenceManager createTidePersistence(Component component, EntityManager persistenceType) {
072            return TidePersistenceFactory.createTidePersistence(component, persistenceType);
073        }
074        
075        /**
076         * Create  ITidePersistenceManager for a HibernateSession
077         * 
078         * @param component
079         * @param persistenceType
080         * @return a ITidePersistenceManager.
081         */
082        public static TidePersistenceManager createTidePersistence(Component component, Session persistenceType) {
083            return new HibernateContextManager(persistenceType);
084        } 
085    
086    /**
087     * Create  ITidePersistenceManager for a PersistenceController
088         * 
089         * @param component
090     * @param controller
091     * @return a ITidePersistenceManager.
092     */
093    public static TidePersistenceManager createTidePersistence(Component component, PersistenceController<?> controller) {
094        TidePersistenceManager pm = TidePersistenceFactory.createTidePersistence(component, controller);
095        if (pm != null)
096            return pm;
097        String controllerName = component.getName();
098        if (controller.getPersistenceContext() instanceof Session)
099            return new HibernatePersistenceControllerManager(controllerName);
100        return null;
101    } 
102        
103        /**
104         * Create a ITidePersistenceManager for a injected attribute(@In). 
105         * Supported Types are EntityManager or Session.
106         * 
107         * @param component
108         * @param att
109         * @return a ITidePersistenceManager.
110         */
111        public static TidePersistenceManager createTidePersistence(Component component, BijectedAttribute<In> att) {
112                TidePersistenceManager pm = TidePersistenceFactory.createTidePersistence(component, att);
113                if (pm != null)
114                    return pm;
115                
116                if (att.getType() == Session.class) {
117                        return new SeamHibernateManager(att.getName());
118            } 
119                return null;
120        }
121}