/** * GRANITE DATA SERVICES * Copyright (C) 2006-2015 GRANITE DATA SERVICES S.A.S. * * This file is part of the Granite Data Services Platform. * * Granite Data Services is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * Granite Data Services is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA, or see <http://www.gnu.org/licenses/>. */ package org.granite.messaging.webapp; import java.util.Enumeration; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.granite.config.GraniteConfig; import org.granite.config.flex.ServicesConfig; /** * @author Franck WOLFF */ public class HttpGraniteContext extends ServletGraniteContext { private static final String SESSION_LOCK_KEY = HttpGraniteContext.class.getName() + ".LOCK"; private final HttpServletRequest request; private final HttpServletResponse response; private RequestMap requestMap = null; public static HttpGraniteContext createThreadIntance( GraniteConfig graniteConfig, ServicesConfig servicesConfig, ServletContext servletContext, HttpServletRequest request, HttpServletResponse response) { HttpGraniteContext graniteContext = new HttpGraniteContext(graniteConfig, servicesConfig, servletContext, request, response); setCurrentInstance(graniteContext); return graniteContext; } protected HttpGraniteContext( GraniteConfig graniteConfig, ServicesConfig servicesConfig, ServletContext servletContext, HttpServletRequest request, HttpServletResponse response) { super(graniteConfig, servicesConfig, servletContext, (String)null, request.getHeader("GDSClientType")); this.request = request; this.response = response; } @Override public HttpServletRequest getRequest() { return request; } @Override public HttpServletResponse getResponse() { return response; } @Override public String getSessionId() { return request.getSession(false) != null ? request.getSession().getId() : null; } @Override public HttpSession getSession(boolean create) { return request.getSession(create); } @Override public HttpSession getSession() { return request.getSession(true); } @Override public synchronized Object getSessionLock() { Object lock = request.getSession(true).getAttribute(SESSION_LOCK_KEY); if (lock == null) { lock = new Boolean(true); request.getSession(true).setAttribute(SESSION_LOCK_KEY, lock); } return lock; } @Override public Map<String, Object> getSessionMap() { return getSessionMap(true); } @Override public Map<String, Object> getSessionMap(boolean create) { if (sessionMap == null && (create || request.getSession(false) != null)) sessionMap = new SessionMap(request); return sessionMap; } @Override public Map<String, Object> getRequestMap() { if (requestMap == null) requestMap = new RequestMap(request); return requestMap; } } class RequestMap extends BaseContextMap<String, Object> { private HttpServletRequest request = null; RequestMap(HttpServletRequest request) { if (request == null) throw new NullPointerException("request is null"); this.request = request; } @Override public Object get(Object key) { if (!(key instanceof String)) return null; return request.getAttribute(key.toString()); } @Override public Object put(String key, Object value) { if (key == null) throw new IllegalArgumentException(KEY_STRING_ERROR + key); Object result = request.getAttribute(key); request.setAttribute(key, value); return result; } @Override public Object remove(Object key) { if (!(key instanceof String)) return null; Object result = request.getAttribute(key.toString()); request.removeAttribute(key.toString()); return result; } @Override public Set<Map.Entry<String, Object>> entrySet() { Set<Map.Entry<String, Object>> entries = new HashSet<Map.Entry<String, Object>>(); for (Enumeration<?> e = request.getAttributeNames(); e.hasMoreElements();) { String key = (String)e.nextElement(); entries.add(new Entry<String, Object>(key, request.getAttribute(key))); } return entries; } @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof RequestMap)) return false; return super.equals(obj); } }