001
014
015 package com.liferay.portal.dao.orm.hibernate;
016
017 import com.liferay.portal.kernel.dao.orm.ClassLoaderSession;
018 import com.liferay.portal.kernel.dao.orm.Dialect;
019 import com.liferay.portal.kernel.dao.orm.ORMException;
020 import com.liferay.portal.kernel.dao.orm.Session;
021 import com.liferay.portal.kernel.dao.orm.SessionFactory;
022 import com.liferay.portal.kernel.log.Log;
023 import com.liferay.portal.kernel.log.LogFactoryUtil;
024 import com.liferay.portal.kernel.util.ClassLoaderUtil;
025 import com.liferay.portal.kernel.util.PreloadClassLoader;
026 import com.liferay.portal.util.PropsValues;
027
028 import java.sql.Connection;
029
030 import java.util.HashMap;
031 import java.util.Map;
032
033 import org.hibernate.engine.SessionFactoryImplementor;
034
035
039 public class SessionFactoryImpl implements SessionFactory {
040
041 @Override
042 public void closeSession(Session session) throws ORMException {
043 if ((session != null) &&
044 !PropsValues.SPRING_HIBERNATE_SESSION_DELEGATED) {
045
046 session.flush();
047 session.close();
048 }
049 }
050
051 @Override
052 public Session getCurrentSession() throws ORMException {
053 return wrapSession(_sessionFactoryImplementor.getCurrentSession());
054 }
055
056 @Override
057 public Dialect getDialect() throws ORMException {
058 return new DialectImpl(_sessionFactoryImplementor.getDialect());
059 }
060
061 public ClassLoader getSessionFactoryClassLoader() {
062 return _sessionFactoryClassLoader;
063 }
064
065 public SessionFactoryImplementor getSessionFactoryImplementor() {
066 return _sessionFactoryImplementor;
067 }
068
069 @Override
070 public Session openNewSession(Connection connection) throws ORMException {
071 return wrapSession(_sessionFactoryImplementor.openSession(connection));
072 }
073
074 @Override
075 public Session openSession() throws ORMException {
076 org.hibernate.Session session = null;
077
078 if (PropsValues.SPRING_HIBERNATE_SESSION_DELEGATED) {
079 session = _sessionFactoryImplementor.getCurrentSession();
080 }
081 else {
082 session = _sessionFactoryImplementor.openSession();
083 }
084
085 if (_log.isDebugEnabled()) {
086 org.hibernate.impl.SessionImpl sessionImpl =
087 (org.hibernate.impl.SessionImpl)session;
088
089 _log.debug(
090 "Session is using connection release mode " +
091 sessionImpl.getConnectionReleaseMode());
092 }
093
094 return wrapSession(session);
095 }
096
097 public void setSessionFactoryClassLoader(
098 ClassLoader sessionFactoryClassLoader) {
099
100 ClassLoader portalClassLoader = ClassLoaderUtil.getPortalClassLoader();
101
102 if (sessionFactoryClassLoader == portalClassLoader) {
103 _sessionFactoryClassLoader = sessionFactoryClassLoader;
104 }
105 else {
106 _sessionFactoryClassLoader = new PreloadClassLoader(
107 sessionFactoryClassLoader, getPreloadClassLoaderClasses());
108 }
109 }
110
111 public void setSessionFactoryImplementor(
112 SessionFactoryImplementor sessionFactoryImplementor) {
113
114 _sessionFactoryImplementor = sessionFactoryImplementor;
115 }
116
117 protected Map<String, Class<?>> getPreloadClassLoaderClasses() {
118 try {
119 Map<String, Class<?>> classes = new HashMap<>();
120
121 for (String className : _PRELOAD_CLASS_NAMES) {
122 ClassLoader portalClassLoader =
123 ClassLoaderUtil.getPortalClassLoader();
124
125 Class<?> clazz = portalClassLoader.loadClass(className);
126
127 classes.put(className, clazz);
128 }
129
130 return classes;
131 }
132 catch (ClassNotFoundException cnfe) {
133 throw new RuntimeException(cnfe);
134 }
135 }
136
137 protected Session wrapSession(org.hibernate.Session session) {
138 Session liferaySession = new SessionImpl(session);
139
140 if (_sessionFactoryClassLoader != null) {
141
142
143
144 liferaySession = new ClassLoaderSession(
145 liferaySession, _sessionFactoryClassLoader);
146 }
147
148 return liferaySession;
149 }
150
151 private static final String[] _PRELOAD_CLASS_NAMES =
152 PropsValues.
153 SPRING_HIBERNATE_SESSION_FACTORY_PRELOAD_CLASSLOADER_CLASSES;
154
155 private static final Log _log = LogFactoryUtil.getLog(
156 SessionFactoryImpl.class);
157
158 private ClassLoader _sessionFactoryClassLoader;
159 private SessionFactoryImplementor _sessionFactoryImplementor;
160
161 }