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}