From dd196e3fd4cf0ed0f904129a42e112efde93858c Mon Sep 17 00:00:00 2001 From: Binal Patel Date: Mon, 7 Apr 2025 23:11:41 -0700 Subject: [PATCH 1/6] Update ValidateReadsetFilesAction and ImportReferenceSequencesAction to use FileLike --- .../SequenceAnalysisController.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java index 82dc613b8..f5ab7dc33 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java @@ -171,6 +171,7 @@ import org.labkey.sequenceanalysis.util.FastqUtils; import org.labkey.sequenceanalysis.util.SequenceUtil; import org.labkey.vfs.FileLike; +import org.labkey.vfs.FileSystemLike; import org.springframework.beans.PropertyValues; import org.springframework.validation.BindException; import org.springframework.validation.Errors; @@ -1119,14 +1120,21 @@ public ApiResponse execute(ValidateReadsetImportForm form, BindException errors) if (form.getFileNames() != null) { //TODO: consider proper container?? - File root = PipelineService.get().findPipelineRoot(getContainer()).getRootPath(); - File base = root; + PipeRoot root = PipelineService.get().findPipelineRoot(getContainer()); + + if (null == root) + { + throw new PipelineJobException("Unable to find pipeline root for container: " + getContainer().getPath()); + } + + FileLike base = root.getRootFileLike(); + if (form.getPath() != null) - base = new File(base, form.getPath()); + base = base.resolveChild(form.getPath()); for (String fileName : form.getFileNames()) { - File f = new File(base, fileName); + File f = FileSystemLike.toFile(base.resolveChild(fileName)); ExpData data = ExperimentService.get().getExpDataByURL(f, getContainer()); if (data != null) { @@ -1137,7 +1145,7 @@ public ApiResponse execute(ValidateReadsetImportForm form, BindException errors) Map map = new HashMap<>(); map.put("fileName", fileName); map.put("filePath", f.getPath()); - map.put("relPath", FileUtil.relativePath(FileUtil.getAbsoluteCaseSensitiveFile(root).getPath(), FileUtil.getAbsoluteCaseSensitiveFile(f).getPath())); + map.put("relPath", FileUtil.relativePath(FileUtil.getAbsoluteCaseSensitiveFile(FileSystemLike.toFile(root.getRootFileLike())).getPath(), FileUtil.getAbsoluteCaseSensitiveFile(f).getPath())); map.put("container", getContainer().getId()); map.put("containerPath", getContainer().getPath()); String basename = SequenceTaskHelper.getUnzippedBaseName(fileName); @@ -2320,7 +2328,12 @@ public Object execute(ImportFastaSequencesForm form, BindException errors) throw //resolve files List files = new ArrayList<>(); PipeRoot root = PipelineService.get().getPipelineRootSetting(getContainer()); - File baseDir = StringUtils.trimToNull(form.getPath()) == null ? root.getRootPath() : new File(root.getRootPath(), form.getPath()); + FileLike baseDir = null != root ? root.getRootFileLike() : null; + if (baseDir == null) + { + errors.reject(ERROR_MSG, "Pipeline root not configured"); + return null; + } if (!baseDir.exists()) { errors.reject(ERROR_MSG, "Unable to find directory: " + baseDir.getPath()); @@ -2335,7 +2348,7 @@ public Object execute(ImportFastaSequencesForm form, BindException errors) throw for (String fn : form.getFileNames()) { - File f = new File(baseDir, fn); + File f = FileSystemLike.toFile(baseDir.resolveChild(fn)); if (f.exists()) { files.add(f); From 21e947ef06003b1894495c74313bf6c1a6728b24 Mon Sep 17 00:00:00 2001 From: Binal Patel Date: Tue, 8 Apr 2025 15:08:50 -0700 Subject: [PATCH 2/6] Update 'DownloadTempImageAction' to use FileLike. --- .../SequenceAnalysisController.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java index f5ab7dc33..958f2ac94 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java @@ -435,8 +435,21 @@ public static class DownloadTempImageAction extends ExportAction Date: Tue, 8 Apr 2025 15:17:54 -0700 Subject: [PATCH 3/6] Use getPath() in the error message. --- .../org/labkey/sequenceanalysis/SequenceAnalysisController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java index 958f2ac94..02f54c881 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java @@ -439,7 +439,7 @@ public void export(TempImageAction form, HttpServletResponse response, BindExcep FileLike tempDirRoot = new FileSystemLike.Builder(FileUtil.getTempDirectory()).root(); if (!(tempDirRoot.getFileSystem().isDescendant(tempDirRoot, new File(form.getDirectory()).toURI()))) { - throw new FileNotFoundException("Directory '" + form.getDirectory() + "' is not the descendant of '" + tempDirRoot.getFileSystem() + "'"); + throw new FileNotFoundException("Directory '" + form.getDirectory() + "' is not the descendant of '" + tempDirRoot.getPath() + "'"); } FileLike parentDirFileLike = form.getDirectory() == null ? tempDirRoot : tempDirRoot.resolveFile(new Path(form.getDirectory())); File parentDir = FileSystemLike.toFile(parentDirFileLike); From f06440b8c58fdeedf57676cf4128124c107bde6d Mon Sep 17 00:00:00 2001 From: Binal Patel Date: Wed, 9 Apr 2025 09:41:11 -0700 Subject: [PATCH 4/6] Use resolveFile() --- .../org/labkey/sequenceanalysis/SequenceAnalysisController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java index 02f54c881..e106b68f7 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java @@ -1143,7 +1143,7 @@ public ApiResponse execute(ValidateReadsetImportForm form, BindException errors) FileLike base = root.getRootFileLike(); if (form.getPath() != null) - base = base.resolveChild(form.getPath()); + base = base.resolveFile(new Path(form.getPath())); for (String fileName : form.getFileNames()) { From e219ea402f72c8ebaba1a5b006365afc6c499dcf Mon Sep 17 00:00:00 2001 From: Binal Patel Date: Wed, 9 Apr 2025 09:52:54 -0700 Subject: [PATCH 5/6] Remove DownloadTempImageAction and ConvertTextToFileAction and its associated form classes. --- .../SequenceAnalysisController.java | 139 ------------------ 1 file changed, 139 deletions(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java index e106b68f7..6c7d3aa85 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java @@ -428,93 +428,6 @@ public void addNavTrail(NavTree tree) } } - @RequiresPermission(ReadPermission.class) - @IgnoresTermsOfUse - public static class DownloadTempImageAction extends ExportAction - { - @Override - public void export(TempImageAction form, HttpServletResponse response, BindException errors) throws Exception - { - File targetFile; - FileLike tempDirRoot = new FileSystemLike.Builder(FileUtil.getTempDirectory()).root(); - if (!(tempDirRoot.getFileSystem().isDescendant(tempDirRoot, new File(form.getDirectory()).toURI()))) - { - throw new FileNotFoundException("Directory '" + form.getDirectory() + "' is not the descendant of '" + tempDirRoot.getPath() + "'"); - } - FileLike parentDirFileLike = form.getDirectory() == null ? tempDirRoot : tempDirRoot.resolveFile(new Path(form.getDirectory())); - File parentDir = FileSystemLike.toFile(parentDirFileLike); - - if (!(parentDirFileLike.getFileSystem().isDescendant(parentDirFileLike, new File(form.getFileName()).toURI()))) - { - throw new FileNotFoundException("File '" + form.getFileName() + "' is not the descendant of '" + parentDirFileLike.getPath() + "'"); - } - - targetFile = FileSystemLike.toFile(parentDirFileLike.resolveChild(form.getFileName())); - targetFile = FileUtil.getAbsoluteCaseSensitiveFile(targetFile); - - if (!NetworkDrive.exists(targetFile)) - { - throw new FileNotFoundException("Could not find file: " + targetFile.getPath()); - } - - if (parentDir.listFiles() == null) - { - throw new FileNotFoundException("Unable to list the contents of folder: " + parentDir.getPath()); - } - - PageFlowUtil.streamFile(response, targetFile, false); - - //the file will be recreated, so delete upon running - FileUtils.deleteQuietly(targetFile); - - //if the folder if empty, remove it too. other simultaneous requests might have deleted this folder before we get to it - if (parentDir != null && parentDir.exists()) - { - File[] children = parentDir.listFiles(); - if (children != null && children.length == 0 && !parentDir.equals(FileUtil.getTempDirectory())) - { - FileUtils.deleteQuietly(parentDir); //the Images folder - File parent = parentDir.getParentFile(); - FileUtils.deleteQuietly(parent); //the file's folder - - if (parent != null && parent.getParentFile() != null) - { - File[] children2 = parent.getParentFile().listFiles(); - if (children2 != null && children2.length == 0) - FileUtils.deleteQuietly(parent.getParentFile()); //the file's folder - } - } - } - } - } - - @RequiresPermission(ReadPermission.class) - @IgnoresTermsOfUse - public static class ConvertTextToFileAction extends ExportAction - { - @Override - public void export(ConvertTextToFileForm form, HttpServletResponse response, BindException errors) throws Exception - { - String text = form.getText(); - - if (text == null) - { - errors.reject(ERROR_MSG, "Need to provide text"); - return; - } - if (form.getFileName() == null) - { - errors.reject(ERROR_MSG, "Need to provide a filename"); - return; - } - - Map headers = new HashMap<>(); - - PageFlowUtil.prepareResponseForFile(response, headers, form.getFileName(), true); - response.getOutputStream().print(text); - } - } - @RequiresPermission(ReadPermission.class) public static class FindOrphanFilesAction extends ConfirmAction { @@ -1670,58 +1583,6 @@ public void setZipFileName(String zipFileName) } } - public static class ConvertTextToFileForm - { - private String _text; - private String _fileName; - - public String getText() - { - return _text; - } - - public void setText(String text) - { - _text = text; - } - - public String getFileName() - { - return _fileName; - } - - public void setFileName(String fileName) - { - _fileName = fileName; - } - } - - public static class TempImageAction - { - String _fileName; - String _directory; - - public String getFileName() - { - return _fileName; - } - - public void setFileName(String fileName) - { - _fileName = fileName; - } - - public String getDirectory() - { - return _directory; - } - - public void setDirectory(String directory) - { - _directory = directory; - } - } - public static class FastqcForm { private String[] _filenames; From ce11f9a84246f55f47ad941731d5dc8d0351c07a Mon Sep 17 00:00:00 2001 From: Binal Patel Date: Wed, 9 Apr 2025 10:57:57 -0700 Subject: [PATCH 6/6] Adjust error, use resolveFile() --- .../sequenceanalysis/SequenceAnalysisController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java index 6c7d3aa85..534381244 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java @@ -2202,12 +2202,15 @@ public Object execute(ImportFastaSequencesForm form, BindException errors) throw //resolve files List files = new ArrayList<>(); PipeRoot root = PipelineService.get().getPipelineRootSetting(getContainer()); - FileLike baseDir = null != root ? root.getRootFileLike() : null; - if (baseDir == null) + + if (root == null) { errors.reject(ERROR_MSG, "Pipeline root not configured"); return null; } + + FileLike baseDir = StringUtils.trimToNull(form.getPath()) == null ? root.getRootFileLike() : root.getRootFileLike().resolveFile(new Path(form.getPath())); + if (!baseDir.exists()) { errors.reject(ERROR_MSG, "Unable to find directory: " + baseDir.getPath());