/**
* 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.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 TidePersistenceFactory {
/**
* 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.
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static TidePersistenceManager createTidePersistence(Component component, Object persistenceType) {
if (persistenceType instanceof EntityManager){
return createTidePersistence(component, (EntityManager)persistenceType);
} else if (persistenceType instanceof PersistenceController) {
return createTidePersistence(component, (PersistenceController)persistenceType);
} else if (persistenceType instanceof BijectedAttribute) {
return createTidePersistence(component, ((BijectedAttribute<In>)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 new PersistenceContextManager(persistenceType);
}
/**
* Create ITidePersistenceManager for a PersistenceController
*
* @param component
* @param controller
* @return a ITidePersistenceManager.
*/
public static TidePersistenceManager createTidePersistence(Component component, PersistenceController<?> controller) {
String controllerName = component.getName();
if (controller.getPersistenceContext() instanceof EntityManager)
return new PersistenceControllerManager(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) {
if (att.getType() == EntityManager.class) {
return new SeamEntityManager(att.getName());
}
return null;
}
}