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 */
022package org.granite.messaging.webapp;
023
024import java.util.Enumeration;
025import java.util.HashSet;
026import java.util.Map;
027import java.util.Set;
028
029import javax.servlet.ServletContext;
030import javax.servlet.http.HttpServletRequest;
031import javax.servlet.http.HttpServletResponse;
032import javax.servlet.http.HttpSession;
033
034import org.granite.config.GraniteConfig;
035import org.granite.config.flex.ServicesConfig;
036
037/**
038 * @author Franck WOLFF
039 */
040public 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
130class 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}