Spaces in Path breaks LoadFromRelativeFile
------------------------------------------

                 Key: JBEHAVE-389
                 URL: http://jira.codehaus.org/browse/JBEHAVE-389
             Project: JBehave
          Issue Type: Bug
          Components: Core
    Affects Versions: 3.0.3
         Environment: Redhat Linux 5.5
            Reporter: Leif Carlsen
            Priority: Minor


LoadFromRelativeFile function loadStoryAsTextfails to unescape URLs passed into 
the constructor that have escaped characters like %20 for a space.  As a 
result, the story files cannot be found.

Test case snippet follows... add it to StoryLoaderBehaviour.java.  Also need to 
add folder "foldername has spaces" to 
jbehave-core/src/test/java/org/jbehave/core/io/stories/ and copy 
MyPendingStory.txt into it.  Also including revised code snippet for 
loadStoryAsText function.  I didn't immediately see a way to do it without 
either checked exceptions or deprecated functions (ex 
UrlDecoder.decode(string)).  Not sure if InvalidStoryResource was the right 
exception to convert to.

{code:title=StoryLoaderBehaviour.java}
    @Test
    public void shouldLoadStoryFromRelativeFilePathsWithSpace() throws 
MalformedURLException, URISyntaxException {
        // Given
        String storyPath = "MyPendingStory.txt";
        String storyAsText = "Given my step";
        java.net.URL url = 
CodeLocations.codeLocationFromClass(MyPendingStory.class);
        java.io.File folderWithSpacesInName = new 
java.io.File(url.toURI().getPath() + "/org/jbehave/core/io/stories/foldername 
has spaces");
        java.net.URL urlThatHasEscapedSpaces = 
folderWithSpacesInName.toURI().toURL();
        assertThat(folderWithSpacesInName.exists(), is(true));

        // When
        StoryLoader loader = new LoadFromRelativeFile(urlThatHasEscapedSpaces);

        // Then
        assertThat(loader.loadStoryAsText(storyPath), equalTo(storyAsText));
    }
{code}

{code:title=LoadFromRelativeFile.java}
    public String loadStoryAsText(String storyPath) {
        List<String> traversalPaths = new ArrayList<String>();
        String locationPath;
                try {
                        locationPath = new 
File(URLDecoder.decode(location.getFile(),"UTF-8")).getAbsolutePath();
                } catch (UnsupportedEncodingException e) {
                        throw new InvalidStoryResource(storyPath, e);
                }
        for (StoryFilePath traversal : traversals) {
            String filePath = locationPath.replace(traversal.toRemove, 
traversal.relativePath) + "/" + storyPath;
            File file = new File(filePath);
            if (file.exists()) {
                return loadContent(filePath);
            } else {
                traversalPaths.add(filePath);
            }
        }
        throw new StoryResourceNotFound(storyPath, traversalPaths);
    }
{code}

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to