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    }