Author: husted Date: Mon Mar 12 13:25:06 2007 New Revision: 517374 URL: http://svn.apache.org/viewvc?view=rev&rev=517374 Log: WW-1678 - Port cookie interceptor from WW 2.2.5. Patch submitted by Nate Drake based on code contributed to WebWork2/Open Symphony by Toby Jee and Mathew Payne.
Added: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/interceptor/CookieInterceptor.java struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/interceptor/CookiesAware.java struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/interceptor/CookieInterceptorTest.java Added: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/interceptor/CookieInterceptor.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/interceptor/CookieInterceptor.java?view=auto&rev=517374 ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/interceptor/CookieInterceptor.java (added) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/interceptor/CookieInterceptor.java Mon Mar 12 13:25:06 2007 @@ -0,0 +1,275 @@ +/* + * $Id: $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.struts2.interceptor; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.struts2.ServletActionContext; +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.interceptor.AbstractInterceptor; +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.TextParseUtil; + +/** + * <!-- START SNIPPET: description --> + * + * The aim of this interceptor is to set values in the stack/action based on cookie name/value + * of interest. <p/> + * + * If an asterik is present in cookiesName parameter, it will be assume that + * all cookies name are to be injected into struts' action, even though + * cookiesName is comma-separated by other values, eg (cookie1,*,cookie2). <p/> + * + * If cookiesName is left empty it will assume that no cookie will be injected + * into Struts' action. <p/> + * + * If an asterik is present in cookiesValue parameter, it will assume that all + * cookies name irrespective of its value will be injected into Struts' action so + * long as the cookie name matches those specified in cookiesName parameter.<p/> + * + * If cookiesValue is left empty it will assume that all cookie that match the cookieName + * parameter will be injected into Struts' action.<p/> + * + * The action could implements [EMAIL PROTECTED] CookiesAware} in order to have a [EMAIL PROTECTED] Map} + * of filtered cookies set into it. <p/> + * + * <!-- END SNIPPET: description --> + * + * + * <!-- START SNIPPET: parameters --> + * + * <ul> + * <li>cookiesName (mandatory) - Name of cookies to be injected into the action. If more + * than one cookie name is desired it could be comma-separated. + * If all cookies name is desired, it could simply be *, an asterik. + * When many cookies name are comma-separated either of the cookie + * that match the name in the comma-separated list will be qualified.</li> + * <li>cookiesValue (mandatory) - Value of cookies that if its name matches cookieName attribute + * and its value matched this, will be injected into Struts' + * action. If more than one cookie name is desired it could be + * comma-separated. If left empty, it will assume any value would + * be ok. If more than one value is specified (comma-separated) + * it will assume a match if either value is matched. + * </ul> + * + * <!-- END SNIPPET: parameters --> + * + * + * <!-- START SNIPPET: extending --> + * + * <ul> + * populateCookieValueIntoStack - this method will decide if this cookie value is qualified to be + * populated into the value stack (hence into the action itself) + * injectIntoCookiesAwareAction - this method will inject selected cookies (as a java.util.Map) into + * action that implements [EMAIL PROTECTED] CookiesAware}. + * </ul> + * + * <!-- END SNIPPET: extending --> + * + * <pre> + * <!-- START SNIPPET: example --> + * + * <!-- + * This example will inject cookies named either 'cookie1' or 'cookie2' whose + * value could be either 'cookie1value' or 'cookie2value' into Struts' action. + * --> + * <action ... > + * <interceptor-ref name="cookie"> + * <param name="cookiesName">cookie1, cookie2</param> + * <param name="cookiesValue">cookie1value, cookie2value</param> + * </interceptor-ref> + * .... + * </action> + * + * + * <!-- + * This example will inject cookies named either 'cookie1' or 'cookie2' + * regardless of their value into Struts' action. + * --> + * <action ... > + * <interceptor-ref name="cookie"> + * <param name="cookiesName">cookie1, cookie2</param> + * <param name="cookiesValue">*</param> + * <interceptor-ref> + * ... + * </action> + * + * + * <!-- + * This example will inject cookies named either 'cookie1' with value + * 'cookie1value' or 'cookie2' with value 'cookie2value' into Struts' + * action. + * --> + * <action ... > + * <interceptor-ref name="cookie"> + * <param name="cookiesName">cookie1</param> + * <param name="cookiesValue">cookie1value</param> + * </interceptor-ref> + * <interceptor-ref name="cookie"> + * <param name="cookiesName"<cookie2</param> + * <param name="cookiesValue">cookie2value</param> + * </interceptor-ref> + * .... + * </action> + * + * <!-- + * This example will inject any cookies regardless of its value into + * Struts' action. + * --> + * <action ... > + * <interceptor-ref name="cookie"> + * <param name="cookiesName">*</param> + * <param name="cookiesValue">*</param> + * </interceptor-ref> + * ... + * </action> + * + * <!-- END SNIPPET: example --> + * </pre> + * + * @see CookiesAware + */ +public class CookieInterceptor extends AbstractInterceptor { + + private static final long serialVersionUID = 4153142432948747305L; + + private static final Log LOG = LogFactory.getLog(CookieInterceptor.class); + + private Set cookiesNameSet = Collections.EMPTY_SET; + private Set cookiesValueSet = Collections.EMPTY_SET; + + /** + * Set the <code>cookiesName</code> which if matche will allow the cookie + * to be injected into action, could be comma-separated string. + * + * @param cookiesName + */ + public void setCookiesName(String cookiesName) { + if (cookiesName != null) + this.cookiesNameSet = TextParseUtil.commaDelimitedStringToSet(cookiesName); + } + + /** + * Set the <code>cookiesValue</code> which if matched (together with matching + * cookiesName) will caused the cookie to be injected into action, could be + * comma-separated string. + * + * @param cookiesValue + */ + public void setCookiesValue(String cookiesValue) { + if (cookiesValue != null) + this.cookiesValueSet = TextParseUtil.commaDelimitedStringToSet(cookiesValue); + } + + + public String intercept(ActionInvocation invocation) throws Exception { + + if (LOG.isDebugEnabled()) + LOG.debug("start interception"); + + final ValueStack stack = ActionContext.getContext().getValueStack(); + HttpServletRequest request = ServletActionContext.getRequest(); + + // contains selected cookies + Map cookiesMap = new LinkedHashMap(); + + Cookie cookies[] = request.getCookies(); + for (int a=0; a< cookies.length; a++) { + String name = cookies[a].getName(); + String value = cookies[a].getValue(); + + if (cookiesNameSet.contains("*")) { + if (LOG.isDebugEnabled()) + LOG.debug("contains cookie name [*] in configured cookies name set, cookie with name ["+name+"] with value ["+value+"] will be injected"); + populateCookieValueIntoStack(name, value, cookiesMap, stack); + } + else if (cookiesNameSet.contains(cookies[a].getName())) { + populateCookieValueIntoStack(name, value, cookiesMap, stack); + } + } + + injectIntoCookiesAwareAction(invocation.getAction(), cookiesMap); + + return invocation.invoke(); + } + + /** + * Hook that populate cookie value into value stack (hence the action) + * if the criteria is satisfied (if the cookie value matches with those configured). + * + * @param cookieName + * @param cookieValue + * @param cookiesMap + * @param stack + */ + protected void populateCookieValueIntoStack(String cookieName, String cookieValue, Map cookiesMap, ValueStack stack) { + if (cookiesValueSet.isEmpty() || cookiesValueSet.contains("*")) { + // If the interceptor is configured to accept any cookie value + // OR + // no cookiesValue is defined, so as long as the cookie name match + // we'll inject it into Struts' action + if (LOG.isDebugEnabled()) { + if (cookiesValueSet.isEmpty()) + LOG.debug("no cookie value is configured, cookie with name ["+cookieName+"] with value ["+cookieValue+"] will be injected"); + else if (cookiesValueSet.contains("*")) + LOG.debug("interceptor is configured to accept any value, cookie with name ["+cookieName+"] with value ["+cookieValue+"] will be injected"); + } + cookiesMap.put(cookieName, cookieValue); + stack.setValue(cookieName, cookieValue); + } + else { + // if cookiesValues is specified, the cookie's value must match before we + // inject them into Struts' action + if (cookiesValueSet.contains(cookieValue)) { + if (LOG.isDebugEnabled()) + LOG.debug("both configured cookie name and value matched, cookie ["+cookieName+"] with value ["+cookieValue+"] will be injected"); + cookiesMap.put(cookieName, cookieValue); + stack.setValue(cookieName, cookieValue); + } + } + } + + /** + * Hook that set the <code>cookiesMap</code> into action that implements + * [EMAIL PROTECTED] CookiesAware}. + * + * @param action + * @param cookiesMap + */ + protected void injectIntoCookiesAwareAction(Object action, Map cookiesMap) { + if (action instanceof CookiesAware) { + if (LOG.isDebugEnabled()) + LOG.debug("action ["+action+"] implements CookiesAware, injecting cookies map ["+cookiesMap+"]"); + ((CookiesAware)action).setCookiesMap(cookiesMap); + } + } + +} Added: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/interceptor/CookiesAware.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/interceptor/CookiesAware.java?view=auto&rev=517374 ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/interceptor/CookiesAware.java (added) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/interceptor/CookiesAware.java Mon Mar 12 13:25:06 2007 @@ -0,0 +1,27 @@ +/* + * $Id: $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.struts2.interceptor; + +import java.util.Map; + +public interface CookiesAware { + void setCookiesMap(Map cookies); +} Added: struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/interceptor/CookieInterceptorTest.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/interceptor/CookieInterceptorTest.java?view=auto&rev=517374 ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/interceptor/CookieInterceptorTest.java (added) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/interceptor/CookieInterceptorTest.java Mon Mar 12 13:25:06 2007 @@ -0,0 +1,345 @@ +/* + * $Id: $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.struts2.interceptor; + +import java.util.Collections; +import java.util.Map; + +import javax.servlet.http.Cookie; + +import org.easymock.MockControl; +import org.springframework.mock.web.MockHttpServletRequest; + +import org.apache.struts2.ServletActionContext; +import org.apache.struts2.StrutsTestCase; +import com.opensymphony.xwork2.Action; +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.ActionSupport; + +public class CookieInterceptorTest extends StrutsTestCase { + + + public void testIntercepDefault() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setCookies(new Cookie[] { + new Cookie("cookie1", "cookie1value"), + new Cookie("cookie2", "cookie2value"), + new Cookie("cookie3", "cookie3value") + }); + ServletActionContext.setRequest(request); + + MockActionWithCookieAware action = new MockActionWithCookieAware(); + + ActionContext.getContext().getValueStack().push(action); + + MockControl actionInvocationControl = MockControl.createControl(ActionInvocation.class); + ActionInvocation invocation = (ActionInvocation) actionInvocationControl.getMock(); + actionInvocationControl.expectAndDefaultReturn( + invocation.getAction(), action); + actionInvocationControl.expectAndDefaultReturn( + invocation.invoke(), Action.SUCCESS); + + actionInvocationControl.replay(); + + // by default the interceptor doesn't accept any cookies + CookieInterceptor interceptor = new CookieInterceptor(); + interceptor.intercept(invocation); + + assertTrue(action.getCookiesMap().isEmpty()); + assertNull(action.getCookie1(), null); + assertNull(action.getCookie2(), null); + assertNull(action.getCookie3(), null); + assertNull(ActionContext.getContext().getValueStack().findValue("cookie1")); + assertNull(ActionContext.getContext().getValueStack().findValue("cookie2")); + assertNull(ActionContext.getContext().getValueStack().findValue("cookie3")); + } + + public void testInterceptAll1() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setCookies(new Cookie[] { + new Cookie("cookie1", "cookie1value"), + new Cookie("cookie2", "cookie2value"), + new Cookie("cookie3", "cookie3value") + }); + ServletActionContext.setRequest(request); + + MockActionWithCookieAware action = new MockActionWithCookieAware(); + + ActionContext.getContext().getValueStack().push(action); + + MockControl actionInvocationControl = MockControl.createControl(ActionInvocation.class); + ActionInvocation invocation = (ActionInvocation) actionInvocationControl.getMock(); + actionInvocationControl.expectAndDefaultReturn( + invocation.getAction(), action); + actionInvocationControl.expectAndDefaultReturn( + invocation.invoke(), Action.SUCCESS); + + actionInvocationControl.replay(); + + CookieInterceptor interceptor = new CookieInterceptor(); + interceptor.setCookiesName("*"); + interceptor.setCookiesValue("*"); + interceptor.intercept(invocation); + + assertFalse(action.getCookiesMap().isEmpty()); + assertEquals(action.getCookiesMap().size(), 3); + assertEquals(action.getCookiesMap().get("cookie1"), "cookie1value"); + assertEquals(action.getCookiesMap().get("cookie2"), "cookie2value"); + assertEquals(action.getCookiesMap().get("cookie3"), "cookie3value"); + assertEquals(action.getCookie1(), "cookie1value"); + assertEquals(action.getCookie2(), "cookie2value"); + assertEquals(action.getCookie3(), "cookie3value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie1"), "cookie1value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie2"), "cookie2value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie3"), "cookie3value"); + } + + + public void testInterceptAll2() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setCookies(new Cookie[] { + new Cookie("cookie1", "cookie1value"), + new Cookie("cookie2", "cookie2value"), + new Cookie("cookie3", "cookie3value") + }); + ServletActionContext.setRequest(request); + + MockActionWithCookieAware action = new MockActionWithCookieAware(); + + ActionContext.getContext().getValueStack().push(action); + + MockControl actionInvocationControl = MockControl.createControl(ActionInvocation.class); + ActionInvocation invocation = (ActionInvocation) actionInvocationControl.getMock(); + actionInvocationControl.expectAndDefaultReturn( + invocation.getAction(), action); + actionInvocationControl.expectAndDefaultReturn( + invocation.invoke(), Action.SUCCESS); + + actionInvocationControl.replay(); + + CookieInterceptor interceptor = new CookieInterceptor(); + interceptor.setCookiesName("cookie1, cookie2, cookie3"); + interceptor.setCookiesValue("cookie1value, cookie2value, cookie3value"); + interceptor.intercept(invocation); + + assertFalse(action.getCookiesMap().isEmpty()); + assertEquals(action.getCookiesMap().size(), 3); + assertEquals(action.getCookiesMap().get("cookie1"), "cookie1value"); + assertEquals(action.getCookiesMap().get("cookie2"), "cookie2value"); + assertEquals(action.getCookiesMap().get("cookie3"), "cookie3value"); + assertEquals(action.getCookie1(), "cookie1value"); + assertEquals(action.getCookie2(), "cookie2value"); + assertEquals(action.getCookie3(), "cookie3value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie1"), "cookie1value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie2"), "cookie2value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie3"), "cookie3value"); + } + + public void testInterceptSelectedCookiesNameOnly1() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setCookies(new Cookie[] { + new Cookie("cookie1", "cookie1value"), + new Cookie("cookie2", "cookie2value"), + new Cookie("cookie3", "cookie3value") + }); + ServletActionContext.setRequest(request); + + MockActionWithCookieAware action = new MockActionWithCookieAware(); + + ActionContext.getContext().getValueStack().push(action); + + MockControl actionInvocationControl = MockControl.createControl(ActionInvocation.class); + ActionInvocation invocation = (ActionInvocation) actionInvocationControl.getMock(); + actionInvocationControl.expectAndDefaultReturn( + invocation.getAction(), action); + actionInvocationControl.expectAndDefaultReturn( + invocation.invoke(), Action.SUCCESS); + + actionInvocationControl.replay(); + + CookieInterceptor interceptor = new CookieInterceptor(); + interceptor.setCookiesName("cookie1, cookie3"); + interceptor.setCookiesValue("cookie1value, cookie2value, cookie3value"); + interceptor.intercept(invocation); + + assertFalse(action.getCookiesMap().isEmpty()); + assertEquals(action.getCookiesMap().size(), 2); + assertEquals(action.getCookiesMap().get("cookie1"), "cookie1value"); + assertEquals(action.getCookiesMap().get("cookie2"), null); + assertEquals(action.getCookiesMap().get("cookie3"), "cookie3value"); + assertEquals(action.getCookie1(), "cookie1value"); + assertEquals(action.getCookie2(), null); + assertEquals(action.getCookie3(), "cookie3value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie1"), "cookie1value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie2"), null); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie3"), "cookie3value"); + } + + public void testInterceptSelectedCookiesNameOnly2() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setCookies(new Cookie[] { + new Cookie("cookie1", "cookie1value"), + new Cookie("cookie2", "cookie2value"), + new Cookie("cookie3", "cookie3value") + }); + ServletActionContext.setRequest(request); + + MockActionWithCookieAware action = new MockActionWithCookieAware(); + + ActionContext.getContext().getValueStack().push(action); + + MockControl actionInvocationControl = MockControl.createControl(ActionInvocation.class); + ActionInvocation invocation = (ActionInvocation) actionInvocationControl.getMock(); + actionInvocationControl.expectAndDefaultReturn( + invocation.getAction(), action); + actionInvocationControl.expectAndDefaultReturn( + invocation.invoke(), Action.SUCCESS); + + actionInvocationControl.replay(); + + CookieInterceptor interceptor = new CookieInterceptor(); + interceptor.setCookiesName("cookie1, cookie3"); + interceptor.setCookiesValue("*"); + interceptor.intercept(invocation); + + assertFalse(action.getCookiesMap().isEmpty()); + assertEquals(action.getCookiesMap().size(), 2); + assertEquals(action.getCookiesMap().get("cookie1"), "cookie1value"); + assertEquals(action.getCookiesMap().get("cookie2"), null); + assertEquals(action.getCookiesMap().get("cookie3"), "cookie3value"); + assertEquals(action.getCookie1(), "cookie1value"); + assertEquals(action.getCookie2(), null); + assertEquals(action.getCookie3(), "cookie3value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie1"), "cookie1value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie2"), null); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie3"), "cookie3value"); + } + + public void testInterceptSelectedCookiesNameOnly3() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setCookies(new Cookie[] { + new Cookie("cookie1", "cookie1value"), + new Cookie("cookie2", "cookie2value"), + new Cookie("cookie3", "cookie3value") + }); + ServletActionContext.setRequest(request); + + MockActionWithCookieAware action = new MockActionWithCookieAware(); + + ActionContext.getContext().getValueStack().push(action); + + MockControl actionInvocationControl = MockControl.createControl(ActionInvocation.class); + ActionInvocation invocation = (ActionInvocation) actionInvocationControl.getMock(); + actionInvocationControl.expectAndDefaultReturn( + invocation.getAction(), action); + actionInvocationControl.expectAndDefaultReturn( + invocation.invoke(), Action.SUCCESS); + + actionInvocationControl.replay(); + + CookieInterceptor interceptor = new CookieInterceptor(); + interceptor.setCookiesName("cookie1, cookie3"); + interceptor.setCookiesValue(""); + interceptor.intercept(invocation); + + assertFalse(action.getCookiesMap().isEmpty()); + assertEquals(action.getCookiesMap().size(), 2); + assertEquals(action.getCookiesMap().get("cookie1"), "cookie1value"); + assertEquals(action.getCookiesMap().get("cookie2"), null); + assertEquals(action.getCookiesMap().get("cookie3"), "cookie3value"); + assertEquals(action.getCookie1(), "cookie1value"); + assertEquals(action.getCookie2(), null); + assertEquals(action.getCookie3(), "cookie3value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie1"), "cookie1value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie2"), null); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie3"), "cookie3value"); + } + + + public void testInterceptSelectedCookiesNameAndValue() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setCookies(new Cookie[] { + new Cookie("cookie1", "cookie1value"), + new Cookie("cookie2", "cookie2value"), + new Cookie("cookie3", "cookie3value") + }); + ServletActionContext.setRequest(request); + + MockActionWithCookieAware action = new MockActionWithCookieAware(); + + ActionContext.getContext().getValueStack().push(action); + + MockControl actionInvocationControl = MockControl.createControl(ActionInvocation.class); + ActionInvocation invocation = (ActionInvocation) actionInvocationControl.getMock(); + actionInvocationControl.expectAndDefaultReturn( + invocation.getAction(), action); + actionInvocationControl.expectAndDefaultReturn( + invocation.invoke(), Action.SUCCESS); + + actionInvocationControl.replay(); + + CookieInterceptor interceptor = new CookieInterceptor(); + interceptor.setCookiesName("cookie1, cookie3"); + interceptor.setCookiesValue("cookie1value"); + interceptor.intercept(invocation); + + assertFalse(action.getCookiesMap().isEmpty()); + assertEquals(action.getCookiesMap().size(), 1); + assertEquals(action.getCookiesMap().get("cookie1"), "cookie1value"); + assertEquals(action.getCookiesMap().get("cookie2"), null); + assertEquals(action.getCookiesMap().get("cookie3"), null); + assertEquals(action.getCookie1(), "cookie1value"); + assertEquals(action.getCookie2(), null); + assertEquals(action.getCookie3(), null); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie1"), "cookie1value"); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie2"), null); + assertEquals(ActionContext.getContext().getValueStack().findValue("cookie3"), null); + } + + + public static class MockActionWithCookieAware extends ActionSupport implements CookiesAware { + + private static final long serialVersionUID = -6202290616812813386L; + + private Map cookies = Collections.EMPTY_MAP; + private String cookie1; + private String cookie2; + private String cookie3; + + public void setCookiesMap(Map cookies) { + this.cookies = cookies; + } + public Map getCookiesMap() { + return this.cookies; + } + + public String getCookie1() { return cookie1; } + public void setCookie1(String cookie1) { this.cookie1 = cookie1; } + + public String getCookie2() { return cookie2; } + public void setCookie2(String cookie2) { this.cookie2 = cookie2; } + + public String getCookie3() { return cookie3; } + public void setCookie3(String cookie3) { this.cookie3 = cookie3; } + } + +}