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}