| /* |
| * 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.views.jsp; |
| |
| import java.io.StringWriter; |
| import java.util.Map; |
| import java.util.List; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.text.MessageFormat; |
| |
| import javax.servlet.jsp.JspException; |
| import javax.servlet.jsp.JspWriter; |
| |
| import org.apache.struts2.views.jsp.ui.AnchorTag; |
| import org.apache.struts2.views.jsp.ui.StrutsBodyContent; |
| import org.apache.struts2.components.URL; |
| import org.apache.struts2.components.Anchor; |
| |
| |
| /** |
| * |
| */ |
| public class AnchorTagTest extends AbstractUITagTest { |
| private StringWriter writer = new StringWriter(); |
| private AnchorTag tag; |
| |
| public void testActionURL() { |
| tag.setHref("TestAction.action"); |
| try { |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertTrue(writer.toString().indexOf("href=\"TestAction.action\"") > -1); |
| } catch (JspException ex) { |
| ex.printStackTrace(); |
| fail(); |
| } |
| } |
| |
| public void testAddParameters() { |
| tag.setHref("/TestAction.action"); |
| String bodyText = "<img src=\"#\"/>"; |
| try { |
| StrutsBodyContent bodyContent = new StrutsBodyContent(null); |
| bodyContent.print(bodyText); |
| tag.setBodyContent(bodyContent); |
| |
| tag.doStartTag(); |
| tag.doEndTag(); |
| } catch (Exception ex) { |
| ex.printStackTrace(); |
| fail(); |
| } |
| } |
| |
| /** |
| * To test priority of parameter passed in to url component though |
| * various way |
| * - current request url |
| * - tag's value attribute |
| * - tag's nested param tag |
| * <br> |
| * id1 |
| * === |
| * - found in current request url |
| * - found in tag's value attribute |
| * - found in tag's param tag |
| * CONCLUSION: tag's param tag takes precedence (paramId1) |
| * <br> |
| * id2 |
| * === |
| * - found in current request url |
| * - found in tag's value attribute |
| * CONCLUSION: tag's value attribute take precedence (tagId2) |
| * <br> |
| * urlParam1 |
| * ========= |
| * - found in current request url |
| * CONCLUSION: param in current request url will be used (urlValue1) |
| * <br> |
| * urlParam2 |
| * ========= |
| * - found in current request url |
| * CONCLUSION: param in current request url will be used. (urlValue2) |
| * <br> |
| * tagId |
| * ===== |
| * - found in tag's value attribute |
| * CONCLUSION: param in tag's value attribute wil; be used. (tagValue) |
| * <br> |
| * param1 |
| * ====== |
| * - found in nested param tag |
| * CONCLUSION: param in nested param tag will be used. (param1value) |
| * <br> |
| * param2 |
| * ====== |
| * - found in nested param tag |
| * CONCLUSION: param in nested param tag will be used. (param2value) |
| */ |
| public void testParametersPriority() throws Exception { |
| request.setQueryString("id1=urlId1&id2=urlId2&urlParam1=urlValue1&urlParam2=urlValue2"); |
| |
| tag.setValue("testAction.action?id1=tagId1&id2=tagId2&tagId=tagValue"); |
| |
| ParamTag param1 = new ParamTag(); |
| param1.setPageContext(pageContext); |
| param1.setName("param1"); |
| param1.setValue("%{'param1value'}"); |
| |
| ParamTag param2 = new ParamTag(); |
| param2.setPageContext(pageContext); |
| param2.setName("param2"); |
| param2.setValue("%{'param2value'}"); |
| |
| ParamTag param3 = new ParamTag(); |
| param3.setPageContext(pageContext); |
| param3.setName("id1"); |
| param3.setValue("%{'paramId1'}"); |
| |
| |
| tag.doStartTag(); |
| param1.doStartTag(); |
| param1.doEndTag(); |
| param2.doStartTag(); |
| param2.doEndTag(); |
| param3.doStartTag(); |
| param3.doEndTag(); |
| |
| tag.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("testAction.action?id1=paramId1&id2=tagId2&" + |
| "amp;tagId=tagValue&urlParam1=urlValue1&urlParam2=urlValue2&param1=param1value&param2=param2value"), writer.toString()); |
| } |
| |
| /** |
| * Use Iterable values as the value of the param tags |
| * |
| * @throws Exception |
| */ |
| public void testIterableParameters() throws Exception { |
| tag.setValue("/TestAction.action?p0=z"); |
| |
| tag.doStartTag(); |
| //Iterable |
| List<URLTagTest.ValueHolder> list = new ArrayList<URLTagTest.ValueHolder>(); |
| list.add(new URLTagTest.ValueHolder("a")); |
| list.add(new URLTagTest.ValueHolder("b")); |
| stack.getContext().put("param1value", list); |
| |
| ParamTag param1 = new ParamTag(); |
| param1.setPageContext(pageContext); |
| param1.setName("p1"); |
| param1.setValue("%{#param1value}"); |
| param1.doStartTag(); |
| param1.doEndTag(); |
| |
| |
| //String[] |
| stack.getContext().put("param2value", new String[]{"d", "e"}); |
| ParamTag param2 = new ParamTag(); |
| param2.setPageContext(pageContext); |
| param2.setName("p2"); |
| param2.setValue("%{#param2value}"); |
| param2.doStartTag(); |
| param2.doEndTag(); |
| |
| |
| //ValueHolder[] |
| stack.getContext().put("param3value", new URLTagTest.ValueHolder[]{ |
| new URLTagTest.ValueHolder("f"), new URLTagTest.ValueHolder("g")}); |
| ParamTag param3 = new ParamTag(); |
| param3.setPageContext(pageContext); |
| param3.setName("p3"); |
| param3.setValue("%{#param3value}"); |
| param3.doStartTag(); |
| param3.doEndTag(); |
| |
| tag.doEndTag(); |
| |
| String result = writer.toString(); |
| assertTrue(result.contains("p1=a")); |
| assertTrue(result.contains("p1=b")); |
| assertTrue(result.contains("p2=d")); |
| assertTrue(result.contains("p2=e")); |
| assertTrue(result.contains("p3=f")); |
| assertTrue(result.contains("p3=g")); |
| assertTrue(result.contains("p0=z")); |
| } |
| |
| /** |
| * <p> |
| * To test priority of parameter passed in to url component though |
| * various way, with includeParams="NONE" |
| * </p> |
| * |
| * - current request url<br> |
| * - tag's value attribute<br> |
| * - tag's nested param tag<br> |
| * |
| * <p> |
| * In this case only parameters from the tag itself is taken into account. |
| * Those from request will not count, only those in tag's value attribute |
| * and nested param tag. |
| * </p> |
| * @throws Exception |
| */ |
| public void testParametersPriorityWithIncludeParamsAsNONE() throws Exception { |
| request.setQueryString("id1=urlId1&id2=urlId2&urlParam1=urlValue1&urlParam2=urlValue2"); |
| |
| tag.setValue("testAction.action?id1=tagId1&id2=tagId2&tagId=tagValue"); |
| tag.setIncludeParams("NONE"); |
| |
| ParamTag param1 = new ParamTag(); |
| param1.setPageContext(pageContext); |
| param1.setName("param1"); |
| param1.setValue("%{'param1value'}"); |
| |
| ParamTag param2 = new ParamTag(); |
| param2.setPageContext(pageContext); |
| param2.setName("param2"); |
| param2.setValue("%{'param2value'}"); |
| |
| ParamTag param3 = new ParamTag(); |
| param3.setPageContext(pageContext); |
| param3.setName("id1"); |
| param3.setValue("%{'paramId1'}"); |
| |
| |
| tag.doStartTag(); |
| param1.doStartTag(); |
| param1.doEndTag(); |
| param2.doStartTag(); |
| param2.doEndTag(); |
| param3.doStartTag(); |
| param3.doEndTag(); |
| tag.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("testAction.action?id1=paramId1&id2=tagId2&tagId=tagValue&param1=param1value&param2=param2value"), writer.toString()); |
| } |
| |
| public void testIncludeParamsDefaultToGET() throws Exception { |
| request.setQueryString("one=oneVal&two=twoVal&three=threeVal"); |
| |
| // request parameter map should not have any effect, as includeParams |
| // default to GET, which get its param from request.getQueryString() |
| Map tmp = new HashMap(); |
| tmp.put("one", "aaa"); |
| tmp.put("two", "bbb"); |
| tmp.put("three", "ccc"); |
| request.setParameterMap(tmp); |
| |
| tag.setValue("TestAction.acton"); |
| |
| tag.doStartTag(); |
| tag.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("TestAction.acton?one=oneVal&two=twoVal&three=threeVal"), writer.toString()); |
| } |
| |
| public void testActionURL2() throws Exception { |
| tag.setValue("TestAction.action"); |
| |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(wrapWithAnchor("TestAction.action"), writer.toString()); |
| } |
| |
| public void testAddParameters2() throws Exception { |
| request.setAttribute("struts.request_uri", "/TestAction.action"); |
| request.setQueryString("param0=value0"); |
| |
| tag.doStartTag(); |
| ParamTag param1 = new ParamTag(); |
| param1.setPageContext(pageContext); |
| param1.setName("param1"); |
| param1.setValue("%{'value1'}"); |
| param1.doStartTag(); |
| param1.doEndTag(); |
| |
| ParamTag param2 = new ParamTag(); |
| param2.setPageContext(pageContext); |
| param2.setName("param2"); |
| param2.setValue("%{'value2'}"); |
| param2.doStartTag(); |
| param2.doEndTag(); |
| |
| tag.doEndTag(); |
| String result = writer.toString(); |
| assertTrue(result.contains("param0=value0")); |
| assertTrue(result.contains("param1=value1")); |
| assertTrue(result.contains("param2=value2")); |
| assertTrue(result.contains("/TestAction.action")); |
| } |
| |
| public void testEvaluateValue() throws Exception { |
| URLTagTest.Foo foo = new URLTagTest.Foo(); |
| foo.setTitle("test"); |
| stack.push(foo); |
| tag.setValue("%{title}"); |
| |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(wrapWithAnchor("test"), writer.toString()); |
| } |
| |
| public void testHttps() throws Exception { |
| request.setScheme("https"); |
| request.setServerName("localhost"); |
| request.setServerPort(443); |
| |
| tag.setValue("list-members.action"); |
| |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(wrapWithAnchor("list-members.action"), writer.toString()); |
| } |
| |
| public void testAnchor() throws Exception { |
| request.setScheme("https"); |
| request.setServerName("localhost"); |
| request.setServerPort(443); |
| |
| tag.setValue("list-members.action"); |
| tag.setAnchor("test"); |
| |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(wrapWithAnchor("list-members.action#test"), writer.toString()); |
| } |
| |
| public void testParamPrecedence() throws Exception { |
| request.setRequestURI("/context/someAction.action"); |
| request.setQueryString("id=22&name=John"); |
| |
| AnchorTag anchor = new AnchorTag(); |
| anchor.setPageContext(pageContext); |
| anchor.setIncludeParams("get"); |
| anchor.setEncode("%{false}"); |
| |
| ParamTag paramTag = new ParamTag(); |
| paramTag.setPageContext(pageContext); |
| paramTag.setName("id"); |
| paramTag.setValue("%{'33'}"); |
| |
| anchor.doStartTag(); |
| paramTag.doStartTag(); |
| paramTag.doEndTag(); |
| anchor.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("/context/someAction.action?id=33&name=John"), writer.getBuffer().toString()); |
| } |
| |
| public void testParamPrecedenceWithAnchor() throws Exception { |
| request.setRequestURI("/context/someAction.action"); |
| request.setQueryString("id=22&name=John"); |
| |
| AnchorTag anchorTag = new AnchorTag(); |
| anchorTag.setPageContext(pageContext); |
| anchorTag.setIncludeParams("get"); |
| anchorTag.setEncode("%{false}"); |
| anchorTag.setAnchor("testAnchor"); |
| |
| ParamTag paramTag = new ParamTag(); |
| paramTag.setPageContext(pageContext); |
| paramTag.setName("id"); |
| paramTag.setValue("%{'33'}"); |
| |
| anchorTag.doStartTag(); |
| paramTag.doStartTag(); |
| paramTag.doEndTag(); |
| anchorTag.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("/context/someAction.action?id=33&name=John#testAnchor"), writer.getBuffer().toString()); |
| } |
| |
| |
| public void testUsingValueOnly() throws Exception { |
| tag.setValue("/public/about/team.jsp"); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(wrapWithAnchor("/public/about/team.jsp"), writer.toString()); |
| } |
| |
| public void testRequestURIActionIncludeNone() throws Exception { |
| request.setRequestURI("/public/about"); |
| request.setQueryString("section=team&company=acme inc"); |
| |
| tag.setAction("team"); |
| tag.setIncludeParams("none"); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("/team.action"), writer.toString()); |
| } |
| |
| public void testRequestURIActionIncludeGet() throws Exception { |
| request.setRequestURI("/public/about"); |
| request.setQueryString("section=team&company=acme inc"); |
| |
| tag.setAction("team"); |
| tag.setIncludeParams("get"); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("/team.action?section=team&company=acme+inc"), writer.toString()); |
| } |
| |
| public void testRequestURIActionIncludeGetDoNotEscapeAmp() throws Exception { |
| request.setRequestURI("/public/about"); |
| request.setQueryString("section=team&company=acme inc"); |
| |
| tag.setAction("team"); |
| tag.setIncludeParams("get"); |
| tag.setEscapeAmp("false"); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("/team.action?section=team&company=acme+inc"), writer.toString()); |
| } |
| |
| public void testRequestURINoActionIncludeNone() throws Exception { |
| request.setRequestURI("/public/about"); |
| request.setQueryString("section=team&company=acme inc"); |
| |
| tag.setAction(null); |
| tag.setIncludeParams("none"); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("/public/about"), writer.toString()); |
| } |
| |
| public void testNoActionIncludeGet() throws Exception { |
| request.setRequestURI("/public/about"); |
| request.setQueryString("section=team&company=acme inc"); |
| |
| tag.setAction(null); |
| tag.setIncludeParams("get"); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("/public/about?section=team&company=acme+inc"), writer.toString()); |
| } |
| |
| public void testRequestURIActionIncludeAll() throws Exception { |
| request.setRequestURI("/public/about"); |
| request.setQueryString("section=team&company=acme inc"); |
| |
| tag.setAction("team"); |
| tag.setIncludeParams("all"); |
| |
| tag.doStartTag(); |
| |
| // include nested param tag |
| ParamTag paramTag = new ParamTag(); |
| paramTag.setPageContext(pageContext); |
| paramTag.setName("year"); |
| paramTag.setValue("2006"); |
| paramTag.doStartTag(); |
| paramTag.doEndTag(); |
| |
| tag.doEndTag(); |
| |
| String result = writer.toString(); |
| assertTrue(result.contains("/team.action?")); |
| assertTrue(result.contains("section=team")); |
| assertTrue(result.contains("company=acme+inc")); |
| assertTrue(result.contains("year=2006")); |
| } |
| |
| public void testRequestURINoActionIncludeAll() throws Exception { |
| request.setRequestURI("/public/about"); |
| request.setQueryString("section=team&company=acme inc"); |
| |
| tag.setAction(null); |
| tag.setIncludeParams("all"); |
| |
| tag.doStartTag(); |
| |
| // include nested param tag |
| ParamTag paramTag = new ParamTag(); |
| paramTag.setPageContext(pageContext); |
| paramTag.setName("year"); |
| paramTag.setValue("2006"); |
| paramTag.doStartTag(); |
| paramTag.doEndTag(); |
| |
| tag.doEndTag(); |
| |
| String result = writer.toString(); |
| assertTrue(result.contains("/public/about?")); |
| assertTrue(result.contains("section=team")); |
| assertTrue(result.contains("company=acme+inc")); |
| assertTrue(result.contains("year=2006")); |
| } |
| |
| public void testUnknownIncludeParam() throws Exception { |
| request.setRequestURI("/public/about"); |
| request.setQueryString("section=team"); |
| |
| tag.setIncludeParams("unknown"); // will log at WARN level |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(wrapWithAnchor("/public/about"), writer.toString()); // should not add any request parameters |
| } |
| |
| public void testRequestURIWithAnchor() throws Exception { |
| request.setRequestURI("/public/about"); |
| request.setQueryString("company=acme inc#canada"); |
| |
| tag.setAction("company"); |
| tag.setIncludeParams("get"); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("/company.action?company=acme+inc"), writer.toString()); // will always chop anchor if using requestURI |
| } |
| |
| public void testIncludeContext() throws Exception { |
| request.setupGetContext("/myapp"); |
| |
| tag.setIncludeContext("true"); |
| tag.setAction("company"); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("/myapp/company.action"), writer.toString()); |
| } |
| |
| public void testForceAddSchemeHostAndPort() throws Exception { |
| tag.setForceAddSchemeHostAndPort("true"); |
| tag.setAction("company"); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| |
| assertEquals(wrapWithAnchor("http://localhost/company.action"), writer.toString()); |
| } |
| |
| private String wrapWithAnchor(String href) { |
| return MessageFormat.format("<a href=\"{0}\"></a>", href); |
| } |
| |
| protected void setUp() throws Exception { |
| super.setUp(); |
| |
| request.setScheme("http"); |
| request.setServerName("localhost"); |
| request.setServerPort(80); |
| |
| tag = new AnchorTag(); |
| tag.setPageContext(pageContext); |
| JspWriter jspWriter = new StrutsMockJspWriter(writer); |
| pageContext.setJspWriter(jspWriter); |
| } |
| |
| } |