From e3b3f684bfe3065acf5eeac585696e2da9cefc42 Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Mon, 17 Nov 2025 11:43:33 -0800 Subject: [PATCH 1/3] Continue adopting FileLike instead of File or Path --- .../src/org/labkey/lincs/LincsController.java | 24 +++++++++---------- .../labkey/lincs/psp/LincsPspPipelineJob.java | 2 +- .../pipeline/NextFlowPipelineJob.java | 7 +++--- .../nextflow/pipeline/NextFlowRunTask.java | 7 +++--- .../PanoramaPublicController.java | 17 ++++++------- .../pipeline/CopyExperimentPipelineJob.java | 18 +------------- .../pipeline/PxDataValidationPipelineJob.java | 4 +--- .../ProteomeXchangeService.java | 15 +++++++----- 8 files changed, 38 insertions(+), 56 deletions(-) diff --git a/lincs/src/org/labkey/lincs/LincsController.java b/lincs/src/org/labkey/lincs/LincsController.java index 51116e5c..e35d4007 100644 --- a/lincs/src/org/labkey/lincs/LincsController.java +++ b/lincs/src/org/labkey/lincs/LincsController.java @@ -87,6 +87,7 @@ import org.labkey.lincs.psp.LincsPspUtil; import org.labkey.lincs.psp.PspEndpoint; import org.labkey.lincs.view.GctUtils; +import org.labkey.vfs.FileLike; import org.springframework.beans.MutablePropertyValues; import org.springframework.validation.BindException; import org.springframework.validation.Errors; @@ -144,35 +145,32 @@ public void addNavTrail(NavTree root) } } - private void copyFiles(Path gctDir, String outputFileBaseName, Path gct, File reportDir) throws IOException + private void copyFiles(Path gctDir, String outputFileBaseName, Path gct, FileLike reportDir) throws IOException { // reportDir is a local directory under tomcat's temp directory - File[] reportDirFiles = reportDir.listFiles(new FilenameFilter() + List reportDirFiles = reportDir.getChildren((f) -> { - @Override - public boolean accept(File dir, String name) - { - return name.toLowerCase().endsWith(".txt") + String name = f.getName(); + return name.toLowerCase().endsWith(".txt") || name.toLowerCase().endsWith(".gct") || name.equals("script.Rout"); - } }); // The report should create two files: lincs.gct and lincs.processed.gct // Copy both to the GCT folder - for(File file: reportDirFiles) + for(FileLike file: reportDirFiles) { if(file.getName().equalsIgnoreCase("lincs.gct")) { - Files.copy(file.toPath(), gct, StandardCopyOption.REPLACE_EXISTING); + Files.copy(file.toNioPathForRead(), gct, StandardCopyOption.REPLACE_EXISTING); } else if(file.getName().equalsIgnoreCase("console.txt")) { - Files.copy(file.toPath(), gctDir.resolve(outputFileBaseName + ".console.txt" ), StandardCopyOption.REPLACE_EXISTING); + Files.copy(file.toNioPathForRead(), gctDir.resolve(outputFileBaseName + ".console.txt" ), StandardCopyOption.REPLACE_EXISTING); } else if(file.getName().equals("script.Rout")) { - Files.copy(file.toPath(), gctDir.resolve(outputFileBaseName + ".script.Rout" ), StandardCopyOption.REPLACE_EXISTING); + Files.copy(file.toNioPathForRead(), gctDir.resolve(outputFileBaseName + ".script.Rout" ), StandardCopyOption.REPLACE_EXISTING); } } } @@ -306,11 +304,11 @@ public ApiResponse execute(GCTReportForm form, BindException errors) throws Exce } catch(Exception e) { - copyFiles(gctDir, outputFileBaseName, downloadFile, rreport.getReportDir(getContainer().getId())); + copyFiles(gctDir, outputFileBaseName, downloadFile, rreport.getReportDirFileLike(getContainer().getId())); throw new ApiUsageException("There was an error running the GCT R script.", e); } - copyFiles(gctDir, outputFileBaseName, downloadFile, rreport.getReportDir(getContainer().getId())); + copyFiles(gctDir, outputFileBaseName, downloadFile, rreport.getReportDirFileLike(getContainer().getId())); if(!Files.exists(downloadFile)) { diff --git a/lincs/src/org/labkey/lincs/psp/LincsPspPipelineJob.java b/lincs/src/org/labkey/lincs/psp/LincsPspPipelineJob.java index 5a67a26d..7d776b5a 100644 --- a/lincs/src/org/labkey/lincs/psp/LincsPspPipelineJob.java +++ b/lincs/src/org/labkey/lincs/psp/LincsPspPipelineJob.java @@ -43,7 +43,7 @@ public LincsPspPipelineJob(ViewBackgroundInfo info, PipeRoot root, ITargetedMSRu String baseLogFileName = FileUtil.makeFileNameWithTimestamp("LincsPSP_" + (_oldPspJob != null ? "rerun_" : "") + run.getBaseName().replace(" ", "_")); LocalDirectory localDirectory = LocalDirectory.create(root, baseLogFileName, - !root.isCloudRoot() ? root.getRootPath().getAbsolutePath() : FileUtil.getTempDirectory().getPath()); + !root.isCloudRoot() ? root.getRootFileLike() : FileUtil.getTempDirectoryFileLike()); setLocalDirectory(localDirectory); setLogFile(localDirectory.determineLogFile()); diff --git a/nextflow/src/org/labkey/nextflow/pipeline/NextFlowPipelineJob.java b/nextflow/src/org/labkey/nextflow/pipeline/NextFlowPipelineJob.java index 9d074bca..71728521 100644 --- a/nextflow/src/org/labkey/nextflow/pipeline/NextFlowPipelineJob.java +++ b/nextflow/src/org/labkey/nextflow/pipeline/NextFlowPipelineJob.java @@ -25,7 +25,6 @@ import org.labkey.vfs.FileLike; import java.io.BufferedWriter; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; @@ -117,7 +116,7 @@ private static FileLike createConfig(Path configTemplate, FileLike parentDir, Fi @Override public String getDescription() { - return "NextFlow analysis of " + StringUtilsLabKey.pluralize(getInputFilePaths().size(), "file") + " using config: " + config.getName(); + return "NextFlow analysis of " + StringUtilsLabKey.pluralize(getInputFiles().size(), "file") + " using config: " + config.getName(); } @Override @@ -139,13 +138,13 @@ public AbstractFileAnalysisJob createSingleFileJob(FileLike file) } @Override - public File findInputFile(String name) + public FileLike findInputFile(String name) { throw new UnsupportedOperationException(); } @Override - public File findOutputFile(String name) + public FileLike findOutputFile(String name) { return null; } diff --git a/nextflow/src/org/labkey/nextflow/pipeline/NextFlowRunTask.java b/nextflow/src/org/labkey/nextflow/pipeline/NextFlowRunTask.java index 5d4357f7..8e996b6c 100644 --- a/nextflow/src/org/labkey/nextflow/pipeline/NextFlowRunTask.java +++ b/nextflow/src/org/labkey/nextflow/pipeline/NextFlowRunTask.java @@ -19,7 +19,6 @@ import org.labkey.vfs.FileLike; import java.io.BufferedReader; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -76,7 +75,7 @@ public NextFlowRunTask(Factory factory, PipelineJob job) // Need to pass to the main process directly in the future to allow concurrent execution for different users ProcessBuilder secretsPB = new ProcessBuilder("nextflow", "secrets", "set", "PANORAMA_API_KEY", apiKey); log.info("Setting secrets"); - File dir = getJob().getLogFile().getParentFile(); + FileLike dir = getJob().getLogFileLike().getParent(); getJob().runSubProcess(secretsPB, dir); ProcessBuilder executionPB = new ProcessBuilder(getArgs()); @@ -85,9 +84,9 @@ public NextFlowRunTask(Factory factory, PipelineJob job) NextFlowPipelineJob.LOG.info("Finished executing NextFlow: {}", getJob().getJsonJobInfo(true)); RecordedAction action = new RecordedAction(ACTION_NAME); - for (Path inputFile : getJob().getInputFilePaths()) + for (FileLike inputFile : getJob().getInputFiles()) { - action.addInput(inputFile.toFile(), SPECTRA_INPUT_ROLE); + action.addInput(inputFile, SPECTRA_INPUT_ROLE); } addOutputs(action, getJob().getLogFilePath().getParent().resolve("reports"), log); addOutputs(action, getJob().getLogFilePath().getParent().resolve("results"), log); diff --git a/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicController.java b/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicController.java index 63b20c3d..4cd8caf8 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicController.java +++ b/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicController.java @@ -139,6 +139,7 @@ import org.labkey.api.view.template.ClientDependency; import org.labkey.api.wiki.WikiRendererType; import org.labkey.api.wiki.WikiRenderingService; +import org.labkey.api.writer.PrintWriters; import org.labkey.panoramapublic.bluesky.BlueskyApiClient; import org.labkey.panoramapublic.bluesky.BlueskyException; import org.labkey.panoramapublic.bluesky.BlueskySettingsManager; @@ -4617,11 +4618,11 @@ private PxXml createPxXml(ExperimentAnnotations expAnnot, JournalExperiment je, } } - private File writePxXmlFile(String xmlString) throws PxException + private FileLike writePxXmlFile(String xmlString) throws PxException { - File xml = getLocalFile(getContainer(), "px.xml"); // TODO: Add date time stamp + FileLike xml = getLocalFile(getContainer(), "px.xml"); // TODO: Add date time stamp - try (PrintWriter out = new PrintWriter(new FileWriter(xml, StandardCharsets.UTF_8))) + try (PrintWriter out = PrintWriters.getPrintWriter(xml.openOutputStream())) { out.write(xmlString); } @@ -4656,7 +4657,7 @@ public void assignPxId(boolean useTestDb, boolean testMode, String pxUser, Strin private void validatePxXml(boolean useTestDb, String pxChangeLog, String pxUser, String pxPassword, BindException errors) throws PxException, ProteomeXchangeServiceException { - File xmlFile = writePxXmlFile(createPxXml(_expAnnot, _journalExperiment, _submission, _validationStatus, pxChangeLog, true).getXml()); + FileLike xmlFile = writePxXmlFile(createPxXml(_expAnnot, _journalExperiment, _submission, _validationStatus, pxChangeLog, true).getXml()); _pxResponse = ProteomeXchangeService.validatePxXml(xmlFile, useTestDb, pxUser, pxPassword); if(ProteomeXchangeService.responseHasErrors(_pxResponse)) { @@ -4677,7 +4678,7 @@ private void submitPxXml(boolean useTestDb, boolean testMode, String pxChangeLog return; } PxXml pxXml = createPxXml(_expAnnot, _journalExperiment, _submission, _validationStatus, pxChangeLog, true); - File xmlFile = writePxXmlFile(pxXml.getXml()); + FileLike xmlFile = writePxXmlFile(pxXml.getXml()); _pxResponse = ProteomeXchangeService.submitPxXml(xmlFile, useTestDb, pxUser, pxPassword); if(ProteomeXchangeService.responseHasErrors(_pxResponse)) { @@ -4699,7 +4700,7 @@ private void updatePxXml(boolean useTestDb, boolean testMode, String pxChangeLog submitPxXml(useTestDb, testMode, pxChangeLog, pxUser, pxPassword, errors); } - private static File getLocalFile(Container container, String fileName) throws PxException + private static FileLike getLocalFile(Container container, String fileName) throws PxException { // File.createTempFile() java.nio.file.Path fileRoot = FileContentService.get().getFileRootPath(container, FileContentService.ContentType.files); @@ -4713,7 +4714,7 @@ private static File getLocalFile(Container container, String fileName) throws Px if (root != null) { LocalDirectory localDirectory = LocalDirectory.create(root); - return new File(localDirectory.getLocalDirectoryFile(), fileName); + return localDirectory.getLocalDirectoryFile().resolveChild(fileName); } else { @@ -4722,7 +4723,7 @@ private static File getLocalFile(Container container, String fileName) throws Px } else { - return fileRoot.resolve(fileName).toFile(); + return FileSystemLike.wrapFile(fileRoot.resolve(fileName)); } } } diff --git a/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentPipelineJob.java b/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentPipelineJob.java index 69d20367..a77853ab 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentPipelineJob.java +++ b/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentPipelineJob.java @@ -34,9 +34,6 @@ import org.labkey.panoramapublic.model.Journal; import org.labkey.vfs.FileLike; -import java.io.File; -import java.io.IOException; - /** * User: vsharma * Date: 8/21/2014 @@ -118,7 +115,7 @@ public String getDescription() } @Override - public TaskPipeline getTaskPipeline() + public TaskPipeline getTaskPipeline() { return PipelineJobService.get().getTaskPipeline(new TaskId(CopyExperimentPipelineJob.class)); } @@ -133,19 +130,6 @@ protected void finallyCleanUpLocalDirectory() } } - public static File getLogFileFor(PipeRoot root, ExperimentAnnotations experimentAnnotations) throws IOException - { - File rootDir = root.getLogDirectory(); - if (!rootDir.exists()) - { - throw new IOException("Pipeline root directory " + rootDir.getAbsolutePath() + " does not exist."); - } - - String logFileName = "Experiment_" + experimentAnnotations.getExperimentId() + ".log"; - - return new File(rootDir, logFileName); - } - @Override public ExperimentAnnotations getExpAnnotations() { diff --git a/panoramapublic/src/org/labkey/panoramapublic/pipeline/PxDataValidationPipelineJob.java b/panoramapublic/src/org/labkey/panoramapublic/pipeline/PxDataValidationPipelineJob.java index e0c130bf..7dfa4db5 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/pipeline/PxDataValidationPipelineJob.java +++ b/panoramapublic/src/org/labkey/panoramapublic/pipeline/PxDataValidationPipelineJob.java @@ -14,8 +14,6 @@ import org.labkey.api.view.ViewBackgroundInfo; import org.labkey.panoramapublic.model.ExperimentAnnotations; -import java.io.File; - public class PxDataValidationPipelineJob extends PipelineJob implements PxDataValidationJobSupport { private final ExperimentAnnotations _experimentAnnotations; @@ -41,7 +39,7 @@ public PxDataValidationPipelineJob(ViewBackgroundInfo info, PipeRoot root, Exper _description = String.format("Validating data for experiment Id: %d, validation Id: %d", experiment.getId(), validationId); String baseLogFileName = FileUtil.makeFileNameWithTimestamp("Experiment_Validation_" + experiment.getExperimentId(), "log"); - setLogFile(new File(root.getLogDirectory(), baseLogFileName)); + setLogFile(root.getLogDirectory(true).resolveChild(baseLogFileName)); header("Validating data for a ProteomeXchange submission."); } diff --git a/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/ProteomeXchangeService.java b/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/ProteomeXchangeService.java index 01da7628..b11c9b95 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/ProteomeXchangeService.java +++ b/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/ProteomeXchangeService.java @@ -17,10 +17,12 @@ import org.apache.hc.client5.http.classic.methods.HttpPost; import org.apache.hc.client5.http.entity.mime.FileBody; +import org.apache.hc.client5.http.entity.mime.InputStreamBody; import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.core5.http.ContentType; import org.apache.hc.core5.http.HttpEntity; import org.apache.hc.core5.http.ParseException; import org.apache.hc.core5.http.io.entity.EntityUtils; @@ -28,6 +30,7 @@ import org.jetbrains.annotations.NotNull; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.logging.LogHelper; +import org.labkey.vfs.FileLike; import java.io.File; import java.io.IOException; @@ -49,17 +52,17 @@ private enum METHOD {submitDataset, validateXML, requestID} private static final Logger LOG = LogHelper.getLogger(ProteomeXchangeService.class, "Handles requests to the ProteomeXchange server"); - public static String validatePxXml(File pxxmlFile, boolean testDatabase, String user, String pass) throws ProteomeXchangeServiceException + public static String validatePxXml(FileLike pxxmlFile, boolean testDatabase, String user, String pass) throws ProteomeXchangeServiceException { return postPxXml(pxxmlFile, testDatabase, user, pass, METHOD.validateXML); } - public static String submitPxXml(File pxxmlFile, boolean testDatabase, String user, String pass) throws ProteomeXchangeServiceException + public static String submitPxXml(FileLike pxxmlFile, boolean testDatabase, String user, String pass) throws ProteomeXchangeServiceException { return postPxXml(pxxmlFile, testDatabase, user, pass, METHOD.submitDataset); } - private static String postPxXml(File pxxmlFile, boolean testDatabase, String user, String pass, METHOD method) throws ProteomeXchangeServiceException + private static String postPxXml(FileLike pxxmlFile, boolean testDatabase, String user, String pass, METHOD method) throws ProteomeXchangeServiceException { String responseMessage; try { @@ -118,12 +121,12 @@ public static String getPxId(boolean testDatabase, String user, String pass) thr } @NotNull - private static MultipartEntityBuilder getMultipartEntityBuilder(File pxxmlFile, boolean testDatabase, METHOD method, String user, String pass) + private static MultipartEntityBuilder getMultipartEntityBuilder(FileLike pxxmlFile, boolean testDatabase, METHOD method, String user, String pass) throws IOException { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); if(pxxmlFile != null) { - builder.addPart("ProteomeXchangeXML", new FileBody(pxxmlFile)); + builder.addPart("ProteomeXchangeXML", new InputStreamBody(pxxmlFile.openInputStream(), ContentType.TEXT_XML, pxxmlFile.getName())); } builder.addTextBody("PXPartner", user); builder.addTextBody("authentication", pass); @@ -140,7 +143,7 @@ private static MultipartEntityBuilder getMultipartEntityBuilder(File pxxmlFile, return builder; } - private static MultipartEntityBuilder getMultipartEntityBuilder(boolean testDatabase, METHOD method, String user, String pass) + private static MultipartEntityBuilder getMultipartEntityBuilder(boolean testDatabase, METHOD method, String user, String pass) throws IOException { return getMultipartEntityBuilder(null, testDatabase, method, user, pass); } From d4e59ee300763bd9674b253be965a261e9fd3a5d Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Wed, 19 Nov 2025 16:00:52 -0800 Subject: [PATCH 2/3] Fix assorted tests --- .../labkey/skylinetoolsstore/SkylineToolsStoreController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SkylineToolsStore/src/org/labkey/skylinetoolsstore/SkylineToolsStoreController.java b/SkylineToolsStore/src/org/labkey/skylinetoolsstore/SkylineToolsStoreController.java index edcdb7de..9c7ee563 100644 --- a/SkylineToolsStore/src/org/labkey/skylinetoolsstore/SkylineToolsStoreController.java +++ b/SkylineToolsStore/src/org/labkey/skylinetoolsstore/SkylineToolsStoreController.java @@ -1180,7 +1180,7 @@ public ModelAndView getView(DownloadFileForm form, BindException errors) throws } else { - PageFlowUtil.streamFile(getViewContext().getResponse(), downloadFile, true); + PageFlowUtil.streamFile(getViewContext().getResponse(), downloadFile.toPath(), true); return null; } } From b9ee7cd3017cf2f98666c6af7eb8c74e87665404 Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Tue, 2 Dec 2025 14:45:16 -0800 Subject: [PATCH 3/3] Prep for merge --- .../src/org/labkey/panoramapublic/PanoramaPublicController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicController.java b/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicController.java index 2c08d56b..26d00ae0 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicController.java +++ b/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicController.java @@ -4723,7 +4723,7 @@ private static FileLike getLocalFile(Container container, String fileName) throw } else { - return FileSystemLike.wrapFile(fileRoot.resolve(fileName)); + return FileSystemLike.wrapFile(fileRoot).resolveChild(fileName); } } }