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