001
014
015 package com.liferay.portal.jcr;
016
017 import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
018 import com.liferay.portal.kernel.memory.FinalizeManager;
019 import com.liferay.portal.kernel.util.AutoResetThreadLocal;
020 import com.liferay.portal.kernel.util.ProxyUtil;
021 import com.liferay.portal.util.ClassLoaderUtil;
022 import com.liferay.portal.util.PropsValues;
023
024 import java.util.HashMap;
025 import java.util.Map;
026
027 import javax.jcr.RepositoryException;
028 import javax.jcr.Session;
029
030
033 public class JCRFactoryUtil {
034
035 public static void closeSession(Session session) {
036 if (session != null) {
037 session.logout();
038 }
039 }
040
041 public static Session createSession() throws RepositoryException {
042 return createSession(null);
043 }
044
045 public static Session createSession(String workspaceName)
046 throws RepositoryException {
047
048 if (workspaceName == null) {
049 workspaceName = JCRFactory.WORKSPACE_NAME;
050 }
051
052 if (!PropsValues.JCR_WRAP_SESSION) {
053 JCRFactory jcrFactory = getJCRFactory();
054
055 return jcrFactory.createSession(workspaceName);
056 }
057
058 Map<String, Session> sessions = _sessions.get();
059
060 Session session = sessions.get(workspaceName);
061
062 if (session != null) {
063 return session;
064 }
065
066 JCRFactory jcrFactory = getJCRFactory();
067
068 Session jcrSession = jcrFactory.createSession(workspaceName);
069
070 JCRSessionInvocationHandler jcrSessionInvocationHandler =
071 new JCRSessionInvocationHandler(jcrSession);
072
073 Object sessionProxy = ProxyUtil.newProxyInstance(
074 ClassLoaderUtil.getPortalClassLoader(),
075 new Class<?>[] {Map.class, Session.class},
076 jcrSessionInvocationHandler);
077
078 FinalizeManager.register(
079 sessionProxy, jcrSessionInvocationHandler,
080 FinalizeManager.PHANTOM_REFERENCE_FACTORY);
081
082 session = (Session)sessionProxy;
083
084 sessions.put(workspaceName, session);
085
086 return session;
087 }
088
089 public static JCRFactory getJCRFactory() {
090 if (_jcrFactory == null) {
091 _jcrFactory = (JCRFactory)PortalBeanLocatorUtil.locate(
092 JCRFactory.class.getName());
093 }
094
095 return _jcrFactory;
096 }
097
098 public static void initialize() throws RepositoryException {
099 JCRFactory jcrFactory = getJCRFactory();
100
101 jcrFactory.initialize();
102 }
103
104 public static void prepare() throws RepositoryException {
105 JCRFactory jcrFactory = getJCRFactory();
106
107 jcrFactory.prepare();
108 }
109
110 public static void shutdown() {
111 JCRFactory jcrFactory = getJCRFactory();
112
113 jcrFactory.shutdown();
114 }
115
116 private static JCRFactory _jcrFactory;
117 private static final ThreadLocal<Map<String, Session>> _sessions =
118 new AutoResetThreadLocal<Map<String, Session>>(
119 JCRFactoryUtil.class + "._sessions",
120 new HashMap<String, Session>());
121
122 }