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