1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.context;
35
36 import info.magnolia.repository.RepositoryManager;
37
38 import java.util.HashMap;
39 import java.util.Map;
40
41 import javax.inject.Inject;
42 import javax.jcr.LoginException;
43 import javax.jcr.RepositoryException;
44 import javax.jcr.Session;
45 import javax.jcr.observation.EventListener;
46 import javax.jcr.observation.EventListenerIterator;
47 import javax.jcr.observation.ObservationManager;
48
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
51
52
53
54
55
56 public abstract class AbstractRepositoryStrategy implements JCRSessionStrategy {
57 private static final Logger log = LoggerFactory.getLogger(AbstractRepositoryStrategy.class);
58
59 private final Map<String, Session> jcrSessions = new HashMap<String, Session>();
60
61 protected final RepositoryManager repositoryManager;
62
63 @Inject
64 protected AbstractRepositoryStrategy(RepositoryManager repositoryManager) {
65 this.repositoryManager = repositoryManager;
66 }
67
68 @Override
69 public Session getSession(String workspaceName) throws LoginException, RepositoryException {
70 Session jcrSession = jcrSessions.get(workspaceName);
71
72 if (jcrSession == null) {
73 log.debug("creating jcr session {} by thread {}", workspaceName, Thread.currentThread().getName());
74
75 jcrSession = internalGetSession(workspaceName);
76 jcrSessions.put(workspaceName, jcrSession);
77 }
78
79 return jcrSession;
80 }
81
82 protected abstract Session internalGetSession(String workspaceName) throws RepositoryException;
83
84 protected void release(boolean checkObservation) {
85 log.debug("releasing jcr sessions");
86 for (Session session : jcrSessions.values()) {
87 releaseSession(session, checkObservation);
88 }
89 jcrSessions.clear();
90 }
91
92 protected void releaseSession(final Session session, boolean checkObservation) {
93 final String workspaceName = session.getWorkspace().getName();
94 if (session.isLive()) {
95 try {
96 final ObservationManager observationManager = session.getWorkspace().getObservationManager();
97 final EventListenerIterator listeners = observationManager.getRegisteredEventListeners();
98 if (!checkObservation || !listeners.hasNext()) {
99 session.logout();
100 log.debug("logged out jcr session: {} by thread {}", session, Thread.currentThread().getName());
101
102 } else {
103 log.warn("won't close session because of registered observation listener {}", workspaceName);
104 if (log.isDebugEnabled()) {
105 while (listeners.hasNext()) {
106 EventListener listener = listeners.nextEventListener();
107 log.debug("registered listener {}", listener);
108 }
109 }
110 }
111 } catch (RepositoryException e) {
112 log.error("can't check if event listeners are registered", e);
113 }
114 } else {
115 log.warn("session has been already closed {}", workspaceName);
116 }
117 }
118
119
120
121
122 protected int getLocalSessionCount() {
123 return jcrSessions.size();
124 }
125 }