001
014
015 package com.liferay.portal.dao.jdbc.util;
016
017 import com.liferay.portal.dao.orm.hibernate.PortletSessionFactoryImpl;
018 import com.liferay.portal.dao.orm.hibernate.SessionFactoryImpl;
019 import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
020 import com.liferay.portal.kernel.dao.jdbc.DataSourceFactoryUtil;
021 import com.liferay.portal.kernel.log.Log;
022 import com.liferay.portal.kernel.log.LogFactoryUtil;
023 import com.liferay.portal.kernel.portlet.PortletClassLoaderUtil;
024 import com.liferay.portal.security.pacl.PACLClassLoaderUtil;
025 import com.liferay.portal.spring.hibernate.PortalHibernateConfiguration;
026 import com.liferay.portal.spring.hibernate.PortletHibernateConfiguration;
027 import com.liferay.portal.spring.jpa.LocalContainerEntityManagerFactoryBean;
028 import com.liferay.portal.util.PropsValues;
029
030 import java.util.List;
031 import java.util.Properties;
032
033 import javax.persistence.EntityManagerFactory;
034
035 import javax.sql.DataSource;
036
037 import org.hibernate.engine.SessionFactoryImplementor;
038
039 import org.springframework.orm.hibernate3.HibernateTransactionManager;
040 import org.springframework.transaction.support.AbstractPlatformTransactionManager;
041
042
045 public class DataSourceSwapper {
046
047 public static void swapCounterDataSource(Properties properties)
048 throws Exception {
049
050 if (_log.isInfoEnabled()) {
051 _log.info("Create new counter data source");
052 }
053
054 DataSource newDataSource = DataSourceFactoryUtil.initDataSource(
055 properties);
056
057 DataSource oldDataSource =
058 _counterDataSourceWrapper.getWrappedDataSource();
059
060 if (_log.isInfoEnabled()) {
061 _log.info("Set new counter data source");
062 }
063
064 _counterDataSourceWrapper.setWrappedDataSource(newDataSource);
065
066 if (_log.isInfoEnabled()) {
067 _log.info("Destroy old counter data source");
068 }
069
070 DataSourceFactoryUtil.destroyDataSource(oldDataSource);
071
072 if (PropsValues.PERSISTENCE_PROVIDER.equalsIgnoreCase("jpa")) {
073 if (_log.isInfoEnabled()) {
074 _log.info("Reinitialize Hibernate for new counter data source");
075 }
076
077 _reinitializeJPA("counterSessionFactory", newDataSource);
078 }
079 else {
080 if (_log.isInfoEnabled()) {
081 _log.info("Reinitialize JPA for new counter data source");
082 }
083
084 _reinitializeHibernate("counterSessionFactory", newDataSource);
085 }
086 }
087
088 public static void swapLiferayDataSource(Properties properties)
089 throws Exception {
090
091 if (_log.isInfoEnabled()) {
092 _log.info("Create new liferay data source");
093 }
094
095 DataSource newDataSource = DataSourceFactoryUtil.initDataSource(
096 properties);
097
098 DataSource oldDataSource =
099 _liferayDataSourceWrapper.getWrappedDataSource();
100
101 if (_log.isInfoEnabled()) {
102 _log.info("Set new liferay data source");
103 }
104
105 _liferayDataSourceWrapper.setWrappedDataSource(newDataSource);
106
107 if (_log.isInfoEnabled()) {
108 _log.info("Destroy old liferay data source");
109 }
110
111 DataSourceFactoryUtil.destroyDataSource(oldDataSource);
112
113 if (PropsValues.PERSISTENCE_PROVIDER.equalsIgnoreCase("jpa")) {
114 if (_log.isInfoEnabled()) {
115 _log.info("Reinitialize Hibernate for new liferay data source");
116 }
117
118 _reinitializeJPA("liferaySessionFactory", newDataSource);
119 }
120 else {
121 if (_log.isInfoEnabled()) {
122 _log.info("Reinitialize JPA for new liferay data source");
123 }
124
125 _reinitializeHibernate("liferaySessionFactory", newDataSource);
126 }
127
128 _reinitializePortletsHibernate(newDataSource);
129 }
130
131 public void setCounterDataSourceWrapper(
132 DataSourceWrapper counterDataSourceWrapper) {
133
134 _counterDataSourceWrapper = counterDataSourceWrapper;
135 }
136
137 public void setLiferayDataSourceWrapper(
138 DataSourceWrapper liferayDataSourceWrapper) {
139
140 _liferayDataSourceWrapper = liferayDataSourceWrapper;
141 }
142
143 private static void _reinitializeHibernate(
144 String name, DataSource dataSource)
145 throws Exception {
146
147 PortalHibernateConfiguration portalHibernateConfiguration =
148 new PortalHibernateConfiguration();
149
150 portalHibernateConfiguration.setDataSource(dataSource);
151
152 portalHibernateConfiguration.afterPropertiesSet();
153
154 SessionFactoryImplementor sessionFactoryImplementor =
155 (SessionFactoryImplementor)portalHibernateConfiguration.getObject();
156
157 SessionFactoryImpl sessionFactoryImpl =
158 (SessionFactoryImpl)PortalBeanLocatorUtil.locate(name);
159
160 sessionFactoryImpl.setSessionFactoryImplementor(
161 sessionFactoryImplementor);
162
163 AbstractPlatformTransactionManager abstractPlatformTransactionManager =
164 (AbstractPlatformTransactionManager)PortalBeanLocatorUtil.locate(
165 "liferayTransactionManager");
166
167 if (abstractPlatformTransactionManager instanceof
168 HibernateTransactionManager) {
169
170 HibernateTransactionManager hibernateTransactionManager =
171 (HibernateTransactionManager)abstractPlatformTransactionManager;
172
173 hibernateTransactionManager.setSessionFactory(
174 sessionFactoryImplementor);
175 }
176 else if (_log.isWarnEnabled()) {
177 _log.warn(
178 "Unable to swap to session factory for " +
179 abstractPlatformTransactionManager.getClass() +
180 " which may cause subsequent transaction failures");
181 }
182 }
183
184 private static void _reinitializeJPA(String name, DataSource dataSource)
185 throws Exception {
186
187 LocalContainerEntityManagerFactoryBean
188 localContainerEntityManagerFactoryBean =
189 new LocalContainerEntityManagerFactoryBean();
190
191 localContainerEntityManagerFactoryBean.setDataSource(dataSource);
192
193 localContainerEntityManagerFactoryBean.afterPropertiesSet();
194
195 EntityManagerFactory entityManagerFactory =
196 localContainerEntityManagerFactoryBean.getObject();
197
198 com.liferay.portal.dao.orm.jpa.SessionFactoryImpl sessionFactoryImpl =
199 (com.liferay.portal.dao.orm.jpa.SessionFactoryImpl)
200 PortalBeanLocatorUtil.locate(name);
201
202 sessionFactoryImpl.setEntityManagerFactory(entityManagerFactory);
203 }
204
205 private static void _reinitializePortletsHibernate(DataSource newDataSource)
206 throws Exception {
207
208 List<PortletSessionFactoryImpl> portletSessionFactoryImpls =
209 SessionFactoryImpl.getPortletSessionFactories();
210
211 for (PortletSessionFactoryImpl portletSessionFactoryImpl :
212 portletSessionFactoryImpls) {
213
214 ClassLoader oldPortletClassLoader =
215 PortletClassLoaderUtil.getClassLoader();
216
217 ClassLoader portletClassLoader =
218 portletSessionFactoryImpl.getSessionFactoryClassLoader();
219
220 PortletClassLoaderUtil.setClassLoader(portletClassLoader);
221
222 ClassLoader contextClassLoader =
223 PACLClassLoaderUtil.getContextClassLoader();
224
225 PACLClassLoaderUtil.setContextClassLoader(portletClassLoader);
226
227 try {
228 PortletHibernateConfiguration portletHibernateConfiguration =
229 new PortletHibernateConfiguration();
230
231 portletHibernateConfiguration.setDataSource(newDataSource);
232
233 portletHibernateConfiguration.afterPropertiesSet();
234
235 SessionFactoryImplementor sessionFactoryImplementor =
236 (SessionFactoryImplementor)
237 portletHibernateConfiguration.getObject();
238
239 portletSessionFactoryImpl.setSessionFactoryImplementor(
240 sessionFactoryImplementor);
241 }
242 finally {
243 PortletClassLoaderUtil.setClassLoader(oldPortletClassLoader);
244
245 PACLClassLoaderUtil.setContextClassLoader(contextClassLoader);
246 }
247 }
248 }
249
250 private static Log _log = LogFactoryUtil.getLog(DataSourceSwapper.class);
251
252 private static DataSourceWrapper _counterDataSourceWrapper;
253 private static DataSourceWrapper _liferayDataSourceWrapper;
254
255 }