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}