You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "adam brin (JIRA)" <ji...@apache.org> on 2011/07/31 01:36:09 UTC

[jira] [Created] (WW-3666) TypeConverter should trim before conversion to things that are not Strings

TypeConverter should trim before conversion to things that are not Strings
--------------------------------------------------------------------------

                 Key: WW-3666
                 URL: https://issues.apache.org/jira/browse/WW-3666
             Project: Struts 2
          Issue Type: Improvement
          Components: Value Stack
    Affects Versions: 2.2.1.1
         Environment: Standard Struts2 implementation with Jetty
            Reporter: adam brin
            Priority: Minor


For a simple struts2 application, when you pass in parameters that are not "Strings" for example Longs or Enums the Xwork2 TypeConverter (and Struts2's handling) needs some work.

Issues:
* numeric values are not properly parsed if they have space characters
* enum values are not properly parsed if they have space characters
* ideally some exception would bubble back up in the form of an ActionError

Attached (in comments) is a simple controller and test case using HTMLUnit to demonstrate the issue.  Even with the following logger settings, no errors are visible:

{noformat}log4j.logger.org.apache.struts2=TRACE
log4j.logger.com.opensymphony.xwork2=TRACE
{noformat} 

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

[jira] [Issue Comment Edited] (WW-3666) TypeConverter should trim before conversion to things that are not Strings

Posted by "adam brin (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WW-3666?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13073263#comment-13073263 ] 

adam brin edited comment on WW-3666 at 7/30/11 11:38 PM:
---------------------------------------------------------

{code:title=TestController.java|borderStyle=solid}

package org.struts.action;

import java.io.InputStream;

import org.apache.commons.io.IOUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.opensymphony.xwork2.ActionSupport;

@Namespace("/test")
@ParentPackage("default")
public class TestController extends ActionSupport {

    private static final long serialVersionUID = -2908013994005132461L;

    protected final transient Logger logger = LoggerFactory.getLogger(getClass());
    private String testString;
    private Long testLong;

    private enum TestEnum {
        ONE, TWO, THREE
    }

    private TestEnum testEnum;
    private InputStream inputStream;

    @Action(value = "whatever", results = {
            @Result(name = SUCCESS, params = {
                    "contentType", "text/html",
                    "inputName", "inputStream",
            },type="stream"),
            @Result(name = INPUT, params = {
                    "contentType", "text/html",
                    "inputName", "inputStream",
            },type="stream")

    })
    public String whatever() {
        String result = testString + "|" + testLong + "|" + testEnum;
        logger.info("TestString:" + testString);
        logger.info("TestLong:" + testLong);
        logger.info("TestEnum:" + testEnum);
        setInputStream(IOUtils.toInputStream(result));
        return SUCCESS;
    }

    public String getTestString() {
        return testString;
    }

    public void setTestString(String testString) {
        this.testString = testString;
    }

    public Long getTestLong() {
        return testLong;
    }

    public void setTestLong(Long sampleLong) {
        this.testLong = sampleLong;
    }

    public TestEnum getTestEnum() {
        return testEnum;
    }

    public void setTestEnum(TestEnum testEnum) {
        this.testEnum = testEnum;
    }

    public InputStream getInputStream() {
        return inputStream;
    }

    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }

}
{code}



{code:title=HTMLUnitTestControllerParsingTest.java|borderStyle=solid}
package org.struts.web;

import java.io.IOException;
import java.net.MalformedURLException;

import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.WebClient;

/**
 * @author Adam Brin
 * 
 */
public class HTMLUnitTestControllerParsingTest {

    final Logger logger = LoggerFactory.getLogger(HTMLUnitTestControllerParsingTest.class);

    final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);

    @Test
    public void testExactCase() throws FailingHttpStatusCodeException, MalformedURLException, IOException {
        Page page = webClient.getPage("http://localhost:8080/test/whatever?testLong=1234&testString=abcd&testEnum=THREE");
        String content = page.getWebResponse().getContentAsString();
        logger.info("Results:"+ content);
        Assert.assertTrue("content should contain 1234",content.contains("1234"));
        Assert.assertTrue("content should contain ONE",content.contains("THREE"));
        Assert.assertTrue("content should contain abcd",content.contains("abcd"));
    }

    @Test
    public void testLongWithSpace() throws FailingHttpStatusCodeException, MalformedURLException, IOException {
        Page page = webClient.getPage("http://localhost:8080/test/whatever?testLong=1234%20&testString=abcd&testEnum=THREE");
        String content = page.getWebResponse().getContentAsString();
        logger.info("Results:"+ content);
        Assert.assertTrue("content should contain 1234",content.contains("1234"));
        Assert.assertTrue("content should contain ONE",content.contains("THREE"));
        Assert.assertTrue("content should contain abcd",content.contains("abcd"));
    }

    @Test
    public void testEnumWithSpace() throws FailingHttpStatusCodeException, MalformedURLException, IOException {
        Page page = webClient.getPage("http://localhost:8080/test/whatever?testLong=1234&testString=abcd&testEnum=%20THREE%20");
        String content = page.getWebResponse().getContentAsString();
        logger.info("Results:"+ content);
        Assert.assertTrue("content should contain 1234",content.contains("1234"));
        Assert.assertTrue("content should contain ONE",content.contains("THREE"));
        Assert.assertTrue("content should contain abcd",content.contains("abcd"));
    }
}

{code}

      was (Author: abrin):
    /*
 * TEST CONTROLLER
 */


package org.struts.action;

import java.io.InputStream;

import org.apache.commons.io.IOUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.opensymphony.xwork2.ActionSupport;

@Namespace("/test")
@ParentPackage("default")
public class TestController extends ActionSupport {

    private static final long serialVersionUID = -2908013994005132461L;

    protected final transient Logger logger = LoggerFactory.getLogger(getClass());
    private String testString;
    private Long testLong;

    private enum TestEnum {
        ONE, TWO, THREE
    }

    private TestEnum testEnum;
    private InputStream inputStream;

    @Action(value = "whatever", results = {
            @Result(name = SUCCESS, params = {
                    "contentType", "text/html",
                    "inputName", "inputStream",
            },type="stream"),
            @Result(name = INPUT, params = {
                    "contentType", "text/html",
                    "inputName", "inputStream",
            },type="stream")

    })
    public String whatever() {
        String result = testString + "|" + testLong + "|" + testEnum;
        logger.info("TestString:" + testString);
        logger.info("TestLong:" + testLong);
        logger.info("TestEnum:" + testEnum);
        setInputStream(IOUtils.toInputStream(result));
        return SUCCESS;
    }

    public String getTestString() {
        return testString;
    }

    public void setTestString(String testString) {
        this.testString = testString;
    }

    public Long getTestLong() {
        return testLong;
    }

    public void setTestLong(Long sampleLong) {
        this.testLong = sampleLong;
    }

    public TestEnum getTestEnum() {
        return testEnum;
    }

    public void setTestEnum(TestEnum testEnum) {
        this.testEnum = testEnum;
    }

    public InputStream getInputStream() {
        return inputStream;
    }

    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }

}

  
> TypeConverter should trim before conversion to things that are not Strings
> --------------------------------------------------------------------------
>
>                 Key: WW-3666
>                 URL: https://issues.apache.org/jira/browse/WW-3666
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Value Stack
>    Affects Versions: 2.2.1.1
>         Environment: Standard Struts2 implementation with Jetty
>            Reporter: adam brin
>            Priority: Minor
>
> For a simple struts2 application, when you pass in parameters that are not "Strings" for example Longs or Enums the Xwork2 TypeConverter (and Struts2's handling) needs some work.
> Issues:
> * numeric values are not properly parsed if they have space characters
> * enum values are not properly parsed if they have space characters
> * ideally some exception would bubble back up in the form of an ActionError
> Attached (in comments) is a simple controller and test case using HTMLUnit to demonstrate the issue.  Even with the following logger settings, no errors are visible:
> {noformat}log4j.logger.org.apache.struts2=TRACE
> log4j.logger.com.opensymphony.xwork2=TRACE
> {noformat} 

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

[jira] [Updated] (WW-3666) TypeConverter should trim before conversion to things that are not Strings

Posted by "Lukasz Lenart (Updated) (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WW-3666?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Lukasz Lenart updated WW-3666:
------------------------------

    Fix Version/s: 3.x
    
> TypeConverter should trim before conversion to things that are not Strings
> --------------------------------------------------------------------------
>
>                 Key: WW-3666
>                 URL: https://issues.apache.org/jira/browse/WW-3666
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Value Stack
>    Affects Versions: 2.2.1.1
>         Environment: Standard Struts2 implementation with Jetty
>            Reporter: adam brin
>            Priority: Minor
>             Fix For: 3.x
>
>
> For a simple struts2 application, when you pass in parameters that are not "Strings" for example Longs or Enums the Xwork2 TypeConverter (and Struts2's handling) needs some work.
> Issues:
> * numeric values are not properly parsed if they have space characters
> * enum values are not properly parsed if they have space characters
> * ideally some exception would bubble back up in the form of an ActionError
> Attached (in comments) is a simple controller and test case using HTMLUnit to demonstrate the issue.  Even with the following logger settings, no errors are visible:
> {noformat}log4j.logger.org.apache.struts2=TRACE
> log4j.logger.com.opensymphony.xwork2=TRACE
> {noformat} 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

[jira] [Commented] (WW-3666) TypeConverter should trim before conversion to things that are not Strings

Posted by "adam brin (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WW-3666?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13073263#comment-13073263 ] 

adam brin commented on WW-3666:
-------------------------------

/*
 * TEST CONTROLLER
 */


package org.struts.action;

import java.io.InputStream;

import org.apache.commons.io.IOUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.opensymphony.xwork2.ActionSupport;

@Namespace("/test")
@ParentPackage("default")
public class TestController extends ActionSupport {

    private static final long serialVersionUID = -2908013994005132461L;

    protected final transient Logger logger = LoggerFactory.getLogger(getClass());
    private String testString;
    private Long testLong;

    private enum TestEnum {
        ONE, TWO, THREE
    }

    private TestEnum testEnum;
    private InputStream inputStream;

    @Action(value = "whatever", results = {
            @Result(name = SUCCESS, params = {
                    "contentType", "text/html",
                    "inputName", "inputStream",
            },type="stream"),
            @Result(name = INPUT, params = {
                    "contentType", "text/html",
                    "inputName", "inputStream",
            },type="stream")

    })
    public String whatever() {
        String result = testString + "|" + testLong + "|" + testEnum;
        logger.info("TestString:" + testString);
        logger.info("TestLong:" + testLong);
        logger.info("TestEnum:" + testEnum);
        setInputStream(IOUtils.toInputStream(result));
        return SUCCESS;
    }

    public String getTestString() {
        return testString;
    }

    public void setTestString(String testString) {
        this.testString = testString;
    }

    public Long getTestLong() {
        return testLong;
    }

    public void setTestLong(Long sampleLong) {
        this.testLong = sampleLong;
    }

    public TestEnum getTestEnum() {
        return testEnum;
    }

    public void setTestEnum(TestEnum testEnum) {
        this.testEnum = testEnum;
    }

    public InputStream getInputStream() {
        return inputStream;
    }

    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }

}


> TypeConverter should trim before conversion to things that are not Strings
> --------------------------------------------------------------------------
>
>                 Key: WW-3666
>                 URL: https://issues.apache.org/jira/browse/WW-3666
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Value Stack
>    Affects Versions: 2.2.1.1
>         Environment: Standard Struts2 implementation with Jetty
>            Reporter: adam brin
>            Priority: Minor
>
> For a simple struts2 application, when you pass in parameters that are not "Strings" for example Longs or Enums the Xwork2 TypeConverter (and Struts2's handling) needs some work.
> Issues:
> * numeric values are not properly parsed if they have space characters
> * enum values are not properly parsed if they have space characters
> * ideally some exception would bubble back up in the form of an ActionError
> Attached (in comments) is a simple controller and test case using HTMLUnit to demonstrate the issue.  Even with the following logger settings, no errors are visible:
> {noformat}log4j.logger.org.apache.struts2=TRACE
> log4j.logger.com.opensymphony.xwork2=TRACE
> {noformat} 

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira