bit more optimization
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / idp / session / impl / SessionManagerImpl.java
1 /*
2  * Copyright [2007] [University Corporation for Advanced Internet Development, Inc.]
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package edu.internet2.middleware.shibboleth.idp.session.impl;
18
19 import java.net.InetAddress;
20
21 import org.joda.time.DateTime;
22 import org.opensaml.util.storage.ExpiringObject;
23 import org.opensaml.util.storage.StorageService;
24 import org.opensaml.xml.util.DatatypeHelper;
25 import org.springframework.context.ApplicationContext;
26 import org.springframework.context.ApplicationContextAware;
27
28 import edu.internet2.middleware.shibboleth.common.session.LoginEvent;
29 import edu.internet2.middleware.shibboleth.common.session.LogoutEvent;
30 import edu.internet2.middleware.shibboleth.common.session.SessionManager;
31 import edu.internet2.middleware.shibboleth.idp.session.Session;
32
33 /**
34  * Manager of IdP sessions.
35  */
36 public class SessionManagerImpl implements SessionManager<Session>, ApplicationContextAware {
37
38     /** Spring context used to publish login and logout events. */
39     private ApplicationContext appCtx;
40     
41     /** Backing service used to store sessions. */
42     private StorageService<String, SessionManagerEntry> sessionStore;
43     
44     /** Parition in which entries are stored. */
45     private String partition;
46     
47     /** Lifetime, in milliseconds, of session. */
48     private long sessionLifetime;
49     
50     /**
51      * Constructor.
52      *
53      * @param storageService service used to store sessions
54      * @param lifetime lifetime, in milliseconds, of sessions
55      */
56     public SessionManagerImpl(StorageService<String, SessionManagerEntry> storageService, long lifetime){
57         sessionStore = storageService;
58         partition = "session";
59         sessionLifetime = lifetime;
60     }
61     
62     /**
63      * Constructor.
64      *
65      * @param storageService service used to store session
66      * @param storageParition partition in which sessions are stored
67      * @param lifetime lifetime, in milliseconds, of sessions
68      */
69     public SessionManagerImpl(StorageService<String, SessionManagerEntry> storageService, String storageParition, long lifetime){
70         sessionStore = storageService;
71         if(!DatatypeHelper.isEmpty(storageParition)){
72             partition = DatatypeHelper.safeTrim(storageParition);
73         }else{
74             partition = "session";
75         }
76         sessionLifetime = lifetime;
77     }
78     
79     /** {@inheritDoc} */
80     public void setApplicationContext(ApplicationContext applicationContext) {
81         appCtx = applicationContext;
82     }
83     
84     /** {@inheritDoc} */
85     public Session createSession(InetAddress presenter, String principal) {
86         Session session = new SessionImpl(presenter, principal);
87         SessionManagerEntry sessionEntry = new SessionManagerEntry(this, session, sessionLifetime);
88         sessionStore.put(partition, session.getSessionID(), sessionEntry);
89         appCtx.publishEvent(new LoginEvent(session));
90         return session;
91     }
92
93     /** {@inheritDoc} */
94     public void destroySession(String sessionID) {
95         if(sessionID == null){
96             return;
97         }
98         
99         SessionManagerEntry sessionEntry = sessionStore.get(partition, sessionID);
100         if(sessionEntry != null){
101             appCtx.publishEvent(new LogoutEvent(sessionEntry.getSession()));
102         }
103     }
104
105     /** {@inheritDoc} */
106     public Session getSession(String sessionID) {
107         if(sessionID == null){
108             return null;
109         }
110         
111         SessionManagerEntry sessionEntry = sessionStore.get(partition, sessionID);
112         if(sessionEntry == null){
113             return null;
114         }
115         
116         if(sessionEntry.isExpired()){
117             destroySession(sessionEntry.getSessionId());
118             return null;
119         }else{
120             return sessionEntry.getSession();
121         }
122     }
123     
124     /**
125      * Session store entry.
126      */
127     public class SessionManagerEntry implements ExpiringObject {
128         
129         /** User's session. */
130         private Session userSession;
131         
132         /** Manager that owns the session. */
133         private SessionManager<Session> sessionManager;
134         
135         /** Time this entry expires. */
136         private DateTime expirationTime;
137         
138         /**
139          * Constructor.
140          *
141          * @param manager manager that owns the session
142          * @param session user session
143          * @param sessionLifetime lifetime of session
144          */
145         public SessionManagerEntry(SessionManager<Session> manager, Session session, long sessionLifetime){
146             sessionManager = manager;
147             userSession = session;
148             expirationTime = new DateTime().plus(sessionLifetime);
149         }
150         
151         /**
152          * Gets the user session.
153          * 
154          * @return user session
155          */
156         public Session getSession(){
157             return userSession;
158         }
159         
160         /**
161          * Gets the ID of the user session.
162          * 
163          * @return ID of the user session
164          */
165         public String getSessionId(){
166             return userSession.getSessionID();
167         }
168
169         /** {@inheritDoc} */
170         public DateTime getExpirationTime() {
171             return expirationTime;
172         }
173
174         /** {@inheritDoc} */
175         public boolean isExpired() {
176             return expirationTime.isBeforeNow();
177         }
178         
179         /** {@inheritDoc} */
180         public void onExpire() {
181             sessionManager.destroySession(userSession.getSessionID());
182         }
183     }
184 }