/**
* GRANITE DATA SERVICES
* Copyright (C) 2006-2015 GRANITE DATA SERVICES S.A.S.
*
* This file is part of the Granite Data Services Platform.
*
* Granite Data Services is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Granite Data Services is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA, or see <http://www.gnu.org/licenses/>.
*/
package org.granite.tide.seam.lazy;
import javax.persistence.EntityManager;
import org.granite.tide.TidePersistenceManager;
import org.hibernate.Session;
import org.jboss.seam.Component;
import org.jboss.seam.Component.BijectedAttribute;
import org.jboss.seam.annotations.In;
import org.jboss.seam.framework.PersistenceController;
/**
* Factory for creating the correct ITidePersistenceManager based on the
* persistence strategy passed in. Supported types are
* EntityManager,Session, EntityQuery, EntityHome, HibernateEntityHome and a
* injected(@In) EntityManager or HibernateSession
* @author CIngram
*/
public class TideHibernatePersistenceFactory {
/**
* Create the ITidePersistenceManager. Supported types are
* EntityManager,Session, EntityQuery, EntityHome, HibernateEntityHome and a
* injected(@In) EntityManager or HibernateSession
*
* @param component
* @param persistenceType
* @return a ITidePersistenceManager.
*/
public static TidePersistenceManager createTidePersistence(Component component, Object persistenceType) {
TidePersistenceManager pm = TidePersistenceFactory.createTidePersistence(component, persistenceType);
if (pm != null) {
return pm;
} else if (persistenceType instanceof Session) {
return createTidePersistence(component, (Session)persistenceType);
}
return null;
}
/**
* Create a ITideInterceptor for a EntityManager.
*
* @param component
* @param persistenceType
* @return a ITidePersistenceManager.
*/
public static TidePersistenceManager createTidePersistence(Component component, EntityManager persistenceType) {
return TidePersistenceFactory.createTidePersistence(component, persistenceType);
}
/**
* Create ITidePersistenceManager for a HibernateSession
*
* @param component
* @param persistenceType
* @return a ITidePersistenceManager.
*/
public static TidePersistenceManager createTidePersistence(Component component, Session persistenceType) {
return new HibernateContextManager(persistenceType);
}
/**
* Create ITidePersistenceManager for a PersistenceController
*
* @param component
* @param controller
* @return a ITidePersistenceManager.
*/
public static TidePersistenceManager createTidePersistence(Component component, PersistenceController<?> controller) {
TidePersistenceManager pm = TidePersistenceFactory.createTidePersistence(component, controller);
if (pm != null)
return pm;
String controllerName = component.getName();
if (controller.getPersistenceContext() instanceof Session)
return new HibernatePersistenceControllerManager(controllerName);
return null;
}
/**
* Create a ITidePersistenceManager for a injected attribute(@In).
* Supported Types are EntityManager or Session.
*
* @param component
* @param att
* @return a ITidePersistenceManager.
*/
public static TidePersistenceManager createTidePersistence(Component component, BijectedAttribute<In> att) {
TidePersistenceManager pm = TidePersistenceFactory.createTidePersistence(component, att);
if (pm != null)
return pm;
if (att.getType() == Session.class) {
return new SeamHibernateManager(att.getName());
}
return null;
}
}