]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/ThreadBoundJcrSessionFactory.java
Add query in JCR controller
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jackrabbit / src / main / java / org / argeo / jcr / ThreadBoundJcrSessionFactory.java
1 package org.argeo.jcr;
2
3 import java.lang.reflect.InvocationHandler;
4 import java.lang.reflect.Method;
5 import java.lang.reflect.Proxy;
6 import java.util.ArrayList;
7 import java.util.Collections;
8 import java.util.List;
9
10 import javax.jcr.Repository;
11 import javax.jcr.RepositoryException;
12 import javax.jcr.Session;
13
14 import org.apache.commons.logging.Log;
15 import org.apache.commons.logging.LogFactory;
16 import org.argeo.ArgeoException;
17 import org.springframework.beans.factory.DisposableBean;
18 import org.springframework.beans.factory.FactoryBean;
19
20 public class ThreadBoundJcrSessionFactory implements FactoryBean,
21 DisposableBean {
22 private final static Log log = LogFactory
23 .getLog(ThreadBoundJcrSessionFactory.class);
24
25 private Repository repository;
26 private List<Session> activeSessions = Collections
27 .synchronizedList(new ArrayList<Session>());
28
29 private ThreadLocal<Session> session = new ThreadLocal<Session>();
30 private boolean destroying = false;
31 private final Session proxiedSession;
32
33 public ThreadBoundJcrSessionFactory() {
34 Class<?>[] interfaces = { Session.class };
35 proxiedSession = (Session) Proxy.newProxyInstance(getClass()
36 .getClassLoader(), interfaces, new InvocationHandler() {
37
38 public Object invoke(Object proxy, Method method, Object[] args)
39 throws Throwable {
40 Session threadSession = session.get();
41 if (threadSession == null) {
42 if ("logout".equals(method.getName()))// no need to login
43 return Void.TYPE;
44 threadSession = login();
45 session.set(threadSession);
46 }
47
48 Object ret = method.invoke(threadSession, args);
49 if ("logout".equals(method.getName())) {
50 session.remove();
51 if (!destroying)
52 activeSessions.remove(threadSession);
53 if (log.isTraceEnabled())
54 log.trace("Logged out from JCR session "
55 + threadSession + "; userId="
56 + threadSession.getUserID());
57 }
58 return ret;
59 }
60 });
61 }
62
63 protected Session login() {
64 try {
65 Session sess = repository.login();
66 if (log.isTraceEnabled())
67 log.trace("Log in to JCR session " + sess + "; userId="
68 + sess.getUserID());
69 // Thread.dumpStack();
70 activeSessions.add(sess);
71 return sess;
72 } catch (RepositoryException e) {
73 throw new ArgeoException("Cannot log in to repository", e);
74 }
75 }
76
77 public Object getObject() {
78 return proxiedSession;
79 }
80
81 public void destroy() throws Exception {
82 if (log.isDebugEnabled())
83 log.debug("Cleaning up " + activeSessions.size()
84 + " active JCR sessions...");
85
86 destroying = true;
87 for (Session sess : activeSessions) {
88 sess.logout();
89 }
90 activeSessions.clear();
91 }
92
93 public Class<? extends Session> getObjectType() {
94 return Session.class;
95 }
96
97 public boolean isSingleton() {
98 return true;
99 }
100
101 public void setRepository(Repository repository) {
102 this.repository = repository;
103 }
104
105 }