001 /*
002 GRANITE DATA SERVICES
003 Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004
005 This file is part of Granite Data Services.
006
007 Granite Data Services is free software; you can redistribute it and/or modify
008 it under the terms of the GNU Library General Public License as published by
009 the Free Software Foundation; either version 2 of the License, or (at your
010 option) any later version.
011
012 Granite Data Services is distributed in the hope that it will be useful, but
013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015 for more details.
016
017 You should have received a copy of the GNU Library General Public License
018 along with this library; if not, see <http://www.gnu.org/licenses/>.
019 */
020
021 package org.granite.messaging.webapp;
022
023 import java.util.Enumeration;
024 import java.util.HashSet;
025 import java.util.Map;
026 import java.util.Set;
027
028 import javax.servlet.ServletContext;
029 import javax.servlet.http.HttpServletRequest;
030 import javax.servlet.http.HttpServletResponse;
031 import javax.servlet.http.HttpSession;
032
033 import org.granite.config.GraniteConfig;
034 import org.granite.config.flex.ServicesConfig;
035
036 /**
037 * @author Franck WOLFF
038 */
039 public class HttpGraniteContext extends ServletGraniteContext {
040
041 private static final String SESSION_LOCK_KEY = HttpGraniteContext.class.getName() + ".LOCK";
042
043 private final HttpServletRequest request;
044 private final HttpServletResponse response;
045
046 private RequestMap requestMap = null;
047
048
049 public static HttpGraniteContext createThreadIntance(
050 GraniteConfig graniteConfig,
051 ServicesConfig servicesConfig,
052 ServletContext servletContext,
053 HttpServletRequest request,
054 HttpServletResponse response) {
055
056 HttpGraniteContext graniteContext = new HttpGraniteContext(graniteConfig, servicesConfig, servletContext, request, response);
057 setCurrentInstance(graniteContext);
058 return graniteContext;
059 }
060
061
062 protected HttpGraniteContext(
063 GraniteConfig graniteConfig,
064 ServicesConfig servicesConfig,
065 ServletContext servletContext,
066 HttpServletRequest request,
067 HttpServletResponse response) {
068
069 super(graniteConfig, servicesConfig, servletContext, (String)null, request.getHeader("GDSClientType"));
070 this.request = request;
071 this.response = response;
072 }
073
074 @Override
075 public HttpServletRequest getRequest() {
076 return request;
077 }
078
079 @Override
080 public HttpServletResponse getResponse() {
081 return response;
082 }
083
084 @Override
085 public String getSessionId() {
086 return request.getSession(false) != null ? request.getSession().getId() : null;
087 }
088
089 @Override
090 public HttpSession getSession(boolean create) {
091 return request.getSession(create);
092 }
093
094 @Override
095 public HttpSession getSession() {
096 return request.getSession(true);
097 }
098
099 @Override
100 public synchronized Object getSessionLock() {
101 Object lock = request.getSession(true).getAttribute(SESSION_LOCK_KEY);
102 if (lock == null) {
103 lock = new Boolean(true);
104 request.getSession(true).setAttribute(SESSION_LOCK_KEY, lock);
105 }
106 return lock;
107 }
108
109
110 @Override
111 public Map<String, Object> getSessionMap() {
112 return getSessionMap(true);
113 }
114 @Override
115 public Map<String, Object> getSessionMap(boolean create) {
116 if (sessionMap == null && (create || request.getSession(false) != null))
117 sessionMap = new SessionMap(request);
118 return sessionMap;
119 }
120
121 @Override
122 public Map<String, Object> getRequestMap() {
123 if (requestMap == null)
124 requestMap = new RequestMap(request);
125 return requestMap;
126 }
127 }
128
129 class RequestMap extends BaseContextMap<String, Object> {
130
131 private HttpServletRequest request = null;
132
133 RequestMap(HttpServletRequest request) {
134 if (request == null)
135 throw new NullPointerException("request is null");
136 this.request = request;
137 }
138
139 @Override
140 public Object get(Object key) {
141 if (!(key instanceof String))
142 return null;
143 return request.getAttribute(key.toString());
144 }
145
146 @Override
147 public Object put(String key, Object value) {
148 if (key == null)
149 throw new IllegalArgumentException(KEY_STRING_ERROR + key);
150 Object result = request.getAttribute(key);
151 request.setAttribute(key, value);
152 return result;
153 }
154
155 @Override
156 public Object remove(Object key) {
157 if (!(key instanceof String))
158 return null;
159 Object result = request.getAttribute(key.toString());
160 request.removeAttribute(key.toString());
161 return result;
162 }
163
164 @Override
165 public Set<Map.Entry<String, Object>> entrySet() {
166 Set<Map.Entry<String, Object>> entries = new HashSet<Map.Entry<String, Object>>();
167 for (Enumeration<?> e = request.getAttributeNames(); e.hasMoreElements();) {
168 String key = (String)e.nextElement();
169 entries.add(new Entry<String, Object>(key, request.getAttribute(key)));
170 }
171 return entries;
172 }
173
174 @Override
175 public boolean equals(Object obj) {
176 if (obj == null || !(obj instanceof RequestMap))
177 return false;
178 return super.equals(obj);
179 }
180 }