diff --git a/SkylineToolsStore/src/org/labkey/skylinetoolsstore/SkylineToolsStoreController.java b/SkylineToolsStore/src/org/labkey/skylinetoolsstore/SkylineToolsStoreController.java index edcdb7de..873d90c0 100644 --- a/SkylineToolsStore/src/org/labkey/skylinetoolsstore/SkylineToolsStoreController.java +++ b/SkylineToolsStore/src/org/labkey/skylinetoolsstore/SkylineToolsStoreController.java @@ -1088,7 +1088,12 @@ else if (toolLsid != null && // Cookie expires after 1 day final int expires = 24 * 60 * 60; - SkylineToolsStoreManager.get().recordToolDownload(tool); + // Download counter is an incidental write on a GET action — use ignoreSqlUpdates() + // to avoid the dev-mode mutating SQL assertion (like auditing writes) + try (var ignored = SpringActionController.ignoreSqlUpdates()) + { + SkylineToolsStoreManager.get().recordToolDownload(tool); + } DateFormat df = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss 'GMT'", Locale.US); Calendar calendar = Calendar.getInstance(); @@ -1180,7 +1185,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; } } 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 46533c9b..7d776b5a 100644 --- a/lincs/src/org/labkey/lincs/psp/LincsPspPipelineJob.java +++ b/lincs/src/org/labkey/lincs/psp/LincsPspPipelineJob.java @@ -12,7 +12,6 @@ import org.labkey.api.util.FileUtil; import org.labkey.api.util.URLHelper; import org.labkey.api.view.ViewBackgroundInfo; -import org.labkey.lincs.LincsModule; public class LincsPspPipelineJob extends PipelineJob implements LincsPspJobSupport { @@ -43,8 +42,8 @@ public LincsPspPipelineJob(ViewBackgroundInfo info, PipeRoot root, ITargetedMSRu String baseLogFileName = FileUtil.makeFileNameWithTimestamp("LincsPSP_" + (_oldPspJob != null ? "rerun_" : "") + run.getBaseName().replace(" ", "_")); - LocalDirectory localDirectory = LocalDirectory.create(root, LincsModule.NAME, baseLogFileName, - !root.isCloudRoot() ? root.getRootPath().getAbsolutePath() : FileUtil.getTempDirectory().getPath()); + LocalDirectory localDirectory = LocalDirectory.create(root, baseLogFileName, + !root.isCloudRoot() ? root.getRootFileLike() : FileUtil.getTempDirectoryFileLike()); setLocalDirectory(localDirectory); setLogFile(localDirectory.determineLogFile()); diff --git a/nextflow/src/org/labkey/nextflow/NextFlowController.java b/nextflow/src/org/labkey/nextflow/NextFlowController.java index 784ffc59..f3adaef1 100644 --- a/nextflow/src/org/labkey/nextflow/NextFlowController.java +++ b/nextflow/src/org/labkey/nextflow/NextFlowController.java @@ -39,6 +39,7 @@ import org.labkey.api.view.ViewBackgroundInfo; import org.labkey.nextflow.pipeline.NextFlowPipelineJob; import org.labkey.nextflow.pipeline.NextFlowProtocol; +import org.labkey.vfs.FileLike; import org.springframework.validation.BindException; import org.springframework.validation.Errors; import org.springframework.web.servlet.ModelAndView; @@ -261,17 +262,17 @@ public void validateCommand(AnalyzeForm o, Errors errors) @Override public ModelAndView getView(AnalyzeForm o, boolean b, BindException errors) { - List selectedFiles = o.getValidatedFiles(getContainer(), false); + List selectedFiles = o.getValidatedFiles(getContainer(), false); if (selectedFiles.isEmpty()) { return new HtmlView(HtmlString.of("Couldn't find input file(s)")); } // NextFlow operates on the full directory so show the list to the user, regardless of what they selected // from the file listing - File inputDir = selectedFiles.get(0).getParentFile(); + FileLike inputDir = selectedFiles.get(0).getParent(); - File[] inputFiles = inputDir.listFiles(new PipelineProvider.FileTypesEntryFilter(NextFlowProtocol.INPUT_TYPES)); - if (inputFiles == null || inputFiles.length == 0) + List inputFiles = inputDir.getChildren().stream().filter(new PipelineProvider.FileTypesEntryFilter(NextFlowProtocol.INPUT_TYPES)).toList(); + if (inputFiles.isEmpty()) { return new HtmlView(HtmlString.of("Couldn't find input file(s)")); } @@ -290,7 +291,7 @@ public ModelAndView getView(AnalyzeForm o, boolean b, BindException errors) INPUT(at(hidden, true, name, "launch", value, true)), Arrays.stream(o.getFile()).map(f -> INPUT(at(hidden, true, name, "file", value, f))).toList(), "Files: ", - UL(Arrays.stream(inputFiles).map(File::getName).map(DOM::LI)), + UL(inputFiles.stream().map(FileLike::getName).map(DOM::LI)), "Config: ", new SelectBuilder().name("configFile").addOptions(Arrays.stream(configFiles).filter(f -> f.isFile() && f.getName().toLowerCase().endsWith(".config")).map(File::getName).sorted(String.CASE_INSENSITIVE_ORDER).toList()).build(), DOM.BR(), @@ -318,7 +319,7 @@ public boolean handlePost(AnalyzeForm form, BindException errors) throws Excepti } else { - List inputFiles = form.getValidatedFiles(getContainer()); + List inputFiles = form.getValidatedFiles(getContainer()); if (inputFiles.isEmpty()) { errors.reject(ERROR_MSG, "No input files"); @@ -327,7 +328,7 @@ public boolean handlePost(AnalyzeForm form, BindException errors) throws Excepti { ViewBackgroundInfo info = getViewBackgroundInfo(); PipeRoot root = PipelineService.get().findPipelineRoot(info.getContainer()); - NextFlowPipelineJob job = NextFlowPipelineJob.create(info, root, configFile.toPath(), inputFiles.stream().map(File::toPath).toList()); + NextFlowPipelineJob job = NextFlowPipelineJob.create(info, root, configFile.toPath(), inputFiles); PipelineService.get().queueJob(job); LOG.info("NextFlow job queued: {}", job.getJsonJobInfo(false)); } diff --git a/nextflow/src/org/labkey/nextflow/NextFlowModule.java b/nextflow/src/org/labkey/nextflow/NextFlowModule.java index 83dac6fc..d3a42660 100644 --- a/nextflow/src/org/labkey/nextflow/NextFlowModule.java +++ b/nextflow/src/org/labkey/nextflow/NextFlowModule.java @@ -47,7 +47,7 @@ public boolean hasScripts() @Override public @Nullable Double getSchemaVersion() { - return 25.000; + return 26.000; } @Override diff --git a/nextflow/src/org/labkey/nextflow/pipeline/NextFlowPipelineJob.java b/nextflow/src/org/labkey/nextflow/pipeline/NextFlowPipelineJob.java index 8d2f2291..71728521 100644 --- a/nextflow/src/org/labkey/nextflow/pipeline/NextFlowPipelineJob.java +++ b/nextflow/src/org/labkey/nextflow/pipeline/NextFlowPipelineJob.java @@ -20,10 +20,11 @@ import org.labkey.api.util.StringUtilsLabKey; import org.labkey.api.util.logging.LogHelper; import org.labkey.api.view.ViewBackgroundInfo; +import org.labkey.api.writer.PrintWriters; import org.labkey.nextflow.NextFlowManager; +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; @@ -35,29 +36,29 @@ public class NextFlowPipelineJob extends AbstractFileAnalysisJob { protected static final Logger LOG = LogHelper.getLogger(NextFlowPipelineJob.class, "NextFlow jobs"); - private Path config; + private FileLike config; @SuppressWarnings("unused") // For serialization protected NextFlowPipelineJob() {} - public static NextFlowPipelineJob create(ViewBackgroundInfo info, @NotNull PipeRoot root, Path templateConfig, List inputFiles) throws IOException + public static NextFlowPipelineJob create(ViewBackgroundInfo info, @NotNull PipeRoot root, Path templateConfig, List inputFiles) throws IOException { - Path parentDir = inputFiles.get(0).getParent(); + FileLike parentDir = inputFiles.get(0).getParent(); String jobName = FileUtil.makeFileNameWithTimestamp("NextFlow"); - Path jobDir = parentDir.resolve(jobName); - Path log = jobDir.resolve(jobName + ".log"); + FileLike jobDir = parentDir.resolveChild(jobName); + FileLike log = jobDir.resolveChild(jobName + ".log"); FileUtil.createDirectory(jobDir); - Path config = createConfig(templateConfig, parentDir, jobDir, info.getContainer()); + FileLike config = createConfig(templateConfig, parentDir, jobDir, info.getContainer()); return new NextFlowPipelineJob(info, root, config, inputFiles, log); } - public NextFlowPipelineJob(ViewBackgroundInfo info, @NotNull PipeRoot root, Path config, List inputFiles, Path log) throws IOException + public NextFlowPipelineJob(ViewBackgroundInfo info, @NotNull PipeRoot root, FileLike config, List inputFiles, FileLike log) throws IOException { - super(new NextFlowProtocol(), NextFlowPipelineProvider.NAME, info, root, config.getFileName().toString(), config, inputFiles, false, false); + super(new NextFlowProtocol(), NextFlowPipelineProvider.NAME, info, root, config.getName(), config, inputFiles, false); this.config = config; setLogFile(log); } @@ -69,7 +70,7 @@ public JSONObject getJsonJobInfo(boolean includeInvocationCount) result.put("container", getContainer().getPath()); result.put("filePath", getLogFilePath().getParent().toString()); result.put("runName", getNextFlowRunName(includeInvocationCount)); - result.put("configFile", getConfig().getFileName().toString()); + result.put("configFile", getConfig().getName()); return result; } @@ -88,7 +89,7 @@ public ParamParser getInputParameters() } /** Take the template config file and substitute in the values for this job */ - private static Path createConfig(Path configTemplate, Path parentDir, Path jobDir, Container container) throws IOException + private static FileLike createConfig(Path configTemplate, FileLike parentDir, FileLike jobDir, Container container) throws IOException { String template; try (InputStream in = Files.newInputStream(configTemplate)) @@ -104,8 +105,8 @@ private static Path createConfig(Path configTemplate, Path parentDir, Path jobDi uploadUrl = StringUtils.stripEnd(uploadUrl, "/"); substitutedContent = substitutedContent.replace("${panorama.upload_url}", "panorama.upload_url = '" + uploadUrl + "'"); - Path substitutedFile = jobDir.resolve(configTemplate.getFileName()); - try (BufferedWriter writer = Files.newBufferedWriter(substitutedFile)) + FileLike substitutedFile = jobDir.resolveChild(configTemplate.getFileName().toString()); + try (BufferedWriter writer = new BufferedWriter(PrintWriters.getPrintWriter(substitutedFile.openOutputStream()))) { writer.write(substitutedContent); } @@ -115,7 +116,7 @@ private static Path createConfig(Path configTemplate, Path parentDir, Path jobDi @Override public String getDescription() { - return "NextFlow analysis of " + StringUtilsLabKey.pluralize(getInputFilePaths().size(), "file") + " using config: " + config.getFileName(); + return "NextFlow analysis of " + StringUtilsLabKey.pluralize(getInputFiles().size(), "file") + " using config: " + config.getName(); } @Override @@ -131,19 +132,19 @@ public TaskId getTaskPipelineId() } @Override - public AbstractFileAnalysisJob createSingleFileJob(File file) + public AbstractFileAnalysisJob createSingleFileJob(FileLike file) { throw new UnsupportedOperationException(); } @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/NextFlowProtocol.java b/nextflow/src/org/labkey/nextflow/pipeline/NextFlowProtocol.java index 29544bed..e7387121 100644 --- a/nextflow/src/org/labkey/nextflow/pipeline/NextFlowProtocol.java +++ b/nextflow/src/org/labkey/nextflow/pipeline/NextFlowProtocol.java @@ -7,8 +7,8 @@ import org.labkey.api.pipeline.file.AbstractFileAnalysisProtocolFactory; import org.labkey.api.util.FileType; import org.labkey.api.view.ViewBackgroundInfo; +import org.labkey.vfs.FileLike; -import java.nio.file.Path; import java.util.List; import java.util.Map; @@ -47,7 +47,7 @@ public NextFlowProtocol createProtocolInstance(String name, String description, } @Override - public Path getDefaultParametersFile(PipeRoot root) + public FileLike getDefaultParametersFile(PipeRoot root) { return null; } @@ -61,7 +61,7 @@ public String getName() } @Override - public NextFlowPipelineJob createPipelineJob(ViewBackgroundInfo info, PipeRoot root, List filesInput, Path fileParameters, @Nullable Map variableMap) + public NextFlowPipelineJob createPipelineJob(ViewBackgroundInfo info, PipeRoot root, List filesInput, FileLike fileParameters, @Nullable Map variableMap) { throw new UnsupportedOperationException(); } diff --git a/nextflow/src/org/labkey/nextflow/pipeline/NextFlowRunTask.java b/nextflow/src/org/labkey/nextflow/pipeline/NextFlowRunTask.java index 1a64acc9..8e996b6c 100644 --- a/nextflow/src/org/labkey/nextflow/pipeline/NextFlowRunTask.java +++ b/nextflow/src/org/labkey/nextflow/pipeline/NextFlowRunTask.java @@ -16,9 +16,9 @@ import org.labkey.api.util.FileType; import org.labkey.nextflow.NextFlowConfiguration; import org.labkey.nextflow.NextFlowManager; +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; @@ -75,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()); @@ -84,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); @@ -143,9 +143,9 @@ else if (Files.isDirectory(path)) } } - private boolean hasAwsSection(Path configFile) throws PipelineJobException + private boolean hasAwsSection(FileLike configFile) throws PipelineJobException { - try (InputStream in = Files.newInputStream(configFile); + try (InputStream in = configFile.openInputStream(); InputStreamReader isReader = new InputStreamReader(in, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(isReader)) { @@ -174,7 +174,7 @@ private boolean hasAwsSection(Path configFile) throws PipelineJobException private @NotNull List getArgs() throws PipelineJobException { NextFlowConfiguration config = NextFlowManager.get().getConfiguration(); - Path configFile = getJob().getConfig(); + FileLike configFile = getJob().getConfig(); boolean aws = hasAwsSection(configFile); @@ -194,7 +194,7 @@ private boolean hasAwsSection(Path configFile) throws PipelineJobException args.add(s3Path); } args.add("-c"); - args.add(configFile.toAbsolutePath().toString()); + args.add(configFile.toNioPathForRead().toAbsolutePath().toString()); args.add("-name"); args.add(getJob().getNextFlowRunName(true)); return args; diff --git a/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicController.java b/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicController.java index 1a278a0b..26d00ae0 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; @@ -215,6 +216,8 @@ import org.labkey.panoramapublic.view.expannotations.TargetedMSExperimentWebPart; import org.labkey.panoramapublic.view.expannotations.TargetedMSExperimentsWebPart; import org.labkey.panoramapublic.view.publish.CatalogEntryWebPart; +import org.labkey.vfs.FileLike; +import org.labkey.vfs.FileSystemLike; import org.springframework.validation.BindException; import org.springframework.validation.Errors; import org.springframework.web.servlet.ModelAndView; @@ -1748,7 +1751,7 @@ private boolean validateAction(CopyExperimentForm form, BindException errors) return true; } - private Path getExportFilesDir(Container c) + private FileLike getExportFilesDir(Container c) { FileContentService fcs = FileContentService.get(); if(fcs != null) @@ -1756,7 +1759,7 @@ private Path getExportFilesDir(Container c) Path fileRoot = fcs.getFileRootPath(c, FileContentService.ContentType.files); if (fileRoot != null) { - return fileRoot.resolve(PipelineService.EXPORT_DIR); + return FileSystemLike.wrapFile(fileRoot.resolve(PipelineService.EXPORT_DIR)); } } return null; @@ -4615,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); } @@ -4654,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)) { @@ -4675,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)) { @@ -4697,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); @@ -4710,8 +4713,8 @@ private static File getLocalFile(Container container, String fileName) throws Px PipeRoot root = PipelineService.get().getPipelineRootSetting(container); if (root != null) { - LocalDirectory localDirectory = LocalDirectory.create(root, PanoramaPublicModule.NAME); - return new File(localDirectory.getLocalDirectoryFile(), fileName); + LocalDirectory localDirectory = LocalDirectory.create(root); + return localDirectory.getLocalDirectoryFile().resolveChild(fileName); } else { @@ -4720,7 +4723,7 @@ private static File getLocalFile(Container container, String fileName) throws Px } else { - return fileRoot.resolve(fileName).toFile(); + return FileSystemLike.wrapFile(fileRoot).resolveChild(fileName); } } } diff --git a/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicModule.java b/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicModule.java index cc5aca7e..1419be38 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicModule.java +++ b/panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicModule.java @@ -106,8 +106,8 @@ protected void init() { addController(PanoramaPublicController.NAME, PanoramaPublicController.class); PanoramaPublicSchema.register(this); - AttachmentService.get().registerAttachmentType(CatalogImageAttachmentType.get()); - AttachmentService.get().registerAttachmentType(PanoramaPublicLogoResourceType.get()); + AttachmentService.get().registerAttachmentParentType(CatalogImageAttachmentType.get()); + AttachmentService.get().registerAttachmentParentType(PanoramaPublicLogoResourceType.get()); } @Override diff --git a/panoramapublic/src/org/labkey/panoramapublic/bluesky/PanoramaPublicLogoAttachmentParent.java b/panoramapublic/src/org/labkey/panoramapublic/bluesky/PanoramaPublicLogoAttachmentParent.java index f3e464f4..57f4206b 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/bluesky/PanoramaPublicLogoAttachmentParent.java +++ b/panoramapublic/src/org/labkey/panoramapublic/bluesky/PanoramaPublicLogoAttachmentParent.java @@ -2,7 +2,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.labkey.api.attachments.AttachmentType; +import org.labkey.api.attachments.AttachmentParentType; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; import org.labkey.panoramapublic.model.Journal; @@ -29,7 +29,7 @@ public static PanoramaPublicLogoAttachmentParent get() } @Override - public @NotNull AttachmentType getAttachmentType() + public @NotNull AttachmentParentType getAttachmentParentType() { return PanoramaPublicLogoResourceType.get(); } diff --git a/panoramapublic/src/org/labkey/panoramapublic/bluesky/PanoramaPublicLogoResourceType.java b/panoramapublic/src/org/labkey/panoramapublic/bluesky/PanoramaPublicLogoResourceType.java index f7f414e8..0c2aa815 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/bluesky/PanoramaPublicLogoResourceType.java +++ b/panoramapublic/src/org/labkey/panoramapublic/bluesky/PanoramaPublicLogoResourceType.java @@ -1,11 +1,11 @@ package org.labkey.panoramapublic.bluesky; import org.jetbrains.annotations.NotNull; -import org.labkey.api.attachments.AttachmentType; +import org.labkey.api.attachments.AttachmentParentType; import org.labkey.api.data.CoreSchema; import org.labkey.api.data.SQLFragment; -public class PanoramaPublicLogoResourceType implements AttachmentType +public class PanoramaPublicLogoResourceType implements AttachmentParentType { private static final PanoramaPublicLogoResourceType INSTANCE = new PanoramaPublicLogoResourceType(); @@ -21,17 +21,23 @@ private PanoramaPublicLogoResourceType() @Override public @NotNull String getUniqueName() { - return getClass().getName(); + return "PanoramaPublicLogoResource"; } @Override public void addWhereSql(SQLFragment sql, String parentColumn, String documentNameColumn) { sql.append(parentColumn).append(" IN (SELECT EntityId FROM ") - .append(CoreSchema.getInstance().getTableInfoContainers(), "c").append(")") - .append(" AND (") - .append(documentNameColumn).append(" LIKE ") - .appendStringLiteral(PanoramaPublicLogoManager.LOGO_FILE_PREFIX + "%", CoreSchema.getInstance().getSqlDialect()) - .append(") "); + .append(CoreSchema.getInstance().getTableInfoContainers(), "c").append(")") + .append(" AND (") + .append(documentNameColumn).append(" LIKE ") + .appendStringLiteral(PanoramaPublicLogoManager.LOGO_FILE_PREFIX + "%", CoreSchema.getInstance().getSqlDialect()) + .append(") "); + } + + @Override + public @NotNull SQLFragment getSelectEntityIdAndDescriptionSql() + { + return PARENT_CONTAINER_SQL; } } diff --git a/panoramapublic/src/org/labkey/panoramapublic/catalog/CatalogImageAttachmentParent.java b/panoramapublic/src/org/labkey/panoramapublic/catalog/CatalogImageAttachmentParent.java index 0704e46d..4ef17653 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/catalog/CatalogImageAttachmentParent.java +++ b/panoramapublic/src/org/labkey/panoramapublic/catalog/CatalogImageAttachmentParent.java @@ -2,7 +2,7 @@ import org.jetbrains.annotations.NotNull; import org.labkey.api.attachments.AttachmentParent; -import org.labkey.api.attachments.AttachmentType; +import org.labkey.api.attachments.AttachmentParentType; import org.labkey.api.data.Container; import org.labkey.api.view.ShortURLRecord; @@ -29,7 +29,7 @@ public String getContainerId() } @Override - public @NotNull AttachmentType getAttachmentType() + public @NotNull AttachmentParentType getAttachmentParentType() { return CatalogImageAttachmentType.get(); } diff --git a/panoramapublic/src/org/labkey/panoramapublic/catalog/CatalogImageAttachmentType.java b/panoramapublic/src/org/labkey/panoramapublic/catalog/CatalogImageAttachmentType.java index 8af1adfd..c2a34bef 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/catalog/CatalogImageAttachmentType.java +++ b/panoramapublic/src/org/labkey/panoramapublic/catalog/CatalogImageAttachmentType.java @@ -1,11 +1,11 @@ package org.labkey.panoramapublic.catalog; import org.jetbrains.annotations.NotNull; -import org.labkey.api.attachments.AttachmentType; +import org.labkey.api.attachments.AttachmentParentType; import org.labkey.api.data.CoreSchema; import org.labkey.api.data.SQLFragment; -public class CatalogImageAttachmentType implements AttachmentType +public class CatalogImageAttachmentType implements AttachmentParentType { private static final CatalogImageAttachmentType INSTANCE = new CatalogImageAttachmentType(); @@ -21,12 +21,12 @@ private CatalogImageAttachmentType() @Override public @NotNull String getUniqueName() { - return getClass().getName(); + return "CatalogImage"; } @Override - public void addWhereSql(SQLFragment sql, String parentColumn, String documentNameColumn) + public @NotNull SQLFragment getSelectEntityIdAndDescriptionSql() { - sql.append(parentColumn).append(" IN (SELECT EntityId FROM ").append(CoreSchema.getInstance().getTableInfoShortURL(), "shorUrls").append(")"); + return new SQLFragment("SELECT EntityId, ShortUrl AS Description FROM ").append(CoreSchema.getInstance().getTableInfoShortURL()); } } diff --git a/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentFinalTask.java b/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentFinalTask.java index 362f450e..8a34dfea 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentFinalTask.java +++ b/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentFinalTask.java @@ -79,6 +79,7 @@ import org.labkey.panoramapublic.query.JournalManager; import org.labkey.panoramapublic.query.SubmissionManager; import org.labkey.panoramapublic.security.PanoramaPublicSubmitterRole; +import org.labkey.vfs.FileLike; import java.io.File; import java.io.IOException; @@ -254,9 +255,9 @@ private void verifySymlinks(Container source, Container target, boolean matching } } - private void cleanupExportDirectory(User user, File directory) + private void cleanupExportDirectory(User user, FileLike directory) { - List datas = ExperimentService.get().getExpDatasUnderPath(directory.toPath(), null, true); + List datas = ExperimentService.get().getExpDatasUnderPath(directory.toNioPathForRead(), null, true); for (ExpData data : datas) { data.delete(user); diff --git a/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentJobSupport.java b/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentJobSupport.java index 9ce69da1..4bd5522f 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentJobSupport.java +++ b/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentJobSupport.java @@ -17,9 +17,7 @@ import org.labkey.panoramapublic.model.ExperimentAnnotations; import org.labkey.panoramapublic.model.Journal; - -import java.io.File; -import java.nio.file.Path; +import org.labkey.vfs.FileLike; /** * User: vsharma @@ -32,7 +30,7 @@ public interface CopyExperimentJobSupport Journal getJournal(); - File getExportDir(); + FileLike getExportDir(); String getReviewerEmailPrefix(); @@ -48,5 +46,5 @@ public interface CopyExperimentJobSupport String getPreviousVersionName(); - void setExportTargetPath(Path exportTargetPath); + void setExportTargetPath(FileLike exportTargetPath); } diff --git a/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentPipelineJob.java b/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentPipelineJob.java index a6b3a594..a77853ab 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentPipelineJob.java +++ b/panoramapublic/src/org/labkey/panoramapublic/pipeline/CopyExperimentPipelineJob.java @@ -30,13 +30,9 @@ import org.labkey.api.view.ActionURL; import org.labkey.api.view.NotFoundException; import org.labkey.api.view.ViewBackgroundInfo; -import org.labkey.panoramapublic.PanoramaPublicModule; import org.labkey.panoramapublic.model.ExperimentAnnotations; import org.labkey.panoramapublic.model.Journal; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; +import org.labkey.vfs.FileLike; /** * User: vsharma @@ -63,7 +59,7 @@ public class CopyExperimentPipelineJob extends PipelineJob implements CopyExperi private String _previousVersionName; - private Path _exportTargetPath; + private FileLike _exportTargetPath; private Container _exportSourceContainer; @@ -93,7 +89,7 @@ public CopyExperimentPipelineJob(ViewBackgroundInfo info, PipeRoot root, Experim // CONSIDER: Add a static factory method to LocalDirectory instead of using the constructor. // create(@NotNull PipeRoot root, @NotNull String moduleName, @NotNull String baseLogFileName, @NotNull String localDirPath, boolean temporary) - LocalDirectory localDirectory = new LocalDirectory(targetRoot.getContainer(), PanoramaPublicModule.NAME, root, baseLogFileName); + LocalDirectory localDirectory = new LocalDirectory(targetRoot.getContainer(), root, baseLogFileName); setLocalDirectory(localDirectory); setLogFile(localDirectory.determineLogFile()); @@ -119,7 +115,7 @@ public String getDescription() } @Override - public TaskPipeline getTaskPipeline() + public TaskPipeline getTaskPipeline() { return PipelineJobService.get().getTaskPipeline(new TaskId(CopyExperimentPipelineJob.class)); } @@ -134,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() { @@ -160,9 +143,9 @@ public Journal getJournal() } @Override - public File getExportDir() + public FileLike getExportDir() { - return _exportTargetPath.toFile(); + return _exportTargetPath; } @Override @@ -254,7 +237,7 @@ public void setPreviousVersionName(String previousVersionName) } @Override - public void setExportTargetPath(Path exportTargetPath) + public void setExportTargetPath(FileLike exportTargetPath) { _exportTargetPath = exportTargetPath; } diff --git a/panoramapublic/src/org/labkey/panoramapublic/pipeline/ExperimentExportTask.java b/panoramapublic/src/org/labkey/panoramapublic/pipeline/ExperimentExportTask.java index 01a3c297..27b6d625 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/pipeline/ExperimentExportTask.java +++ b/panoramapublic/src/org/labkey/panoramapublic/pipeline/ExperimentExportTask.java @@ -16,7 +16,6 @@ package org.labkey.panoramapublic.pipeline; import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; import org.labkey.api.admin.FolderArchiveDataTypes; import org.labkey.api.admin.FolderExportContext; @@ -36,8 +35,8 @@ import org.labkey.api.util.PageFlowUtil; import org.labkey.api.writer.FileSystemFile; import org.labkey.panoramapublic.model.ExperimentAnnotations; +import org.labkey.vfs.FileLike; -import java.io.File; import java.util.Collections; import java.util.List; import java.util.Set; @@ -49,8 +48,6 @@ */ public class ExperimentExportTask extends PipelineJob.Task { - private static final Logger _log = LogManager.getLogger(ExperimentExportTask.class); - private ExperimentExportTask(Factory factory, PipelineJob job) { super(factory, job); @@ -117,15 +114,15 @@ public void writeExperiment(CopyExperimentJobSupport support, ExperimentAnnotati false, false, new StaticLoggerGetter(LogManager.getLogger(FolderWriterImpl.class))); - File exportDir = support.getExportDir(); + FileLike exportDir = support.getExportDir(); FileUtil.deleteDir(exportDir); if(exportDir.exists()) { - throw new Exception("Could not delete already existing export directory " + exportDir.getAbsolutePath()); + throw new Exception("Could not delete already existing export directory " + exportDir); } - if(!exportDir.mkdir()) + if(!FileUtil.mkdir(exportDir)) { - throw new Exception("Could not create directory " + exportDir.getAbsolutePath()); + throw new Exception("Could not create directory " + exportDir); } FileSystemFile vf = new FileSystemFile(exportDir); @@ -143,7 +140,7 @@ public Factory() } @Override - public PipelineJob.Task createTask(PipelineJob job) + public ExperimentExportTask createTask(PipelineJob job) { return new ExperimentExportTask(this, job); } diff --git a/panoramapublic/src/org/labkey/panoramapublic/pipeline/ExperimentImportTask.java b/panoramapublic/src/org/labkey/panoramapublic/pipeline/ExperimentImportTask.java index 75411602..b3f8330a 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/pipeline/ExperimentImportTask.java +++ b/panoramapublic/src/org/labkey/panoramapublic/pipeline/ExperimentImportTask.java @@ -29,6 +29,7 @@ import org.labkey.api.util.FileType; import org.labkey.api.writer.FileSystemFile; import org.labkey.api.writer.VirtualFile; +import org.labkey.vfs.FileLike; import java.io.File; import java.util.Collections; @@ -74,23 +75,23 @@ public RecordedActionSet run() throws PipelineJobException public static void doImport(PipelineJob job, CopyExperimentJobSupport jobSupport) throws Exception { - File importDir = jobSupport.getExportDir(); + FileLike importDir = jobSupport.getExportDir(); if (!importDir.exists()) { throw new Exception("TargetedMS experiment import failed: Could not find directory \"" + importDir.getName() + "\""); } - File folderXml = new File(importDir, "folder.xml"); + FileLike folderXml = importDir.resolveChild("folder.xml"); if(!folderXml.exists()) { - throw new Exception("This directory doesn't contain an appropriate xml: " + importDir.getAbsolutePath()); + throw new Exception("This directory doesn't contain an appropriate xml: " + importDir); } User user = job.getUser(); Container container = job.getContainer(); - VirtualFile importJobRoot = new FileSystemFile(folderXml.getParentFile()); - FolderImportContext importCtx = new FolderImportContext(user, container, folderXml.toPath(), + VirtualFile importJobRoot = new FileSystemFile(folderXml.getParent()); + FolderImportContext importCtx = new FolderImportContext(user, container, folderXml, null, new PipelineJobLoggerGetter(job), importJobRoot); importCtx.setSkipQueryValidation(true); @@ -110,7 +111,7 @@ public Factory() } @Override - public PipelineJob.Task createTask(PipelineJob job) + public ExperimentImportTask createTask(PipelineJob job) { return new ExperimentImportTask(this, job); } diff --git a/panoramapublic/src/org/labkey/panoramapublic/pipeline/FilesMetadataImporter.java b/panoramapublic/src/org/labkey/panoramapublic/pipeline/FilesMetadataImporter.java index c6f9fa74..40786375 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/pipeline/FilesMetadataImporter.java +++ b/panoramapublic/src/org/labkey/panoramapublic/pipeline/FilesMetadataImporter.java @@ -9,6 +9,7 @@ import org.labkey.api.pipeline.PipelineJobException; import org.labkey.api.query.ValidationException; import org.labkey.api.security.User; +import org.labkey.api.util.XmlBeansUtil; import org.labkey.api.writer.VirtualFile; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -17,7 +18,6 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; -import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.io.InputStream; @@ -72,7 +72,7 @@ private void readXmlAndImport(Container container, VirtualFile vf, FileContentSe return; } - Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(is)); + Document document = XmlBeansUtil.DOCUMENT_BUILDER_FACTORY.newDocumentBuilder().parse(new InputSource(is)); NodeList nodes = document.getElementsByTagName(FilesMetadataWriter.FILE); for(int i = 0; i < nodes.getLength(); i++) { diff --git a/panoramapublic/src/org/labkey/panoramapublic/pipeline/FilesMetadataWriter.java b/panoramapublic/src/org/labkey/panoramapublic/pipeline/FilesMetadataWriter.java index 5ff51c40..3c99d0cf 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/pipeline/FilesMetadataWriter.java +++ b/panoramapublic/src/org/labkey/panoramapublic/pipeline/FilesMetadataWriter.java @@ -11,12 +11,12 @@ import org.labkey.api.files.FileContentService; import org.labkey.api.pipeline.PipelineJobException; import org.labkey.api.security.User; +import org.labkey.api.util.XmlBeansUtil; import org.labkey.api.writer.FileSystemFile; import org.labkey.api.writer.VirtualFile; import org.w3c.dom.Document; import org.w3c.dom.Element; -import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; @@ -76,7 +76,7 @@ private void writeFilesMetadata(VirtualFile vf, Container container, boolean inc private void writeFilesXml(Container container, ExperimentService expSvc, FileContentService fcs, PrintWriter writer, Logger log) throws ParserConfigurationException, TransformerException { - Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + Document doc = XmlBeansUtil.DOCUMENT_BUILDER_FACTORY.newDocumentBuilder().newDocument(); List expDatasWithComments = getExpDatasWithComments(container, expSvc); diff --git a/panoramapublic/src/org/labkey/panoramapublic/pipeline/PostPanoramaPublicMessageJob.java b/panoramapublic/src/org/labkey/panoramapublic/pipeline/PostPanoramaPublicMessageJob.java index 91053ae4..c0b6b287 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/pipeline/PostPanoramaPublicMessageJob.java +++ b/panoramapublic/src/org/labkey/panoramapublic/pipeline/PostPanoramaPublicMessageJob.java @@ -41,7 +41,7 @@ public PostPanoramaPublicMessageJob(ViewBackgroundInfo info, @NotNull PipeRoot r String titlePrefix, boolean test) { super("Panorama Public", info, root); - setLogFile(root.getRootNioPath().resolve(FileUtil.makeFileNameWithTimestamp("PanoramaPublic-post-to-message-thread", "log"))); + setLogFile(root.resolvePathToFileLike(FileUtil.makeFileNameWithTimestamp("PanoramaPublic-post-to-message-thread", "log"))); _experimentAnnotationsIds = experimentAnnotationsIds; _message = message; _titlePrefix = titlePrefix; diff --git a/panoramapublic/src/org/labkey/panoramapublic/pipeline/PrivateDataReminderJob.java b/panoramapublic/src/org/labkey/panoramapublic/pipeline/PrivateDataReminderJob.java index 47d9d962..e65a453a 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/pipeline/PrivateDataReminderJob.java +++ b/panoramapublic/src/org/labkey/panoramapublic/pipeline/PrivateDataReminderJob.java @@ -58,7 +58,7 @@ public PrivateDataReminderJob(ViewBackgroundInfo info, @NotNull PipeRoot root, b public PrivateDataReminderJob(ViewBackgroundInfo info, @NotNull PipeRoot root, Journal panoramaPublic, List experimentAnnotationsIds, boolean test) { super("Panorama Public", info, root); - setLogFile(root.getRootFileLike().toNioPathForWrite().resolve(FileUtil.makeFileNameWithTimestamp("PanoramaPublic-private-data-reminder", "log"))); + setLogFile(root.getRootFileLike().resolveChild(FileUtil.makeFileNameWithTimestamp("PanoramaPublic-private-data-reminder", "log"))); _panoramaPublic = panoramaPublic; _experimentAnnotationsIds = experimentAnnotationsIds; 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/NcbiUtils.java b/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/NcbiUtils.java index c599dd9f..a32390fc 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/NcbiUtils.java +++ b/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/NcbiUtils.java @@ -23,6 +23,7 @@ import org.labkey.api.collections.IntHashMap; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; +import org.labkey.api.util.XmlBeansUtil; import org.labkey.api.util.logging.LogHelper; import org.labkey.api.view.AjaxCompletion; import org.w3c.dom.CharacterData; @@ -33,7 +34,6 @@ import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.BufferedReader; import java.io.IOException; @@ -43,7 +43,6 @@ import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; @@ -134,8 +133,7 @@ public static Map getScientificNames(List taxIds) thro if (status == HttpURLConnection.HTTP_OK) { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); + DocumentBuilder builder = XmlBeansUtil.DOCUMENT_BUILDER_FACTORY.newDocumentBuilder(); Document doc = builder.parse(conn.getInputStream()); NodeList nodes = doc.getElementsByTagName("DocSum"); 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); } diff --git a/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/PsiInstrumentParser.java b/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/PsiInstrumentParser.java index 0c8b7d80..c8e7d51b 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/PsiInstrumentParser.java +++ b/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/PsiInstrumentParser.java @@ -22,6 +22,7 @@ import org.labkey.api.resource.FileResource; import org.labkey.api.targetedms.TargetedMSService; import org.labkey.api.util.Path; +import org.labkey.api.util.XmlBeansUtil; import org.labkey.api.util.logging.LogHelper; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -30,7 +31,6 @@ import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.File; import java.io.IOException; @@ -94,12 +94,11 @@ public static List getInstruments() throws PxException { throw new PxException("File not found: psi-ms-PARSED.xml."); } - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db; Document document; try { - db = dbf.newDocumentBuilder(); + db = XmlBeansUtil.DOCUMENT_BUILDER_FACTORY.newDocumentBuilder(); document = db.parse(file); } catch (ParserConfigurationException | SAXException | IOException e) diff --git a/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/UnimodParser.java b/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/UnimodParser.java index 25a3d463..f9c54703 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/UnimodParser.java +++ b/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/UnimodParser.java @@ -20,6 +20,7 @@ import org.labkey.api.module.ModuleLoader; import org.labkey.api.resource.FileResource; import org.labkey.api.util.Path; +import org.labkey.api.util.XmlBeansUtil; import org.labkey.panoramapublic.PanoramaPublicModule; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -28,7 +29,6 @@ import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.File; import java.io.IOException; @@ -77,13 +77,11 @@ private void parse(File unimodXml, UnimodModifications uMods, boolean isPrimaryX { throw new PxException("UNIMOD xml file does not exist: " + unimodXml); } - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - dbf.setNamespaceAware(true); DocumentBuilder db; Document document; try { - db = dbf.newDocumentBuilder(); + db = XmlBeansUtil.DOCUMENT_BUILDER_FACTORY.newDocumentBuilder(); document = db.parse(unimodXml); } catch (ParserConfigurationException | SAXException | IOException e) @@ -122,7 +120,7 @@ private void readAminoAcids(Element root, UnimodModifications uMods) throws PxEx private void parseAminoAcid(Element aaEl, UnimodModifications uMods) throws PxException { String title = aaEl.getAttribute("title"); - if(title == null || title.length() > 1 || !Character.isUpperCase(title.charAt(0))) + if(title.length() > 1 || !Character.isUpperCase(title.charAt(0))) { return; } diff --git a/panoramapublic/src/org/labkey/panoramapublic/query/ExperimentAnnotationsTableInfo.java b/panoramapublic/src/org/labkey/panoramapublic/query/ExperimentAnnotationsTableInfo.java index d3333f9e..ae427a7f 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/query/ExperimentAnnotationsTableInfo.java +++ b/panoramapublic/src/org/labkey/panoramapublic/query/ExperimentAnnotationsTableInfo.java @@ -529,7 +529,7 @@ public ExperimentUserForeignKey(UserSchema userSchema, FieldKey fieldKey) } @Override - public NamedObjectList getSelectList(RenderContext ctx) + public @NotNull NamedObjectList getSelectList(RenderContext ctx) { NamedObjectList objectList = new NamedObjectList(); diff --git a/panoramapublic/src/org/labkey/panoramapublic/query/JournalManager.java b/panoramapublic/src/org/labkey/panoramapublic/query/JournalManager.java index 77dc5048..3f4f6f03 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/query/JournalManager.java +++ b/panoramapublic/src/org/labkey/panoramapublic/query/JournalManager.java @@ -210,7 +210,7 @@ private static void changeJournalPermissions(ExperimentAnnotations exptAnnotatio private static void addPermission(Container folder, UserPrincipal journalGroup) { SecurityPolicy oldPolicy = folder.getPolicy(); - if (oldPolicy.getOwnPermissions(journalGroup).contains(FolderExportPermission.class)) + if (oldPolicy.getOwnPermissions(journalGroup).anyMatch(permClass -> permClass == FolderExportPermission.class)) return; MutableSecurityPolicy newPolicy = new MutableSecurityPolicy(folder, oldPolicy); @@ -249,19 +249,16 @@ private static void addPermission(Container folder, UserPrincipal journalGroup) private static void removePermission(Container folder, UserPrincipal journalGroup) { SecurityPolicy oldPolicy = folder.getPolicy(); - if (!oldPolicy.getOwnPermissions(journalGroup).contains(FolderExportPermission.class)) + if (oldPolicy.getOwnPermissions(journalGroup).noneMatch(permClass -> permClass == FolderExportPermission.class)) return; - List roles = oldPolicy.getAssignedRoles(journalGroup); MutableSecurityPolicy newPolicy = new MutableSecurityPolicy(folder, oldPolicy); newPolicy.clearAssignedRoles(journalGroup); - for(Role role: roles) - { - if(!(role instanceof CopyTargetedMSExperimentRole)) - { - newPolicy.addRoleAssignment(journalGroup, role); - } - } + + oldPolicy.getAssignedRoles(journalGroup) + .filter(role -> !(role instanceof CopyTargetedMSExperimentRole)) + .forEach(role -> newPolicy.addRoleAssignment(journalGroup, role)); + SecurityPolicyManager.savePolicy(newPolicy, User.getAdminServiceUser()); } diff --git a/panoramapublic/src/org/labkey/panoramapublic/query/SubmissionManager.java b/panoramapublic/src/org/labkey/panoramapublic/query/SubmissionManager.java index d9fc46f4..972930b3 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/query/SubmissionManager.java +++ b/panoramapublic/src/org/labkey/panoramapublic/query/SubmissionManager.java @@ -279,7 +279,7 @@ private static void ensureEditorRole(@NotNull ShortURLRecord shortUrl, User user // A folder admin updating the submission request made by another submitter may want to change the shortUrl. They // will need permission to delete the old shortUrl. MutableSecurityPolicy policy = new MutableSecurityPolicy(SecurityPolicyManager.getPolicy(shortUrl)); - boolean isEditor = policy.getAssignedRoles(user).stream().anyMatch(r -> r instanceof EditorRole); + boolean isEditor = policy.getAssignedRoles(user).anyMatch(r -> r instanceof EditorRole); if (!isEditor) { policy.addRoleAssignment(user, EditorRole.class); diff --git a/panoramapublic/src/org/labkey/panoramapublic/view/expannotations/experimentDetails.jsp b/panoramapublic/src/org/labkey/panoramapublic/view/expannotations/experimentDetails.jsp index 38426cad..304b954a 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/view/expannotations/experimentDetails.jsp +++ b/panoramapublic/src/org/labkey/panoramapublic/view/expannotations/experimentDetails.jsp @@ -36,18 +36,17 @@ <%@ page import="org.labkey.panoramapublic.model.JournalSubmission" %> <%@ page import="org.labkey.panoramapublic.model.Submission" %> <%@ page import="org.labkey.panoramapublic.model.validation.DataValidation" %> -<%@ page import="static org.labkey.api.util.DOM.SPAN" %> -<%@ page import="static org.labkey.api.util.DOM.Attribute.style" %> <%@ page import="org.labkey.panoramapublic.model.validation.PxStatus" %> -<%@ page import="static org.labkey.api.util.DOM.Attribute.title" %> -<%@ page import="static org.labkey.api.util.DOM.Attribute.href" %> <%@ page import="org.labkey.panoramapublic.proteomexchange.ProteomeXchangeService" %> <%@ page import="org.labkey.panoramapublic.query.CatalogEntryManager" %> <%@ page import="org.labkey.panoramapublic.query.DataValidationManager" %> <%@ page import="org.labkey.panoramapublic.query.JournalManager" %> <%@ page import="org.labkey.panoramapublic.view.publish.CatalogEntryWebPart" %> <%@ page import="java.text.SimpleDateFormat" %> -<%@ page import="org.labkey.api.util.LinkBuilder" %> +<%@ page import="static org.labkey.api.util.DOM.SPAN" %> +<%@ page import="static org.labkey.api.util.DOM.Attribute.style" %> +<%@ page import="static org.labkey.api.util.DOM.Attribute.title" %> +<%@ page import="static org.labkey.api.util.DOM.Attribute.href" %> <%@ page extends="org.labkey.api.jsp.JspBase" %> <%! @@ -109,7 +108,7 @@ StringBuilder status = new StringBuilder(); if (DataValidationManager.isValidationOutdated(validation, annot, getUser())) { - DOM.A(DOM.at(href, viewExptDetailsUrl.toContainerRelativeURL()), + DOM.A(DOM.at(href, viewExptDetailsUrl.toRelativeURL()), DOM.SPAN(DOM.cl("labkey-error"), SPAN(DOM.at(style, "background-color: #FFF6D8;margin:2px;font-weight:bold;"), "PX validation is outdated"))) .appendTo(status); } @@ -121,7 +120,7 @@ PxStatus.IncompleteMetadata == pxStatus ? "pxv-circle-incomplete" : "pxv-circle-invalid"); String pxStatusStr = PxStatus.NotValid == pxStatus ? pxStatus.getLabel() : ("ProteomeXchange status: " + pxStatus.getLabel()); - DOM.A(DOM.at(href, viewExptDetailsUrl.toContainerRelativeURL()), + DOM.A(DOM.at(href, viewExptDetailsUrl.toRelativeURL()), DOM.SPAN(DOM.at(title, pxStatusStr), DOM.SPAN(DOM.cl(pxCls), "PX"))) .appendTo(status); } diff --git a/panoramapublic/src/org/labkey/panoramapublic/view/search/panoramaWebSearch.jsp b/panoramapublic/src/org/labkey/panoramapublic/view/search/panoramaWebSearch.jsp index ad5ff6f1..1727d306 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/view/search/panoramaWebSearch.jsp +++ b/panoramapublic/src/org/labkey/panoramapublic/view/search/panoramaWebSearch.jsp @@ -361,21 +361,26 @@ let instrument = document.getElementById(instrumentItemId).value; let expSearchParams = ""; + let separator = ""; if (author) { expAnnotationFilters.push(createFilter(authorsItemId, author)); - expSearchParams += "Targeted MS Experiment List." + "authors~containsoneof" + "=" + encodeURIComponent(author) + "&"; + expSearchParams += separator + "Targeted MS Experiment List." + "authors~containsoneof=" + encodeURIComponent(author); + separator = "&"; } if (title) { expAnnotationFilters.push(createFilter(titleItemId, title)); - expSearchParams += "Targeted MS Experiment List." + "title~containsoneof" + "=" + encodeURIComponent(title) + "&"; + expSearchParams += separator + "Targeted MS Experiment List." + "title~containsoneof=" + encodeURIComponent(title); + separator = "&"; } if (organism) { expAnnotationFilters.push(createFilter(organismItemId, organism)); - expSearchParams += "Targeted MS Experiment List." + "organism~containsoneof" + "=" + encodeURIComponent(organism.replaceAll(",", ";")) + "&"; + expSearchParams += separator + "Targeted MS Experiment List." + "organism~containsoneof=" + encodeURIComponent(organism.replaceAll(",", ";")); + separator = "&"; } if (instrument) { expAnnotationFilters.push(createFilter(instrumentItemId, instrument)); - expSearchParams += "Targeted MS Experiment List." + "instrument~containsoneof" + "=" + encodeURIComponent(instrument.replaceAll(",", ";")); + expSearchParams += separator + "Targeted MS Experiment List." + "instrument~containsoneof" + "=" + encodeURIComponent(instrument.replaceAll(",", ";")); + separator = "&"; } if (expSearchParams !== "") { location.replace(window.location.href + "?" + expSearchParams); diff --git a/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicBaseTest.java b/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicBaseTest.java index 9dc6eea8..a88c383e 100644 --- a/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicBaseTest.java +++ b/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicBaseTest.java @@ -14,6 +14,7 @@ import org.labkey.test.Locator; import org.labkey.test.TestFileUtils; import org.labkey.test.TestTimeoutException; +import org.labkey.test.WebTestHelper; import org.labkey.test.components.BodyWebPart; import org.labkey.test.components.SubfoldersWebPart; import org.labkey.test.components.panoramapublic.TargetedMsExperimentInsertPage; @@ -113,10 +114,6 @@ public static void initProject() @After public void afterTest() throws IOException, CommandException { - if (isImpersonating()) - { - stopImpersonating(); - } verifySymlinks(); } @@ -149,7 +146,7 @@ private void createPanoramaPublicJournalProject() boolean verifySymlinks() throws IOException, CommandException { - Connection connection = createDefaultConnection(); + Connection connection = WebTestHelper.getRemoteApiConnection(false); SimpleGetCommand command = new SimpleGetCommand("PanoramaPublic", "verifySymlinks"); CommandResponse verifyResponse = command.execute(connection, "/"); diff --git a/testresults/src/org/labkey/testresults/TestResultsController.java b/testresults/src/org/labkey/testresults/TestResultsController.java index 345ff79e..997c28b7 100644 --- a/testresults/src/org/labkey/testresults/TestResultsController.java +++ b/testresults/src/org/labkey/testresults/TestResultsController.java @@ -56,6 +56,7 @@ import org.labkey.api.util.FileUtil; import org.labkey.api.util.MimeMap; import org.labkey.api.util.Pair; +import org.labkey.api.util.XmlBeansUtil; import org.labkey.api.view.JspView; import org.labkey.api.view.NavTree; import org.labkey.api.view.ViewContext; @@ -93,7 +94,6 @@ import javax.management.modelmbean.XMLParseException; import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; @@ -1381,8 +1381,7 @@ private static void ParseAndStoreXML(String xml, Container c) throws Exception "\\[(\\d\\d):(\\d\\d)]\\s+(\\d+)\\.\\d+\\s+([A-Za-z]\\w*)\\s+\\(([A-Za-z]+)\\)"); try (DbScope.Transaction transaction = TestResultsSchema.getSchema().getScope().ensureTransaction()) { - DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + DocumentBuilder dBuilder = XmlBeansUtil.DOCUMENT_BUILDER_FACTORY.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); Document doc = dBuilder.parse(is);