use the new session manager interface
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / common / provider / ServletSessionCache.java
1 /*
2  * Copyright [2005] [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.common.provider;
18
19 import javax.servlet.http.HttpServletRequest;
20 import javax.servlet.http.HttpSession;
21
22 import org.apache.log4j.Logger;
23
24 import edu.internet2.middleware.shibboleth.common.Cache;
25 import edu.internet2.middleware.shibboleth.common.CacheException;
26
27 /**
28  * <code>Cache</code> implementation that uses Servlet API sessions to cache data. This implementation will reap
29  * expired entries as they are accessed, but primarily relies on the servlet container and the web browser to handle
30  * invalidation of cached values.
31  * 
32  * @author Walter Hoehn
33  */
34 public class ServletSessionCache extends BaseCache implements Cache {
35
36         private static Logger log = Logger.getLogger(ServletSessionCache.class.getName());
37         private HttpSession session;
38
39         ServletSessionCache(String name, HttpServletRequest request) {
40
41                 super(name, Cache.CacheType.CLIENT_SERVER_SHARED);
42
43                 if (request == null) { throw new IllegalArgumentException(
44                                 "Servlet request is  required for construction of BaseCache."); }
45
46                 this.session = request.getSession();
47         }
48
49         private String getInternalKeyName(String externalKey) {
50
51                 return this.getClass().getName() + "::" + getName() + "::" + externalKey;
52         }
53
54         public boolean contains(String key) {
55
56                 // Lookup object
57                 Object object = session.getAttribute(getInternalKeyName(key));
58                 if (object == null || !(object instanceof CacheEntry)) { return false; }
59
60                 // Clean cache if it is expired
61                 if (((CacheEntry) object).isExpired()) {
62                         log.debug("Found expired object.  Deleting...");
63                         session.removeAttribute(getInternalKeyName(key));
64                         return false;
65                 }
66
67                 // OK, we have it
68                 return true;
69         }
70
71         public String retrieve(String key) {
72
73                 // Lookup object
74                 Object object = session.getAttribute(getInternalKeyName(key));
75                 if (object == null || !(object instanceof CacheEntry)) { return null; }
76
77                 // Clean cache if it is expired
78                 if (((CacheEntry) object).isExpired()) {
79                         log.debug("Found expired object.  Deleting...");
80                         session.removeAttribute(getInternalKeyName(key));
81                         return null;
82                 }
83
84                 // OK, we have it
85                 return ((CacheEntry) object).value;
86         }
87
88         public void store(String key, String value, long duration) {
89
90                 session.setAttribute(getInternalKeyName(key), new CacheEntry(value, duration));
91         }
92
93         public void remove(String key) throws CacheException {
94
95                 session.removeAttribute(getInternalKeyName(key));
96         }
97
98 }