diff --git a/OpenLdapSync/resources/views/ldapSettings.view.xml b/OpenLdapSync/resources/views/ldapSettings.view.xml index 9b9473d9f..b510de0ca 100644 --- a/OpenLdapSync/resources/views/ldapSettings.view.xml +++ b/OpenLdapSync/resources/views/ldapSettings.view.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/OpenLdapSync/src/org/labkey/openldapsync/ldap/LdapSettings.java b/OpenLdapSync/src/org/labkey/openldapsync/ldap/LdapSettings.java index f19173528..3bb0dca29 100644 --- a/OpenLdapSync/src/org/labkey/openldapsync/ldap/LdapSettings.java +++ b/OpenLdapSync/src/org/labkey/openldapsync/ldap/LdapSettings.java @@ -3,6 +3,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.directory.api.ldap.model.exception.LdapException; import org.labkey.api.data.PropertyManager; +import org.labkey.api.data.PropertyManager.WritablePropertyMap; import org.labkey.api.security.User; import org.labkey.api.security.UserManager; import org.labkey.api.security.ValidEmail; @@ -112,13 +113,13 @@ public static void setLdapSettings(Map props, Map @@ -185,19 +185,15 @@ if (project.findProject(BuildUtils.getTestProjectPath(project.gradle)) != null & }) task.destinationDir = configDir - if (BuildUtils.useEmbeddedTomcat(project)) { - rootProject.allprojects { - task.mustRunAfter tasks.withType(DoThenSetup) - } + rootProject.allprojects { + task.mustRunAfter tasks.withType(DoThenSetup) } } testProject.tasks.named("startTomcat").configure { dependsOn(createPipelineConfigTask) - if (BuildUtils.useEmbeddedTomcat(project)) { - it.doFirst { - new File(new File(BuildUtils.getEmbeddedConfigPath(project)), "application.properties") - << "\ncontext.pipelineConfig=${configDir.getAbsolutePath().replace("\\", "\\\\")}" - } + it.doFirst { + new File(new File(BuildUtils.getEmbeddedConfigPath(project)), "application.properties") + << "\ncontext.pipelineConfig=${configDir.getAbsolutePath().replace("\\", "\\\\")}" } } } diff --git a/SequenceAnalysis/pipeline_code/sequence_tools_install.sh b/SequenceAnalysis/pipeline_code/sequence_tools_install.sh index 12d7321cb..7a8946901 100755 --- a/SequenceAnalysis/pipeline_code/sequence_tools_install.sh +++ b/SequenceAnalysis/pipeline_code/sequence_tools_install.sh @@ -818,9 +818,9 @@ then install ./cutadapt-1.8.1/bin/_preamble.py ${LKTOOLS_DIR}/_preamble.py cp -R ./cutadapt-1.8.1/cutadapt ${LKTOOLS_DIR}/cutadapt else - $PIP_EXE install --user cutadapt==4.2 + $PIP_EXE install --user --break-system-packages cutadapt==4.2 $PIP_EXE show cutadapt - $PIP_EXE install --user pyinstaller + $PIP_EXE install --user --break-system-packages pyinstaller $PIP_EXE show pyinstaller ~/.local/bin/pyinstaller --onefile --clean ~/.local/bin/cutadapt cp ./dist/cutadapt ${LKTOOLS_DIR}/cutadapt diff --git a/SequenceAnalysis/resources/views/importFasta.view.xml b/SequenceAnalysis/resources/views/importFasta.view.xml index b6f2f7655..3b317b30f 100644 --- a/SequenceAnalysis/resources/views/importFasta.view.xml +++ b/SequenceAnalysis/resources/views/importFasta.view.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/SequenceAnalysis/resources/views/importTracks.view.xml b/SequenceAnalysis/resources/views/importTracks.view.xml index 4158cfcb8..8da8edb7a 100644 --- a/SequenceAnalysis/resources/views/importTracks.view.xml +++ b/SequenceAnalysis/resources/views/importTracks.view.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/SequenceAnalysis/resources/views/sequenceDefaults.view.xml b/SequenceAnalysis/resources/views/sequenceDefaults.view.xml index 7c6c756bd..1b574fcf9 100644 --- a/SequenceAnalysis/resources/views/sequenceDefaults.view.xml +++ b/SequenceAnalysis/resources/views/sequenceDefaults.view.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/SequenceAnalysis/resources/views/siteAdmin.view.xml b/SequenceAnalysis/resources/views/siteAdmin.view.xml index d13a756fe..eb5771bc0 100644 --- a/SequenceAnalysis/resources/views/siteAdmin.view.xml +++ b/SequenceAnalysis/resources/views/siteAdmin.view.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java index f40f73ba0..9e2e7f686 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java @@ -19,6 +19,8 @@ import htsjdk.tribble.TribbleException; import htsjdk.variant.vcf.VCFFileReader; import htsjdk.variant.vcf.VCFHeader; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.ArrayUtils; @@ -59,6 +61,7 @@ import org.labkey.api.data.ConvertHelper; import org.labkey.api.data.DataRegionSelection; import org.labkey.api.data.PropertyManager; +import org.labkey.api.data.PropertyManager.WritablePropertyMap; import org.labkey.api.data.Results; import org.labkey.api.data.ResultsImpl; import org.labkey.api.data.SQLFragment; @@ -167,14 +170,13 @@ import org.labkey.sequenceanalysis.util.ChainFileValidator; import org.labkey.sequenceanalysis.util.FastqUtils; import org.labkey.sequenceanalysis.util.SequenceUtil; +import org.labkey.vfs.FileLike; import org.springframework.beans.PropertyValues; import org.springframework.validation.BindException; import org.springframework.validation.Errors; import org.springframework.web.bind.ServletRequestParameterPropertyValues; import org.springframework.web.servlet.ModelAndView; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -2015,22 +2017,22 @@ else if (!d.getFile().exists()) } else if (o.has("relPath") || o.has("fileName")) { - File f; + FileLike f; if (o.opt("relPath") == null) { if (path != null) { - f = pr.resolvePath(path); - f = new File(f, o.getString("fileName")); + f = pr.resolvePathToFileLike(path); + f = f.resolveFile(Path.parse(o.getString("fileName"))); } else { - f = pr.resolvePath(o.getString("fileName")); + f = pr.resolvePathToFileLike(o.getString("fileName")); } } else { - f = pr.resolvePath(o.getString("relPath")); + f = pr.resolvePathToFileLike(o.getString("relPath")); } if (f == null || !f.exists()) @@ -2038,7 +2040,7 @@ else if (o.has("relPath") || o.has("fileName")) throw new PipelineValidationException("Unknown file: " + o.getString("relPath") + " / " + o.getString("fileName")); } - ret.add(f); + ret.add(f.toNioPathForRead().toFile()); } else if (o.opt("filePath") != null) { @@ -2554,8 +2556,8 @@ protected File getTargetFile(String filename) throws IOException try { - File targetDirectory = AssayFileWriter.ensureUploadDirectory(getContainer(), "sequenceOutputs"); - return AssayFileWriter.findUniqueFileName(filename, targetDirectory); + FileLike targetDirectory = AssayFileWriter.ensureUploadDirectory(getContainer(), "sequenceOutputs"); + return AssayFileWriter.findUniqueFileName(filename, targetDirectory).toNioPathForWrite().toFile(); } catch (ExperimentException e) { @@ -2687,8 +2689,8 @@ protected File getTargetFile(String filename) throws IOException try { - File targetDirectory = AssayFileWriter.ensureUploadDirectory(getContainer()); - return AssayFileWriter.findUniqueFileName(filename, targetDirectory); + FileLike targetDirectory = AssayFileWriter.ensureUploadDirectory(getContainer()); + return AssayFileWriter.findUniqueFileName(filename, targetDirectory).toNioPathForWrite().toFile(); } catch (ExperimentException e) { @@ -2852,8 +2854,8 @@ protected File getTargetFile(String filename) throws IOException try { - File targetDirectory = AssayFileWriter.ensureUploadDirectory(getContainer()); - return AssayFileWriter.findUniqueFileName(filename, targetDirectory); + FileLike targetDirectory = AssayFileWriter.ensureUploadDirectory(getContainer()); + return AssayFileWriter.findUniqueFileName(filename, targetDirectory).toNioPathForWrite().toFile(); } catch (ExperimentException e) { @@ -3642,7 +3644,7 @@ else if (fastaFileType.isType(data.getFile())) } } - File dict = new File(data.getFile().getParentFile(), FileUtil.getBaseName(data.getFile()) + ".dict"); + File dict = FileUtil.appendName(data.getFile().getParentFile(), FileUtil.getBaseName(data.getFile()) + ".dict"); if (dict.exists()) { files.add(dict); @@ -4141,10 +4143,10 @@ public ApiResponse execute(ImportOutputFilesForm form, BindException errors) thr return null; } - File targetDirectory = AssayFileWriter.ensureUploadDirectory(getContainer(), "sequenceOutputs"); + FileLike targetDirectory = AssayFileWriter.ensureUploadDirectory(getContainer(), "sequenceOutputs"); if (!targetDirectory.exists()) { - targetDirectory.mkdirs(); + targetDirectory.mkdir(); } if (form.getRecords() != null) @@ -4154,7 +4156,7 @@ public ApiResponse execute(ImportOutputFilesForm form, BindException errors) thr Map> toCreate = new HashMap<>(); for (JSONObject o : JsonUtil.toJSONObjectList(arr)) { - File file = new File(dirData, o.getString("fileName")); + File file = FileUtil.appendName(dirData, o.getString("fileName")); if (!file.exists()) { errors.reject(ERROR_MSG, "Unknown file: " + file.getPath()); @@ -4195,8 +4197,8 @@ public ApiResponse execute(ImportOutputFilesForm form, BindException errors) thr for (File file : toCreate.keySet()) { - File target = AssayFileWriter.findUniqueFileName(file.getName(), targetDirectory); - FileUtils.moveFile(file, target); + FileLike target = AssayFileWriter.findUniqueFileName(file.getName(), targetDirectory); + FileUtils.moveFile(file, target.toNioPathForWrite().toFile()); ExpData data = ExperimentService.get().createData(getContainer(), new DataType("Sequence Output")); data.setName(file.getName()); @@ -4235,14 +4237,14 @@ public ApiResponse execute(ImportOutputFilesForm form, BindException errors) thr } _log.info("moving associated file: " + idx.getPath() + ", to: " + idxTargetName); - File idxTarget = new File(targetDirectory, idxTargetName); + FileLike idxTarget = targetDirectory.resolveChild(idxTargetName); if (idxTarget.exists()) { _log.error("target already exists, skipping: " + idxTargetName); } else { - FileUtils.moveFile(idx, idxTarget); + FileUtils.moveFile(idx, idxTarget.toNioPathForWrite().toFile()); ExpData idxData = ExperimentService.get().createData(getContainer(), new DataType("Sequence Output")); idxData.setName(idxTarget.getName()); @@ -4971,7 +4973,7 @@ public static class SetSequenceImportDefaultsAction extends MutatingApiAction inputs, List metricsFiles = new ArrayList<>(); - File mf = new File(outputDir, FileUtil.getBaseName(o.getFile()) + ".summary.metrics"); + File mf = FileUtil.appendName(outputDir, FileUtil.getBaseName(o.getFile()) + ".summary.metrics"); if (mf.exists()) { metricsFiles.add(mf); @@ -181,7 +181,7 @@ else if (collectSummary) throw new PipelineJobException("Missing file: " + mf.getPath()); } - File mf2 = new File(outputDir, FileUtil.getBaseName(o.getFile()) + ".insertsize.metrics"); + File mf2 = FileUtil.appendName(outputDir, FileUtil.getBaseName(o.getFile()) + ".insertsize.metrics"); if (mf2.exists()) { metricsFiles.add(mf2); @@ -199,7 +199,7 @@ else if (collectInsertSize) } } - File mf3 = new File(outputDir, FileUtil.getBaseName(o.getFile()) + ".wgs.metrics"); + File mf3 = FileUtil.appendName(outputDir, FileUtil.getBaseName(o.getFile()) + ".wgs.metrics"); if (mf3.exists()) { metricsFiles.add(mf3); @@ -209,7 +209,7 @@ else if (collectWgs) throw new PipelineJobException("Missing file: " + mf3.getPath()); } - File mf4 = new File(outputDir, FileUtil.getBaseName(o.getFile()) + ".wgsNonZero.metrics"); + File mf4 = FileUtil.appendName(outputDir, FileUtil.getBaseName(o.getFile()) + ".wgsNonZero.metrics"); if (mf4.exists()) { metricsFiles.add(mf4); @@ -284,7 +284,7 @@ public void processFilesRemote(List inputFiles, JobContext c { job.getLogger().info("calculating summary metrics"); job.setStatus(PipelineJob.TaskStatus.running, "CALCULATING SUMMARY METRICS"); - File metricsFile = new File(ctx.getOutputDir(), FileUtil.getBaseName(o.getFile()) + ".summary.metrics"); + File metricsFile = FileUtil.appendName(ctx.getOutputDir(), FileUtil.getBaseName(o.getFile()) + ".summary.metrics"); AlignmentSummaryMetricsWrapper wrapper = new AlignmentSummaryMetricsWrapper(job.getLogger()); wrapper.executeCommand(o.getFile(), ctx.getSequenceSupport().getCachedGenome(o.getLibrary_id()).getWorkingFastaFile(), metricsFile); } @@ -293,7 +293,7 @@ public void processFilesRemote(List inputFiles, JobContext c { job.getLogger().info("calculating wgs metrics"); job.setStatus(PipelineJob.TaskStatus.running, "CALCULATING WGS METRICS"); - File wgsMetricsFile = new File(ctx.getOutputDir(), FileUtil.getBaseName(o.getFile()) + ".wgs.metrics"); + File wgsMetricsFile = FileUtil.appendName(ctx.getOutputDir(), FileUtil.getBaseName(o.getFile()) + ".wgs.metrics"); CollectWgsMetricsWrapper wgsWrapper = new CollectWgsMetricsWrapper(job.getLogger()); wgsWrapper.executeCommand(o.getFile(), wgsMetricsFile, ctx.getSequenceSupport().getCachedGenome(o.getLibrary_id()).getWorkingFastaFile()); } @@ -302,7 +302,7 @@ public void processFilesRemote(List inputFiles, JobContext c { job.getLogger().info("calculating wgs metrics over non zero positions"); job.setStatus(PipelineJob.TaskStatus.running, "CALCULATING WGS METRICS"); - File wgsMetricsFile = new File(ctx.getOutputDir(), FileUtil.getBaseName(o.getFile()) + ".wgsNonZero.metrics"); + File wgsMetricsFile = FileUtil.appendName(ctx.getOutputDir(), FileUtil.getBaseName(o.getFile()) + ".wgsNonZero.metrics"); CollectWgsMetricsWithNonZeroCoverageWrapper wgsWrapper = new CollectWgsMetricsWithNonZeroCoverageWrapper(job.getLogger()); wgsWrapper.executeCommand(o.getFile(), wgsMetricsFile, ctx.getSequenceSupport().getCachedGenome(o.getLibrary_id()).getWorkingFastaFile()); } @@ -311,8 +311,8 @@ public void processFilesRemote(List inputFiles, JobContext c { job.getLogger().info("calculating insert size metrics"); job.setStatus(PipelineJob.TaskStatus.running, "CALCULATING INSERT SIZE METRICS"); - File metricsFile = new File(ctx.getOutputDir(), FileUtil.getBaseName(o.getFile()) + ".insertsize.metrics"); - File metricsHistogram = new File(ctx.getOutputDir(), FileUtil.getBaseName(o.getFile()) + ".insertsize.metrics.pdf"); + File metricsFile = FileUtil.appendName(ctx.getOutputDir(), FileUtil.getBaseName(o.getFile()) + ".insertsize.metrics"); + File metricsHistogram = FileUtil.appendName(ctx.getOutputDir(), FileUtil.getBaseName(o.getFile()) + ".insertsize.metrics.pdf"); CollectInsertSizeMetricsWrapper wrapper = new CollectInsertSizeMetricsWrapper(job.getLogger()); wrapper.executeCommand(o.getFile(), metricsFile, metricsHistogram, ctx.getSequenceSupport().getCachedGenome(o.getLibrary_id()).getWorkingFastaFile()); } @@ -323,7 +323,7 @@ public void processFilesRemote(List inputFiles, JobContext c job.setStatus(PipelineJob.TaskStatus.running, "RUNNING MARKDUPLICATES"); MarkDuplicatesWrapper wrapper = new MarkDuplicatesWrapper(job.getLogger()); File metricsFile = wrapper.getMetricsFile(o.getFile()); - File tempBam = new File(ctx.getOutputDir(), FileUtil.getBaseName(o.getFile()) + ".markDuplicates.bam"); + File tempBam = FileUtil.appendName(ctx.getOutputDir(), FileUtil.getBaseName(o.getFile()) + ".markDuplicates.bam"); ctx.getFileManager().addIntermediateFile(tempBam); ctx.getFileManager().addIntermediateFile(SequenceUtil.getExpectedIndex(tempBam)); diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/pipeline/ReferenceLibraryPipelineJob.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/pipeline/ReferenceLibraryPipelineJob.java index f44a37a66..37f9421dc 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/pipeline/ReferenceLibraryPipelineJob.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/pipeline/ReferenceLibraryPipelineJob.java @@ -22,6 +22,8 @@ import org.labkey.sequenceanalysis.SequenceAnalysisManager; import org.labkey.sequenceanalysis.SequenceAnalysisSchema; import org.labkey.sequenceanalysis.model.ReferenceLibraryMember; +import org.labkey.vfs.FileLike; +import org.labkey.vfs.FileSystemLike; import java.io.File; import java.io.IOException; @@ -107,7 +109,7 @@ protected void writeParameters(JSONObject params) throws IOException public File getSerializedLibraryMembersFile() { - return new File(getDataDirectory(), FileUtil.getBaseName(getLogFile()) + ".json"); + return FileUtil.appendName(getDataDirectory(), FileUtil.getBaseName(getLogFile()) + ".json"); } //for recreating an existing library @@ -193,7 +195,7 @@ public boolean isCreateNew() } @Override - protected File createLocalDirectory(PipeRoot pipeRoot) + protected FileLike createLocalDirectory(PipeRoot pipeRoot) { if (PipelineJobService.get().getLocationType() != PipelineJobService.LocationType.WebServer) { @@ -211,7 +213,7 @@ protected File createLocalDirectory(PipeRoot pipeRoot) outputDir.mkdirs(); } - return outputDir; + return new FileSystemLike.Builder(outputDir).tempDir().root(); } @Override diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/pipeline/SequenceJob.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/pipeline/SequenceJob.java index f4c1c4826..0ef25c152 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/pipeline/SequenceJob.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/pipeline/SequenceJob.java @@ -44,6 +44,7 @@ import org.labkey.api.view.ViewBackgroundInfo; import org.labkey.api.writer.PrintWriters; import org.labkey.sequenceanalysis.util.SequenceUtil; +import org.labkey.vfs.FileLike; import java.io.BufferedReader; import java.io.File; @@ -67,8 +68,8 @@ public class SequenceJob extends PipelineJob implements FileAnalysisJobSupport, private Integer _experimentRunRowId; private String _jobName; private String _description; - private File _webserverJobDir; - private File _parentWebserverJobDir; + private FileLike _webserverJobDir; + private FileLike _parentWebserverJobDir; private String _folderPrefix; private List _inputFiles; private List _outputsToCreate = new ArrayList<>(); @@ -95,10 +96,10 @@ protected SequenceJob(SequenceJob parentJob, String jobName, String subdirectory _description = parentJob._description; _support = parentJob.getSequenceSupport(); _parentWebserverJobDir = parentJob._webserverJobDir; - _webserverJobDir = new File(parentJob._webserverJobDir, subdirectory); + _webserverJobDir = parentJob._webserverJobDir.resolveChild(subdirectory); if (!_webserverJobDir.exists()) { - _webserverJobDir.mkdirs(); + _webserverJobDir.mkdir(); } _folderPrefix = parentJob._folderPrefix; @@ -157,7 +158,8 @@ protected void addCustomParams(JSONObject params) private Path _getLogFile() { - return AssayFileWriter.findUniqueFileName((FileUtil.makeLegalName(_jobName) + ".log"), getDataDirectory().toPath()); + var file = AssayFileWriter.findUniqueFileName((FileUtil.makeLegalName(_jobName) + ".log"), getDataDirectoryFileObject()); + return file.toNioPathForWrite(); } @Override @@ -187,9 +189,9 @@ public void setDescription(String description) _description = description; } - protected File createLocalDirectory(PipeRoot pipeRoot) throws IOException + protected FileLike createLocalDirectory(PipeRoot pipeRoot) throws IOException { - File webserverOutDir = new File(pipeRoot.getRootPath(), _folderPrefix + "Pipeline"); + FileLike webserverOutDir = pipeRoot.getRootFileLike().resolveChild(_folderPrefix + "Pipeline"); if (!webserverOutDir.exists()) { webserverOutDir.mkdir(); @@ -199,7 +201,7 @@ protected File createLocalDirectory(PipeRoot pipeRoot) throws IOException webserverOutDir = AssayFileWriter.findUniqueFileName(folderName, webserverOutDir); if (!webserverOutDir.exists()) { - webserverOutDir.mkdirs(); + webserverOutDir.mkdir(); } return webserverOutDir; @@ -312,19 +314,26 @@ public String getBaseNameForFileType(FileType fileType) @Override public File getDataDirectory() + { + return _webserverJobDir.toNioPathForWrite().toFile(); + } + + public FileLike getDataDirectoryFileObject() { return _webserverJobDir; } public File getWebserverDir(boolean forceParent) { - return forceParent && isSplitJob() ? _parentWebserverJobDir : _webserverJobDir; + return forceParent && isSplitJob() ? + _parentWebserverJobDir.toNioPathForWrite().toFile() : + _webserverJobDir.toNioPathForWrite().toFile(); } @Override public File getAnalysisDirectory() { - return _webserverJobDir; + return _webserverJobDir.toNioPathForWrite().toFile(); } @Override @@ -355,14 +364,15 @@ public ParamParser createParamParser() @Override public File getParametersFile() { - return new File(_parentWebserverJobDir == null ? _webserverJobDir : _parentWebserverJobDir, _folderPrefix + ".json"); + var dir = _parentWebserverJobDir == null ? _webserverJobDir : _parentWebserverJobDir; + return FileUtil.appendName(dir.toNioPathForWrite().toFile(),_folderPrefix + ".json"); } @Nullable @Override public File getJobInfoFile() { - return new File(_webserverJobDir, FileUtil.makeLegalName(_jobName) + ".job.json"); + return FileUtil.appendName(_webserverJobDir.toNioPathForWrite().toFile(), FileUtil.makeLegalName(_jobName) + ".job.json"); } @Override @@ -390,7 +400,7 @@ public SequenceJobSupportImpl getSequenceSupport() protected File getCachedSupportFile() { - return new File(getLogFile().getParentFile(), "sequenceSupport.json.gz"); + return FileUtil.appendName(getLogFile().getParentFile(), "sequenceSupport.json.gz"); } private SequenceJobSupportImpl readSupportFromDisk() throws IOException @@ -530,7 +540,7 @@ public void setExperimentRunRowId(Integer experimentRunRowId) public File findFile(String name) { - return new File(getAnalysisDirectory(), name); + return FileUtil.appendName(getAnalysisDirectory(), name); } protected static XarGeneratorFactorySettings getXarGenerator() throws CloneNotSupportedException @@ -577,14 +587,14 @@ public static class TestCase extends Assert public void testSerializeSupport() throws Exception { ExpData d1 = ExperimentService.get().createData(ContainerManager.getHomeContainer(), new DataType("testCase")); - d1.setDataFileURI(new File(FileUtil.getTempDirectory(), "foo.txt").toURI()); + d1.setDataFileURI(FileUtil.appendName(FileUtil.getTempDirectory(), "foo.txt").toURI()); SequenceJob job = new SequenceJob(); job._support = new SequenceJobSupportImpl(); job._support.cacheExpData(d1); - job.setLogFile(new File(FileUtil.getTempDirectory(), "testJob.log").toPath()); + job.setLogFile(FileUtil.appendName(FileUtil.getTempDirectory(), "testJob.log").toPath()); - File testFile = new File(FileUtil.getTempDirectory(), "testJob.json.txt"); + File testFile = FileUtil.appendName(FileUtil.getTempDirectory(), "testJob.json.txt"); File support = job.getCachedSupportFile(); if (support.exists()) { @@ -624,7 +634,7 @@ public File getLocationForCachedInputs(WorkDirectory wd, boolean createIfDoesntE if (localDir == null) { - ret = new File(wd.getDir(), "cachedData"); + ret = FileUtil.appendName(wd.getDir(), "cachedData"); } else { diff --git a/blast/resources/views/settings.view.xml b/blast/resources/views/settings.view.xml index b2bab0e72..5ba49ad93 100644 --- a/blast/resources/views/settings.view.xml +++ b/blast/resources/views/settings.view.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/blast/src/org/labkey/blast/BLASTController.java b/blast/src/org/labkey/blast/BLASTController.java index 82a453097..d511beae8 100644 --- a/blast/src/org/labkey/blast/BLASTController.java +++ b/blast/src/org/labkey/blast/BLASTController.java @@ -58,6 +58,7 @@ import org.labkey.api.writer.PrintWriters; import org.labkey.blast.model.BlastJob; import org.labkey.blast.pipeline.BlastDatabasePipelineJob; +import org.labkey.vfs.FileLike; import org.springframework.validation.BindException; import org.springframework.validation.Errors; import org.springframework.web.multipart.MultipartHttpServletRequest; @@ -215,8 +216,8 @@ protected File getTargetFile(String filename) throws IOException AssayFileWriter writer = new AssayFileWriter(); try { - File targetDirectory = AssayFileWriter.ensureUploadDirectory(getContainer()); - return AssayFileWriter.findUniqueFileName(filename, targetDirectory); + FileLike targetDirectory = AssayFileWriter.ensureUploadDirectory(getContainer()); + return AssayFileWriter.findUniqueFileName(filename, targetDirectory).toNioPathForWrite().toFile(); } catch (ExperimentException e) { @@ -263,14 +264,14 @@ public String getResponse(RunBlastForm form, Map> fil AssayFileWriter writer = new AssayFileWriter(); try { - File targetDirectory = AssayFileWriter.ensureUploadDirectory(getContainer()); - File input = AssayFileWriter.findUniqueFileName("blast", targetDirectory); - input.createNewFile(); - try (PrintWriter fw = PrintWriters.getPrintWriter(input)) + FileLike targetDirectory = AssayFileWriter.ensureUploadDirectory(getContainer()); + FileLike input = AssayFileWriter.findUniqueFileName("blast", targetDirectory); + input.createFile(); + try (PrintWriter fw = PrintWriters.getPrintWriter(input.openOutputStream())) { fw.write(form.getQuery()); } - inputFiles.add(input); + inputFiles.add(input.toNioPathForRead().toFile()); } catch (ExperimentException e) { diff --git a/blast/src/org/labkey/blast/BLASTManager.java b/blast/src/org/labkey/blast/BLASTManager.java index 6eae216e0..a578ba505 100644 --- a/blast/src/org/labkey/blast/BLASTManager.java +++ b/blast/src/org/labkey/blast/BLASTManager.java @@ -23,6 +23,7 @@ import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; import org.labkey.api.data.PropertyManager; +import org.labkey.api.data.PropertyManager.WritablePropertyMap; import org.labkey.api.data.SimpleFilter; import org.labkey.api.data.Table; import org.labkey.api.data.TableInfo; @@ -45,7 +46,6 @@ import java.io.File; import java.io.IOException; import java.nio.file.FileSystems; -import java.nio.file.Files; import java.nio.file.Path; import java.util.Date; import java.util.Map; @@ -70,7 +70,7 @@ public static BLASTManager get() public void saveSettings(Map props) throws IllegalArgumentException { - PropertyManager.PropertyMap configMap = PropertyManager.getWritableProperties(BLASTManager.CONFIG_PROPERTY_DOMAIN, true); + WritablePropertyMap configMap = PropertyManager.getWritableProperties(BLASTManager.CONFIG_PROPERTY_DOMAIN, true); //validate bin dir String binDir = StringUtils.trimToNull(props.get(BLAST_BIN_DIR)); diff --git a/cluster/resources/views/begin.view.xml b/cluster/resources/views/begin.view.xml index 5da101db6..10ee8bcd7 100644 --- a/cluster/resources/views/begin.view.xml +++ b/cluster/resources/views/begin.view.xml @@ -1,7 +1,4 @@ - - - diff --git a/jbrowse/jest.config.js b/jbrowse/jest.config.js deleted file mode 100644 index 8c1691a3b..000000000 --- a/jbrowse/jest.config.js +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = { - globals: { - LABKEY: {}, - }, - moduleFileExtensions: ['ts', 'tsx', 'js'], - moduleNameMapper: { - '\\.(css)$': '/src/client/test/styleMock.ts', - }, - roots: [''], - setupFilesAfterEnv: [ - './src/client/test/jest.setup.ts' - ], - testEnvironment: 'jsdom', - testPathIgnorePatterns: [ - '/node_modules/' - ], - testRegex: '(\\.(spec))\\.(ts|tsx)$', - transform: { - '^.+\\.tsx?$': [ - 'ts-jest', - { - tsconfig: 'node_modules/@labkey/build/webpack/tsconfig.json', - } - ], - }, -}; \ No newline at end of file diff --git a/jbrowse/package-lock.json b/jbrowse/package-lock.json index 47e361dad..ceb4eccab 100644 --- a/jbrowse/package-lock.json +++ b/jbrowse/package-lock.json @@ -9,11 +9,11 @@ "version": "1.0.0", "dependencies": { "@gmod/vcf": "^5.0.10", - "@jbrowse/core": "2.15.0", - "@jbrowse/plugin-linear-genome-view": "2.15.0", - "@jbrowse/plugin-svg": "2.15.0", - "@jbrowse/plugin-variants": "2.15.0", - "@jbrowse/react-linear-genome-view": "2.15.0", + "@jbrowse/core": "^2.15.0", + "@jbrowse/plugin-linear-genome-view": "^2.15.0", + "@jbrowse/plugin-svg": "^2.15.0", + "@jbrowse/plugin-variants": "^2.15.0", + "@jbrowse/react-linear-genome-view": "^2.15.0", "@labkey/api": "^1.35.0", "@labkey/components": "^5.0.0", "@mui/x-data-grid": "^7.0.0", @@ -43,11 +43,11 @@ "@labkey/build": "7.6.0", "@types/jexl": "^2.3.1", "@types/jquery": "^3.0.0", - "@types/node": "^18.17.1", + "@types/node": "^20.14.11", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", - "rimraf": "^3.0.2", - "typescript": "^5.0.0" + "rimraf": "^6.0.1", + "typescript": "^5.1.6" } }, "node_modules/@adobe/css-tools": { @@ -3135,65 +3135,11 @@ "webpack-dev-server": "~5.0.4" } }, - "node_modules/@labkey/build/node_modules/glob": { - "version": "11.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@labkey/build/node_modules/json-schema-traverse": { "version": "0.4.1", "dev": true, "license": "MIT" }, - "node_modules/@labkey/build/node_modules/minimatch": { - "version": "10.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@labkey/build/node_modules/rimraf": { - "version": "6.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@labkey/build/node_modules/schema-utils": { "version": "3.3.0", "dev": true, @@ -3281,9 +3227,9 @@ } }, "node_modules/@labkey/components": { - "version": "5.11.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-5.11.0.tgz", - "integrity": "sha512-t+J0owiGHlFxfVL6ACy49x3Qu5KAtpJ0x22KmV5tycguSIZlyYsqZzv4vsyMnnE6vzDQ9Nvukh7IPsd/jhtZEQ==", + "version": "5.13.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-5.13.0.tgz", + "integrity": "sha512-+zE5xVCPH58VM34Aneg747WY4xlADL/TB0tKmd6y1/Lj8CHJaYGxdYXR1FlIiTdB4hDoq/xWgOqqan5PbCaNwA==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "16.6.0", @@ -4229,10 +4175,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "18.19.50", + "version": "20.16.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.11.tgz", + "integrity": "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==", "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/node-forge": { @@ -5835,7 +5783,9 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.6.0", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "license": "MIT", "engines": { @@ -6838,9 +6788,9 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6849,7 +6799,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -7388,11 +7338,6 @@ "dev": true, "license": "Unlicense" }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/function-bind": { "version": "1.1.2", "license": "MIT", @@ -7480,19 +7425,24 @@ "license": "MIT" }, "node_modules/glob": { - "version": "7.2.3", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -7513,24 +7463,20 @@ "version": "0.4.1", "license": "BSD-2-Clause" }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { @@ -7998,15 +7944,6 @@ "node": ">=8" } }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "license": "ISC" @@ -8315,7 +8252,9 @@ } }, "node_modules/jackspeak": { - "version": "4.0.1", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -8326,9 +8265,6 @@ }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jexl": { @@ -9377,14 +9313,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "dev": true, @@ -9399,6 +9327,8 @@ }, "node_modules/path-scurry": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -9414,6 +9344,8 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "11.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", + "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", "dev": true, "license": "ISC", "engines": { @@ -10710,14 +10642,20 @@ } }, "node_modules/rimraf": { - "version": "3.0.2", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", "dev": true, "license": "ISC", "dependencies": { - "glob": "^7.1.3" + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -11910,7 +11848,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { diff --git a/jbrowse/package.json b/jbrowse/package.json index 4a0e49717..7b59ab12f 100644 --- a/jbrowse/package.json +++ b/jbrowse/package.json @@ -15,11 +15,11 @@ }, "dependencies": { "@gmod/vcf": "^5.0.10", - "@jbrowse/core": "2.15.0", - "@jbrowse/plugin-linear-genome-view": "2.15.0", - "@jbrowse/plugin-svg": "2.15.0", - "@jbrowse/plugin-variants": "2.15.0", - "@jbrowse/react-linear-genome-view": "2.15.0", + "@jbrowse/core": "^2.15.0", + "@jbrowse/plugin-linear-genome-view": "^2.15.0", + "@jbrowse/plugin-svg": "^2.15.0", + "@jbrowse/plugin-variants": "^2.15.0", + "@jbrowse/react-linear-genome-view": "^2.15.0", "@labkey/api": "^1.35.0", "@labkey/components": "^5.0.0", "@mui/x-data-grid": "^7.0.0", @@ -49,10 +49,10 @@ "@labkey/build": "7.6.0", "@types/jexl": "^2.3.1", "@types/jquery": "^3.0.0", - "@types/node": "^18.17.1", + "@types/node": "^20.14.11", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", - "rimraf": "^3.0.2", - "typescript": "^5.0.0" + "rimraf": "^6.0.1", + "typescript": "^5.1.6" } } diff --git a/jbrowse/resources/views/databaseDetails.view.xml b/jbrowse/resources/views/databaseDetails.view.xml index d4ee31086..998b2b750 100644 --- a/jbrowse/resources/views/databaseDetails.view.xml +++ b/jbrowse/resources/views/databaseDetails.view.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/jbrowse/resources/views/genotypeTable.view.xml b/jbrowse/resources/views/genotypeTable.view.xml index f7c07a79c..590ba906a 100644 --- a/jbrowse/resources/views/genotypeTable.view.xml +++ b/jbrowse/resources/views/genotypeTable.view.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/jbrowse/resources/views/jbrowseSearch.view.xml b/jbrowse/resources/views/jbrowseSearch.view.xml index 91c3d19cd..9ade1f085 100644 --- a/jbrowse/resources/views/jbrowseSearch.view.xml +++ b/jbrowse/resources/views/jbrowseSearch.view.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/jbrowse/src/client/JBrowse/Browser/Browser.spec.tsx b/jbrowse/src/client/JBrowse/Browser/Browser.spec.tsx deleted file mode 100644 index eb45a97d5..000000000 --- a/jbrowse/src/client/JBrowse/Browser/Browser.spec.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import React from 'react'; -import { mount } from 'enzyme'; -import { mocked } from 'jest-mock'; -import { describe, expect, jest, test } from '@jest/globals'; - -import { Ajax } from '@labkey/api'; -import View from './Browser'; - -const mockData = -{ - "configuration": {}, - "assemblies": - { - "name": "hg38", - "aliases": ["GRCh38"], - "sequence": { - "type": "ReferenceSequenceTrack", - "trackId": "P6R5xbRqRr", - "adapter": { - "type": "BgzipFastaAdapter", - "fastaLocation": { - "uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz" - }, - "faiLocation": { - "uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz.fai" - }, - "gziLocation": { - "uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz.gzi" - } - } - }, - "refNameAliases": { - "adapter": { - "type": "RefNameAliasAdapter", - "location": { - "uri": "https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/hg38_aliases.txt" - } - } - } - }, - "tracks": [ - { - "type": "VariantTrack", - "trackId": "clinvar_ncbi_hg38", - "name": "ClinVar variants (NCBI)", - "assemblyNames": ["hg38"], - "category": ["Annotation"], - "adapter": { - "type": "VcfTabixAdapter", - "vcfGzLocation": { - "uri": "https://ftp.ncbi.nlm.nih.gov/pub/clinvar/vcf_GRCh38/clinvar.vcf.gz" - }, - "index": { - "location": { - "uri": "https://ftp.ncbi.nlm.nih.gov/pub/clinvar/vcf_GRCh38/clinvar.vcf.gz.tbi" - } - } - } - }, - { - "type": "FeatureTrack", - "trackId": "ncbi_refseq_109_hg38_latest", - "name": "NCBI RefSeq (GFF3Tabix)", - "assemblyNames": ["hg38"], - "category": ["Annotation"], - "adapter": { - "type": "Gff3TabixAdapter", - "gffGzLocation": { - "uri": "https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/ncbi_refseq/GRCh38_latest_genomic.sort.gff.gz" - }, - "index": { - "location": { - "uri": "https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/ncbi_refseq/GRCh38_latest_genomic.sort.gff.gz.tbi" - } - } - } - } - ], - "connections": [] -} - -jest.mock('@labkey/api', () => { - return { - Ajax: { - request: jest.fn() - }, - ActionURL: { - buildURL: jest.fn() - }, - getServerContext: jest.fn(() => { - return {devMode: true} - }) - } -}) -const mockedRequest = mocked(Ajax) - -describe('JBrowse 2 Browser', () => { - - - test('Renders error string if no config provided', async () => { - - const wrapper = mount(); - expect(wrapper.contains(

Error - no session provided.

)).toEqual(true); - }); - - - test('Renders browser if config provided', async () => { - jest.spyOn(URLSearchParams.prototype, "get").mockImplementation(() => "demo") // Set session to "demo" when queryParam.get is called. - - mockedRequest.request.mockReset(); - mockedRequest.request.mockImplementation(({ success }) => { - success({ response: JSON.stringify(mockData) } as XMLHttpRequest, null); - return {} as XMLHttpRequest; - }); - const wrapper = mount(); - expect(wrapper.find('.MuiPaper-root')).toHaveLength(4) - }); - -}); diff --git a/jbrowse/src/client/entryPoints.js b/jbrowse/src/client/entryPoints.js index 0696b39e4..4c5963301 100644 --- a/jbrowse/src/client/entryPoints.js +++ b/jbrowse/src/client/entryPoints.js @@ -7,24 +7,23 @@ module.exports = { apps: [{ name: 'jbrowseBrowser', title: 'JBrowse Genome Browser', - permission: 'read', + permissionClasses: ['org.labkey.api.security.permissions.ReadPermission'], path: './src/client/JBrowse/Browser' },{ name: 'jbrowse2SearchWebpart', title: 'JBrowse Search', - permission: 'read', template: 'app', generateLib: true, path: './src/client/JBrowse/Search/webpart' },{ name: 'variantSearch', title: 'Variant Search', - permission: 'read', + permissionClasses: ['org.labkey.api.security.permissions.ReadPermission'], path: './src/client/JBrowse/VariantSearch' },{ name: 'variantTable', title: 'Variant Table', - permission: 'read', + permissionClasses: ['org.labkey.api.security.permissions.ReadPermission'], path: './src/client/JBrowse/VariantTable' }] }; diff --git a/jbrowse/src/org/labkey/jbrowse/pipeline/JBrowseLucenePipelineJob.java b/jbrowse/src/org/labkey/jbrowse/pipeline/JBrowseLucenePipelineJob.java index 4c4f6ad92..4ae81ac0f 100644 --- a/jbrowse/src/org/labkey/jbrowse/pipeline/JBrowseLucenePipelineJob.java +++ b/jbrowse/src/org/labkey/jbrowse/pipeline/JBrowseLucenePipelineJob.java @@ -18,6 +18,7 @@ import org.labkey.api.security.User; import org.labkey.api.sequenceanalysis.pipeline.SequencePipelineService; import org.labkey.api.sequenceanalysis.run.DISCVRSeqRunner; +import org.labkey.api.util.FileUtil; import org.labkey.api.util.GUID; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.ActionURL; @@ -58,7 +59,7 @@ public JBrowseLucenePipelineJob(Container c, User user, PipeRoot pipeRoot, Strin _infoFields = infoFields; _allowLenientLuceneProcessing = allowLenientLuceneProcessing; - setLogFile(AssayFileWriter.findUniqueFileName("jbrowse-lucene" + new GUID() + ".log", JBrowseManager.get().getBaseDir(c, true).toPath())); + setLogFile(AssayFileWriter.findUniqueFileName("jbrowse-lucene" + new GUID() + ".log", JBrowseManager.get().getBaseDir(c, true))); } public static class JBrowseLucenePipelineProvider extends PipelineProvider @@ -262,6 +263,6 @@ private static void recursivelyChangeDirectoryPermissions(File f) throws IOExcep public static File getFieldListFile(File indexDir) { - return new File(indexDir, "fieldList.txt"); + return FileUtil.appendName(indexDir, "fieldList.txt"); } } diff --git a/jbrowse/tsconfig.json b/jbrowse/tsconfig.json index 1cb5885fb..9382537e8 100644 --- a/jbrowse/tsconfig.json +++ b/jbrowse/tsconfig.json @@ -1,4 +1,6 @@ { - "extends": "./node_modules/@labkey/build/webpack/tsconfig.json" + "extends": "./node_modules/@labkey/build/webpack/tsconfig.json", + "include": ["src/client/**/*"], + "exclude": ["node_modules"] } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..4808101b5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "DiscvrLabKeyModules", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/singlecell/src/org/labkey/singlecell/SingleCellController.java b/singlecell/src/org/labkey/singlecell/SingleCellController.java index 0dfc3e443..5252fe424 100644 --- a/singlecell/src/org/labkey/singlecell/SingleCellController.java +++ b/singlecell/src/org/labkey/singlecell/SingleCellController.java @@ -16,6 +16,7 @@ package org.labkey.singlecell; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; @@ -37,6 +38,7 @@ import org.labkey.api.data.ContainerType; import org.labkey.api.data.DbScope; import org.labkey.api.data.PropertyManager; +import org.labkey.api.data.PropertyManager.WritablePropertyMap; import org.labkey.api.data.SimpleFilter; import org.labkey.api.data.TableInfo; import org.labkey.api.data.TableSelector; @@ -66,7 +68,6 @@ import org.springframework.validation.BindException; import org.springframework.web.servlet.ModelAndView; -import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -522,7 +523,7 @@ public static class SetTenXImportDefaultsAction extends MutatingApiAction