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