Author: niallp Date: Thu Jun 8 09:19:14 2006 New Revision: 412789 URL: http://svn.apache.org/viewvc?rev=412789&view=rev Log: Fix for CHAIN-30 - ServletSessionScopeMap always forces a Session to be Created
Modified: jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/portlet/PortletSessionScopeMap.java jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/portlet/PortletWebContext.java jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/servlet/ServletSessionScopeMap.java jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/servlet/ServletWebContext.java jakarta/commons/proper/chain/trunk/src/test/org/apache/commons/chain/web/portlet/PortletWebContextTestCase.java jakarta/commons/proper/chain/trunk/src/test/org/apache/commons/chain/web/servlet/ServletWebContextTestCase.java Modified: jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/portlet/PortletSessionScopeMap.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/portlet/PortletSessionScopeMap.java?rev=412789&r1=412788&r2=412789&view=diff ============================================================================== --- jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/portlet/PortletSessionScopeMap.java (original) +++ jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/portlet/PortletSessionScopeMap.java Thu Jun 8 09:19:14 2006 @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Set; import javax.portlet.PortletSession; +import javax.portlet.PortletRequest; import org.apache.commons.chain.web.MapEntry; @@ -39,29 +40,37 @@ final class PortletSessionScopeMap implements Map { - public PortletSessionScopeMap(PortletSession session) { - this.session = session; + public PortletSessionScopeMap(PortletRequest request) { + this.request = request; + sessionExists(); } private PortletSession session = null; + private PortletRequest request = null; public void clear() { - Iterator keys = keySet().iterator(); - while (keys.hasNext()) { - session.removeAttribute((String) keys.next()); + if (sessionExists()) { + Iterator keys = keySet().iterator(); + while (keys.hasNext()) { + session.removeAttribute((String) keys.next()); + } } } public boolean containsKey(Object key) { - return (session.getAttribute(key(key)) != null); + if (sessionExists()) { + return (session.getAttribute(key(key)) != null); + } else { + return false; + } } public boolean containsValue(Object value) { - if (value == null) { + if (value == null || !sessionExists()) { return (false); } Enumeration keys = @@ -78,43 +87,64 @@ public Set entrySet() { Set set = new HashSet(); - Enumeration keys = - session.getAttributeNames(PortletSession.PORTLET_SCOPE); - String key; - while (keys.hasMoreElements()) { - key = (String) keys.nextElement(); - set.add(new MapEntry(key, session.getAttribute(key), true)); + if (sessionExists()) { + Enumeration keys = + session.getAttributeNames(PortletSession.PORTLET_SCOPE); + String key; + while (keys.hasMoreElements()) { + key = (String) keys.nextElement(); + set.add(new MapEntry(key, session.getAttribute(key), true)); + } } return (set); } public boolean equals(Object o) { - return (session.equals(o)); + if (sessionExists()) { + return (session.equals(o)); + } else { + return false; + } } public Object get(Object key) { - return (session.getAttribute(key(key))); + if (sessionExists()) { + return (session.getAttribute(key(key))); + } else { + return null; + } } public int hashCode() { - return (session.hashCode()); + if (sessionExists()) { + return (session.hashCode()); + } else { + return 0; + } } public boolean isEmpty() { - return (size() < 1); + if (sessionExists() && + session.getAttributeNames().hasMoreElements()) { + return false; + } else { + return true; + } } public Set keySet() { Set set = new HashSet(); - Enumeration keys = - session.getAttributeNames(PortletSession.PORTLET_SCOPE); - while (keys.hasMoreElements()) { - set.add(keys.nextElement()); + if (sessionExists()) { + Enumeration keys = + session.getAttributeNames(PortletSession.PORTLET_SCOPE); + while (keys.hasMoreElements()) { + set.add(keys.nextElement()); + } } return (set); } @@ -124,6 +154,14 @@ if (value == null) { return (remove(key)); } + + // Ensure the Session is created, if it + // doesn't exist + if (session == null) { + session = request.getPortletSession(); + request = null; + } + String skey = key(key); Object previous = session.getAttribute(skey); session.setAttribute(skey, value); @@ -134,27 +172,33 @@ public void putAll(Map map) { Iterator keys = map.keySet().iterator(); while (keys.hasNext()) { - String key = (String) keys.next(); - session.setAttribute(key, map.get(key)); + Object key = keys.next(); + put(key, map.get(key)); } } public Object remove(Object key) { - String skey = key(key); - Object previous = session.getAttribute(skey); - session.removeAttribute(skey); - return (previous); + if (sessionExists()) { + String skey = key(key); + Object previous = session.getAttribute(skey); + session.removeAttribute(skey); + return (previous); + } else { + return (null); + } } public int size() { int n = 0; - Enumeration keys = - session.getAttributeNames(PortletSession.PORTLET_SCOPE); - while (keys.hasMoreElements()) { - keys.nextElement(); - n++; + if (sessionExists()) { + Enumeration keys = + session.getAttributeNames(PortletSession.PORTLET_SCOPE); + while (keys.hasMoreElements()) { + keys.nextElement(); + n++; + } } return (n); } @@ -162,10 +206,12 @@ public Collection values() { List list = new ArrayList(); - Enumeration keys = - session.getAttributeNames(PortletSession.PORTLET_SCOPE); - while (keys.hasMoreElements()) { - list.add(session.getAttribute((String) keys.nextElement())); + if (sessionExists()) { + Enumeration keys = + session.getAttributeNames(PortletSession.PORTLET_SCOPE); + while (keys.hasMoreElements()) { + list.add(session.getAttribute((String) keys.nextElement())); + } } return (list); } @@ -181,5 +227,18 @@ } } + private boolean sessionExists() { + if (session == null) { + session = request.getPortletSession(false); + if (session != null) { + request = null; + } + } + if (session != null) { + return true; + } else { + return false; + } + } } Modified: jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/portlet/PortletWebContext.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/portlet/PortletWebContext.java?rev=412789&r1=412788&r2=412789&view=diff ============================================================================== --- jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/portlet/PortletWebContext.java (original) +++ jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/portlet/PortletWebContext.java Thu Jun 8 09:19:14 2006 @@ -361,7 +361,7 @@ if ((sessionScope == null) && (request != null)) { sessionScope = - new PortletSessionScopeMap(request.getPortletSession()); + new PortletSessionScopeMap(request); } return (sessionScope); Modified: jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/servlet/ServletSessionScopeMap.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/servlet/ServletSessionScopeMap.java?rev=412789&r1=412788&r2=412789&view=diff ============================================================================== --- jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/servlet/ServletSessionScopeMap.java (original) +++ jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/servlet/ServletSessionScopeMap.java Thu Jun 8 09:19:14 2006 @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Set; import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpServletRequest; import org.apache.commons.chain.web.MapEntry; @@ -39,29 +40,37 @@ final class ServletSessionScopeMap implements Map { - public ServletSessionScopeMap(HttpSession session) { - this.session = session; + public ServletSessionScopeMap(HttpServletRequest request) { + this.request = request; + sessionExists(); } private HttpSession session = null; + private HttpServletRequest request = null; public void clear() { - Iterator keys = keySet().iterator(); - while (keys.hasNext()) { - session.removeAttribute((String) keys.next()); + if (sessionExists()) { + Iterator keys = keySet().iterator(); + while (keys.hasNext()) { + session.removeAttribute((String) keys.next()); + } } } public boolean containsKey(Object key) { - return (session.getAttribute(key(key)) != null); + if (sessionExists()) { + return (session.getAttribute(key(key)) != null); + } else { + return false; + } } public boolean containsValue(Object value) { - if (value == null) { + if (value == null || !sessionExists()) { return (false); } Enumeration keys = session.getAttributeNames(); @@ -77,41 +86,62 @@ public Set entrySet() { Set set = new HashSet(); - Enumeration keys = session.getAttributeNames(); - String key; - while (keys.hasMoreElements()) { - key = (String) keys.nextElement(); - set.add(new MapEntry(key, session.getAttribute(key), true)); + if (sessionExists()) { + Enumeration keys = session.getAttributeNames(); + String key; + while (keys.hasMoreElements()) { + key = (String) keys.nextElement(); + set.add(new MapEntry(key, session.getAttribute(key), true)); + } } return (set); } public boolean equals(Object o) { - return (session.equals(o)); + if (sessionExists()) { + return (session.equals(o)); + } else { + return false; + } } public Object get(Object key) { - return (session.getAttribute(key(key))); + if (sessionExists()) { + return (session.getAttribute(key(key))); + } else { + return null; + } } public int hashCode() { - return (session.hashCode()); + if (sessionExists()) { + return (session.hashCode()); + } else { + return 0; + } } public boolean isEmpty() { - return (size() < 1); + if (sessionExists() && + session.getAttributeNames().hasMoreElements()) { + return false; + } else { + return true; + } } public Set keySet() { Set set = new HashSet(); - Enumeration keys = session.getAttributeNames(); - while (keys.hasMoreElements()) { - set.add(keys.nextElement()); + if (sessionExists()) { + Enumeration keys = session.getAttributeNames(); + while (keys.hasMoreElements()) { + set.add(keys.nextElement()); + } } return (set); } @@ -121,6 +151,14 @@ if (value == null) { return (remove(key)); } + + // Ensure the Session is created, if it + // doesn't exist + if (session == null) { + session = request.getSession(); + request = null; + } + String skey = key(key); Object previous = session.getAttribute(skey); session.setAttribute(skey, value); @@ -131,26 +169,32 @@ public void putAll(Map map) { Iterator keys = map.keySet().iterator(); while (keys.hasNext()) { - String key = (String) keys.next(); - session.setAttribute(key, map.get(key)); + Object key = keys.next(); + put(key, map.get(key)); } } public Object remove(Object key) { - String skey = key(key); - Object previous = session.getAttribute(skey); - session.removeAttribute(skey); - return (previous); + if (sessionExists()) { + String skey = key(key); + Object previous = session.getAttribute(skey); + session.removeAttribute(skey); + return (previous); + } else { + return (null); + } } public int size() { int n = 0; - Enumeration keys = session.getAttributeNames(); - while (keys.hasMoreElements()) { - keys.nextElement(); - n++; + if (sessionExists()) { + Enumeration keys = session.getAttributeNames(); + while (keys.hasMoreElements()) { + keys.nextElement(); + n++; + } } return (n); } @@ -158,9 +202,11 @@ public Collection values() { List list = new ArrayList(); - Enumeration keys = session.getAttributeNames(); - while (keys.hasMoreElements()) { - list.add(session.getAttribute((String) keys.nextElement())); + if (sessionExists()) { + Enumeration keys = session.getAttributeNames(); + while (keys.hasMoreElements()) { + list.add(session.getAttribute((String) keys.nextElement())); + } } return (list); } @@ -176,5 +222,18 @@ } } + private boolean sessionExists() { + if (session == null) { + session = request.getSession(false); + if (session != null) { + request = null; + } + } + if (session != null) { + return true; + } else { + return false; + } + } } Modified: jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/servlet/ServletWebContext.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/servlet/ServletWebContext.java?rev=412789&r1=412788&r2=412789&view=diff ============================================================================== --- jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/servlet/ServletWebContext.java (original) +++ jakarta/commons/proper/chain/trunk/src/java/org/apache/commons/chain/web/servlet/ServletWebContext.java Thu Jun 8 09:19:14 2006 @@ -367,7 +367,7 @@ public Map getSessionScope() { if ((sessionScope == null) && (request != null)) { - sessionScope = new ServletSessionScopeMap(request.getSession()); + sessionScope = new ServletSessionScopeMap(request); } return (sessionScope); Modified: jakarta/commons/proper/chain/trunk/src/test/org/apache/commons/chain/web/portlet/PortletWebContextTestCase.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/chain/trunk/src/test/org/apache/commons/chain/web/portlet/PortletWebContextTestCase.java?rev=412789&r1=412788&r2=412789&view=diff ============================================================================== --- jakarta/commons/proper/chain/trunk/src/test/org/apache/commons/chain/web/portlet/PortletWebContextTestCase.java (original) +++ jakarta/commons/proper/chain/trunk/src/test/org/apache/commons/chain/web/portlet/PortletWebContextTestCase.java Thu Jun 8 09:19:14 2006 @@ -573,6 +573,89 @@ } + // Test getSessionScope() without Session + public void testSessionScopeWithoutSession() { + + // Create a Context without a session + PortletWebContext ctx = new PortletWebContext(pcontext, + new MockPortletRequest(), response); + assertNull("Session(A)", ctx.getRequest().getPortletSession(false)); + + // Get the session Map & check session doesn't exist + Map sessionMap = ctx.getSessionScope(); + assertNull("Session(B)", ctx.getRequest().getPortletSession(false)); + assertNotNull("Session Map(A)", sessionMap); + + // test clear() + sessionMap.clear(); + assertNull("Session(C)", ctx.getRequest().getPortletSession(false)); + + // test containsKey() + assertFalse("containsKey()", sessionMap.containsKey("ABC")); + assertNull("Session(D)", ctx.getRequest().getPortletSession(false)); + + // test containsValue() + assertFalse("containsValue()", sessionMap.containsValue("ABC")); + assertNull("Session(E)", ctx.getRequest().getPortletSession(false)); + + // test entrySet() + Set entrySet = sessionMap.entrySet(); + assertNotNull("entrySet", entrySet); + assertEquals("entrySet Size", 0, entrySet.size()); + assertNull("Session(F)", ctx.getRequest().getPortletSession(false)); + + // test equals() + assertFalse("equals()", sessionMap.equals("ABC")); + assertNull("Session(G)", ctx.getRequest().getPortletSession(false)); + + // test get() + assertNull("get()", sessionMap.get("ABC")); + assertNull("Session(H)", ctx.getRequest().getPortletSession(false)); + + // test hashCode() + sessionMap.hashCode(); + assertNull("Session(I)", ctx.getRequest().getPortletSession(false)); + + // test isEmpty() + assertTrue("isEmpty()", sessionMap.isEmpty()); + assertNull("Session(J)", ctx.getRequest().getPortletSession(false)); + + // test keySet() + Set keySet = sessionMap.keySet(); + assertNotNull("keySet", keySet); + assertEquals("keySet Size", 0, keySet.size()); + assertNull("Session(K)", ctx.getRequest().getPortletSession(false)); + + // test putAll() with an empty Map + sessionMap.putAll(new HashMap()); + assertNull("Session(L)", ctx.getRequest().getPortletSession(false)); + + // test remove() + assertNull("remove()", sessionMap.remove("ABC")); + assertNull("Session(M)", ctx.getRequest().getPortletSession(false)); + + // test size() + assertEquals("size() Size", 0, sessionMap.size()); + assertNull("Session(N)", ctx.getRequest().getPortletSession(false)); + + // test values() + Collection values = sessionMap.values(); + assertNotNull("values", values); + assertEquals("values Size", 0, values.size()); + assertNull("Session(O)", ctx.getRequest().getPortletSession(false)); + + // test put() + try { + assertNull("put()", sessionMap.put("ABC", "XYZ")); + assertNotNull("Session(P)", ctx.getRequest().getPortletSession(false)); + } catch(UnsupportedOperationException ex) { + // expected: currently MockPortletRequest throws this + // when trying to create a PortletSession + } + + } + + // ------------------------------------------------------- Protected Methods Modified: jakarta/commons/proper/chain/trunk/src/test/org/apache/commons/chain/web/servlet/ServletWebContextTestCase.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/chain/trunk/src/test/org/apache/commons/chain/web/servlet/ServletWebContextTestCase.java?rev=412789&r1=412788&r2=412789&view=diff ============================================================================== --- jakarta/commons/proper/chain/trunk/src/test/org/apache/commons/chain/web/servlet/ServletWebContextTestCase.java (original) +++ jakarta/commons/proper/chain/trunk/src/test/org/apache/commons/chain/web/servlet/ServletWebContextTestCase.java Thu Jun 8 09:19:14 2006 @@ -31,6 +31,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.Collection; /** @@ -678,6 +679,89 @@ // Clearing the map map.clear(); checkMapSize(map, 0); + + } + + + // Test getSessionScope() without Session + public void testSessionScopeWithoutSession() { + + // Create a Context without a session + ServletWebContext ctx = new ServletWebContext(scontext, + new MockHttpServletRequest(), response); + assertNull("Session(A)", ctx.getRequest().getSession(false)); + + // Get the session Map & check session doesn't exist + Map sessionMap = ctx.getSessionScope(); + assertNull("Session(B)", ctx.getRequest().getSession(false)); + assertNotNull("Session Map(A)", sessionMap); + + // test clear() + sessionMap.clear(); + assertNull("Session(C)", ctx.getRequest().getSession(false)); + + // test containsKey() + assertFalse("containsKey()", sessionMap.containsKey("ABC")); + assertNull("Session(D)", ctx.getRequest().getSession(false)); + + // test containsValue() + assertFalse("containsValue()", sessionMap.containsValue("ABC")); + assertNull("Session(E)", ctx.getRequest().getSession(false)); + + // test entrySet() + Set entrySet = sessionMap.entrySet(); + assertNotNull("entrySet", entrySet); + assertEquals("entrySet Size", 0, entrySet.size()); + assertNull("Session(F)", ctx.getRequest().getSession(false)); + + // test equals() + assertFalse("equals()", sessionMap.equals("ABC")); + assertNull("Session(G)", ctx.getRequest().getSession(false)); + + // test get() + assertNull("get()", sessionMap.get("ABC")); + assertNull("Session(H)", ctx.getRequest().getSession(false)); + + // test hashCode() + sessionMap.hashCode(); + assertNull("Session(I)", ctx.getRequest().getSession(false)); + + // test isEmpty() + assertTrue("isEmpty()", sessionMap.isEmpty()); + assertNull("Session(J)", ctx.getRequest().getSession(false)); + + // test keySet() + Set keySet = sessionMap.keySet(); + assertNotNull("keySet", keySet); + assertEquals("keySet Size", 0, keySet.size()); + assertNull("Session(K)", ctx.getRequest().getSession(false)); + + // test putAll() with an empty Map + sessionMap.putAll(new HashMap()); + assertNull("Session(L)", ctx.getRequest().getSession(false)); + + // test remove() + assertNull("remove()", sessionMap.remove("ABC")); + assertNull("Session(M)", ctx.getRequest().getSession(false)); + + // test size() + assertEquals("size() Size", 0, sessionMap.size()); + assertNull("Session(N)", ctx.getRequest().getSession(false)); + + // test values() + Collection values = sessionMap.values(); + assertNotNull("values", values); + assertEquals("values Size", 0, values.size()); + assertNull("Session(O)", ctx.getRequest().getSession(false)); + + // test put() + try { + assertNull("put()", sessionMap.put("ABC", "XYZ")); + assertNotNull("Session(P)", ctx.getRequest().getSession(false)); + } catch(UnsupportedOperationException ex) { + // expected: currently MockHttpServletRequest throws this + // when trying to create a HttpSession + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]