- Revision
- 1349
- Author
- mauro
- Date
- 2009-10-17 10:56:09 -0500 (Sat, 17 Oct 2009)
Log Message
JBEHAVE-191/2: Made file content view togglable between relative and full paths. Ensure non-valid URL path characters are escaped.
Modified Paths
- trunk/web/examples/trader-web/src/main/java/org/jbehave/web/examples/trader/runner/TraderRegistrar.java
- trunk/web/web-io/src/main/java/org/jbehave/web/io/ArchivingFileManager.java
- trunk/web/web-io/src/main/java/org/jbehave/web/io/FileManager.java
- trunk/web/web-runner/src/main/java/org/jbehave/web/runner/waffle/controllers/FilesController.java
- trunk/web/web-runner/src/main/java/org/jbehave/web/runner/waffle/controllers/StepdocContext.java
- trunk/web/web-runner/src/main/webapp/ftl/data/files.ftl
- trunk/web/web-runner/src/main/webapp/ftl/data/upload.ftl
- trunk/web/web-runner/src/main/webapp/ftl/paths.ftl
- trunk/web/web-runner/src/test/java/org/jbehave/web/runner/waffle/controllers/FilesControllerTest.java
Added Paths
Diff
Modified: trunk/web/examples/trader-web/src/main/java/org/jbehave/web/examples/trader/runner/TraderRegistrar.java (1348 => 1349)
--- trunk/web/examples/trader-web/src/main/java/org/jbehave/web/examples/trader/runner/TraderRegistrar.java 2009-10-17 11:10:20 UTC (rev 1348) +++ trunk/web/examples/trader-web/src/main/java/org/jbehave/web/examples/trader/runner/TraderRegistrar.java 2009-10-17 15:56:09 UTC (rev 1349) @@ -20,6 +20,7 @@ } protected File uploadDirectory() { - return new File("/tmp/upload"); + // Can be overridden to return, e.g. new File("/tmp/upload"); + return super.uploadDirectory(); } }
Modified: trunk/web/web-io/src/main/java/org/jbehave/web/io/ArchivingFileManager.java (1348 => 1349)
--- trunk/web/web-io/src/main/java/org/jbehave/web/io/ArchivingFileManager.java 2009-10-17 11:10:20 UTC (rev 1348) +++ trunk/web/web-io/src/main/java/org/jbehave/web/io/ArchivingFileManager.java 2009-10-17 15:56:09 UTC (rev 1349) @@ -25,10 +25,10 @@ } public List<File> list() { - return asList(uploadDirectory().listFiles(new FileFilter(){ + return asList(uploadDirectory().listFiles(new FileFilter() { public boolean accept(File file) { return !file.isDirectory(); - } + } })); } @@ -37,15 +37,17 @@ return uploadDirectory; } - public List<File> listContent(String path){ + public List<File> listContent(String path, boolean relativePaths) { File directory = archiver.directoryOf(new File(path)); List<File> content = new ArrayList<File>(); - for ( File file : archiver.listContent(directory) ){ - content.add(archiver.relativeTo(file, directory)); - } + for (File file : archiver.listContent(directory)) { + File contentFile = (relativePaths ? archiver.relativeTo(file, + directory) : file); + content.add(contentFile); + } return content; } - + public void delete(List<String> paths) { for (String path : paths) { deleteFile(new File(path)); @@ -59,13 +61,13 @@ deleteFile(new File(file, child)); } } - if ( archiver.isArchive(file) ){ + if (archiver.isArchive(file)) { // delete the unarchived directory too deleteFile(archiver.directoryOf(file)); } file.delete(); } - + public List<File> upload(List<FileItem> fileItems, List<String> errors) { List<File> files = new ArrayList<File>(); File directory = uploadDirectory(); @@ -78,7 +80,7 @@ archiver.unarchive(file, directory); } catch (FileUnarchiveFailedException e) { errors.add(e.getMessage()); - if ( e.getCause() != null ){ + if (e.getCause() != null) { errors.add(e.getCause().getMessage()); } } @@ -87,7 +89,7 @@ // ignore and carry on } catch (FileWriteFailedException e) { errors.add(e.getMessage()); - if ( e.getCause() != null ){ + if (e.getCause() != null) { errors.add(e.getCause().getMessage()); } } @@ -95,7 +97,6 @@ return files; } - private File writeItemToFile(File directory, FileItem item) { if (isBlank(item.getName())) { throw new FileItemNameMissingException(item);
Modified: trunk/web/web-io/src/main/java/org/jbehave/web/io/FileManager.java (1348 => 1349)
--- trunk/web/web-io/src/main/java/org/jbehave/web/io/FileManager.java 2009-10-17 11:10:20 UTC (rev 1348) +++ trunk/web/web-io/src/main/java/org/jbehave/web/io/FileManager.java 2009-10-17 15:56:09 UTC (rev 1349) @@ -9,14 +9,19 @@ import org.apache.commons.fileupload.FileItem; /** - * Allow to list, delete and upload data files. + * Manages data files, allowing the upload, list and delete. If a file is any + * archive, the contents is unarchived to the directory with the corresponding + * name af the archive (e.g. for archive path "/path/to/archive.zip", the output + * directory path will be "/path/to/archive". The manager also allows to list + * the content of a uploaded and unarchived file paths, e.g. the content of + * "/path/to/archive". */ public interface FileManager { List<File> list(); - - List<File> listContent(String path); + List<File> listContent(String path, boolean relativePaths); + void delete(List<String> paths); List<File> upload(List<FileItem> fileItems, List<String> errors);
Added: trunk/web/web-runner/src/main/java/org/jbehave/web/runner/waffle/controllers/FilesContext.java (0 => 1349)
--- trunk/web/web-runner/src/main/java/org/jbehave/web/runner/waffle/controllers/FilesContext.java (rev 0) +++ trunk/web/web-runner/src/main/java/org/jbehave/web/runner/waffle/controllers/FilesContext.java 2009-10-17 15:56:09 UTC (rev 1349) @@ -0,0 +1,68 @@ +package org.jbehave.web.runner.waffle.controllers; + +import static java.util.Arrays.asList; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.builder.ToStringBuilder; + +public class FilesContext { + + public enum View { + RELATIVE_PATH, FULL_PATH + } + + private List<File> files = new ArrayList<File>(); + private List<String> selectedPaths = new ArrayList<String>(); + private Map<String, List<File>> contentFiles = new HashMap<String, List<File>>(); + private View view = View.RELATIVE_PATH; + + public FilesContext() { + } + + public List<File> getFiles() { + return files; + } + + public void setFiles(List<File> files) { + this.files = files; + } + + public List<String> getSelectedPaths() { + return selectedPaths; + } + + public void setSelectedPaths(List<String> selectedPaths) { + this.selectedPaths = selectedPaths; + } + + public Map<String, List<File>> getContentFiles() { + return contentFiles; + } + + public void setContentFiles(Map<String, List<File>> contentFiles) { + this.contentFiles = contentFiles; + } + + public List<View> getViews() { + return asList(View.values()); + } + + public View getView() { + return view; + } + + public void setView(View view) { + this.view = view; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + +}
Modified: trunk/web/web-runner/src/main/java/org/jbehave/web/runner/waffle/controllers/FilesController.java (1348 => 1349)
--- trunk/web/web-runner/src/main/java/org/jbehave/web/runner/waffle/controllers/FilesController.java 2009-10-17 11:10:20 UTC (rev 1348) +++ trunk/web/web-runner/src/main/java/org/jbehave/web/runner/waffle/controllers/FilesController.java 2009-10-17 15:56:09 UTC (rev 1349) @@ -1,8 +1,8 @@ package org.jbehave.web.runner.waffle.controllers; +import static org.jbehave.web.runner.waffle.controllers.FilesContext.View.RELATIVE_PATH; + import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -14,56 +14,51 @@ public class FilesController extends MenuAwareController { private final FileManager manager; - private List<File> files = new ArrayList<File>(); - private List<String> selectedPaths = new ArrayList<String>(); - private Map<String,List<File>> contentFiles = new HashMap<String,List<File>>(); - + private FilesContext filesContext; + public FilesController(Menu menu, FileManager manager) { super(menu); this.manager = manager; + this.filesContext = new FilesContext(); } @ActionMethod(asDefault = true) public void list() { - this.files = manager.list(); + this.filesContext.setFiles(manager.list()); } @ActionMethod public void showContent() { + Map<String, List<File>> contentFiles = filesContext.getContentFiles(); contentFiles.clear(); - for (String path : selectedPaths) { - List<File> content = manager.listContent(path); - if ( content.size() > 0 ){ - contentFiles.put(content.get(0).getPath(), content); + boolean relativePaths = filesContext.getView() == RELATIVE_PATH ? true + : false; + for (String path : filesContext.getSelectedPaths()) { + List<File> content = manager.listContent(path, relativePaths); + if (content.size() > 0) { + contentFiles.put(content.get(0).getPath(), content); } } } @ActionMethod public void hideContent() { - contentFiles.clear(); + filesContext.getContentFiles().clear(); } @ActionMethod public void delete() { - manager.delete(selectedPaths); + manager.delete(filesContext.getSelectedPaths()); + hideContent(); list(); } - - public List<File> getFiles() { - return files; - } - - public Map<String, List<File>> getContentFiles() { - return contentFiles; - } - public List<String> getSelectedPaths() { - return selectedPaths; + public FilesContext getFilesContext() { + return filesContext; } - public void setSelectedPaths(List<String> selectedPaths) { - this.selectedPaths = selectedPaths; + public void setFilesContext(FilesContext filesContext) { + this.filesContext = filesContext; } }
Modified: trunk/web/web-runner/src/main/java/org/jbehave/web/runner/waffle/controllers/StepdocContext.java (1348 => 1349)
--- trunk/web/web-runner/src/main/java/org/jbehave/web/runner/waffle/controllers/StepdocContext.java 2009-10-17 11:10:20 UTC (rev 1348) +++ trunk/web/web-runner/src/main/java/org/jbehave/web/runner/waffle/controllers/StepdocContext.java 2009-10-17 15:56:09 UTC (rev 1349) @@ -1,7 +1,8 @@ package org.jbehave.web.runner.waffle.controllers; +import static java.util.Arrays.asList; + import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import org.apache.commons.lang.builder.ToStringBuilder; @@ -30,7 +31,7 @@ } public List<View> getViews(){ - return Arrays.asList(View.values()); + return asList(View.values()); } public View getView() {
Modified: trunk/web/web-runner/src/main/webapp/ftl/data/files.ftl (1348 => 1349)
--- trunk/web/web-runner/src/main/webapp/ftl/data/files.ftl 2009-10-17 11:10:20 UTC (rev 1348) +++ trunk/web/web-runner/src/main/webapp/ftl/data/files.ftl 2009-10-17 15:56:09 UTC (rev 1349) @@ -10,17 +10,22 @@ <div id="content"> <form action="" + <#assign view = filesContext.view /> <div id="files"> <fieldset> <legend><@i.messageFor "dataFiles" "Data Files"/></legend> - <#assign files = controller.files /> + <#assign files = filesContext.files /> <#if (files.size() > 0) > + <p><@i.messageFor "view" "View"/> + <@w.selectSingle "filesContext.view" w.asNameableValues(filesContext.getViews(),"name()","name()") filesContext.getView() + " /> + </p> <table> <#list files as file> - <#assign path=p.normalise(file.path)> + <#assign path=p.unixPath(file.path)> <tr> <td>${path}</td> - <td><@w.checkbox "selectedPaths" "${path}" /></td> + <td><@w.checkbox "filesContext.selectedPaths" "${path}" /></td> </tr> </#list> </table> @@ -28,24 +33,24 @@ </fieldset> </div> - <#assign contentFiles = controller.contentFiles /> + <#assign contentFiles = filesContext.contentFiles /> <#if (contentFiles.size() > 0) > <div id="contentFiles"> <fieldset> <legend><@i.messageFor "contentFiles" "Content Files"/></legend> <table> - <#list contentFiles.keySet() as path> - <#assign files=contentFiles.get(path)> + <#list contentFiles.keySet() as directoryPath> + <#assign files=contentFiles.get(directoryPath)> <#list files as file> <tr> <td> <#if (p.isViewable(file)) > - <#assign selectedPath=p.normalise(path)+"/"+p.normalise(file.path)> + <#assign selectedPath=p.urlPath(view, file.path, directoryPath)> <a class="buttonView" "viewContent" "View"/></a> </#if> </td> - <#assign relativePath=p.normalise(file.path)> - <td class="contentFilePath">${relativePath}</td> + <#assign filePath=p.unixPath(file.path)> + <td class="contentFilePath">${filePath}</td> </tr> </#list> </#list>
Modified: trunk/web/web-runner/src/main/webapp/ftl/data/upload.ftl (1348 => 1349)
--- trunk/web/web-runner/src/main/webapp/ftl/data/upload.ftl 2009-10-17 11:10:20 UTC (rev 1348) +++ trunk/web/web-runner/src/main/webapp/ftl/data/upload.ftl 2009-10-17 15:56:09 UTC (rev 1349) @@ -49,7 +49,7 @@ <table> <#list uploadedFiles as file> <tr> - <#assign path=p.normalise(file.path)> + <#assign path=p.unixPath(file.path)> <td>${path}</td> </tr> </#list>
Modified: trunk/web/web-runner/src/main/webapp/ftl/paths.ftl (1348 => 1349)
--- trunk/web/web-runner/src/main/webapp/ftl/paths.ftl 2009-10-17 11:10:20 UTC (rev 1348) +++ trunk/web/web-runner/src/main/webapp/ftl/paths.ftl 2009-10-17 15:56:09 UTC (rev 1349) @@ -1,16 +1,30 @@ <#ftl strip_whitespace=true> <#-- - * Normalises path by replacing '\' with '/' + * Returns the URL path based on the view * + * @param view the FilesContext.View * @param path the path - * @return the normalised path + * @param directoryPath the directory path to use with relative views + * @return the url path --> -<#function normalise path> - <#assign normalised = path.replace("\\","/")> - <#return normalised> +<#function urlPath view path directoryPath> + <#if (view == 'FULL_PATH')><#return unixPath(path)?url('UTF-8')></#if> + <#assign full = unixPath(directoryPath)+"/"+unixPath(path)> + <#return full?url('UTF-8')> </#function> <#-- + * Ensures path uses unix separators by replacing '\' with '/' + * + * @param path the path + * @return the unix path + --> +<#function unixPath path> + <#assign unix = path.replace("\\","/")> + <#return unix> +</#function> + +<#-- * Determines if file is viewable by looking for a path name with an extension * * @param file the file
Modified: trunk/web/web-runner/src/test/java/org/jbehave/web/runner/waffle/controllers/FilesControllerTest.java (1348 => 1349)
--- trunk/web/web-runner/src/test/java/org/jbehave/web/runner/waffle/controllers/FilesControllerTest.java 2009-10-17 11:10:20 UTC (rev 1348) +++ trunk/web/web-runner/src/test/java/org/jbehave/web/runner/waffle/controllers/FilesControllerTest.java 2009-10-17 15:56:09 UTC (rev 1349) @@ -9,7 +9,6 @@ import org.codehaus.waffle.menu.Menu; import org.jbehave.web.io.FileManager; -import org.jbehave.web.runner.waffle.controllers.FilesController; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.integration.junit4.JMock; @@ -34,32 +33,34 @@ }); FilesController controller = new FilesController(MENU, manager); controller.list(); - assertEquals(files, controller.getFiles()); + assertEquals(files, controller.getFilesContext().getFiles()); } @Test public void canListContentFiles() { final List<String> paths = asList("archive1.zip"); final List<File> files = asList(new File("archive1"), new File("file1"), new File("file2")); + final boolean relativeContentPaths = true; mockery.checking(new Expectations() { { for ( String path : paths ){ - one(manager).listContent(path); + one(manager).listContent(path, relativeContentPaths); will(returnValue(files)); } } }); FilesController controller = new FilesController(MENU, manager); - controller.setSelectedPaths(paths); + FilesContext filesContext = controller.getFilesContext(); + filesContext.setSelectedPaths(paths); controller.showContent(); - assertEquals(files, controller.getContentFiles().get("archive1")); + assertEquals(files, filesContext.getContentFiles().get("archive1")); } @Test public void canHideContentFiles() { FilesController controller = new FilesController(MENU, manager); controller.hideContent(); - assertTrue(controller.getContentFiles().isEmpty()); + assertTrue(controller.getFilesContext().getContentFiles().isEmpty()); } @Test @@ -74,9 +75,10 @@ } }); FilesController controller = new FilesController(MENU, manager); - controller.setSelectedPaths(paths); + FilesContext filesContext = controller.getFilesContext(); + filesContext.setSelectedPaths(paths); controller.delete(); - assertEquals(files, controller.getFiles()); + assertEquals(files, filesContext.getFiles()); } }
To unsubscribe from this list please visit:
