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    }