Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 45 additions & 20 deletions genotyping/src/org/labkey/genotyping/GenotypingController.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand Down Expand Up @@ -86,10 +85,12 @@
import org.labkey.api.security.permissions.ReadPermission;
import org.labkey.api.security.permissions.UpdatePermission;
import org.labkey.api.util.DateUtil;
import org.labkey.api.util.FileUtil;
import org.labkey.api.util.MinorConfigurationException;
import org.labkey.api.util.PageFlowUtil;
import org.labkey.api.util.Pair;
import org.labkey.api.util.URLHelper;
import org.labkey.api.util.logging.LogHelper;
import org.labkey.api.view.ActionURL;
import org.labkey.api.view.DataView;
import org.labkey.api.view.DetailsView;
Expand All @@ -110,6 +111,8 @@
import org.labkey.genotyping.sequences.FastqGenerator;
import org.labkey.genotyping.sequences.FastqWriter;
import org.labkey.genotyping.sequences.SequenceManager;
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;
Expand All @@ -122,6 +125,8 @@
import java.math.BigInteger;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
Expand All @@ -139,7 +144,7 @@

public class GenotypingController extends SpringActionController
{
private static final Logger LOG = LogManager.getLogger(GenotypingController.class);
private static final Logger LOG = LogHelper.getLogger(GenotypingController.class, "Logger for Genotyping Controller");
@SuppressWarnings({"unchecked"})
private static final DefaultActionResolver _actionResolver = new DefaultActionResolver(GenotypingController.class);

Expand Down Expand Up @@ -1005,9 +1010,13 @@ private String importReads(ImportReadsForm form) throws Exception
if (null == form.getPlatform())
return "You must specify a sequence platform";

PipeRoot root = PipelineService.get().getPipelineRootSetting(getContainer());
if (!root.getRootFileLike().isDescendant(FileUtil.createUri(form.getReadsPath())))
return "File must be a descendant of a pipeline";

try
{
File readsFile = new File(form.getReadsPath());
FileLike readsFile = root.resolvePathToFileLike(root.relativePath(Paths.get(form.getReadsPath())));
GenotypingRun run;

try
Expand All @@ -1023,7 +1032,6 @@ private String importReads(ImportReadsForm form) throws Exception
}

ViewBackgroundInfo vbi = new ViewBackgroundInfo(getContainer(), getUser(), getViewContext().getActionURL());
PipeRoot root = PipelineService.get().findPipelineRoot(getContainer());
ImportReadsForm.Platforms platform = ImportReadsForm.Platforms.valueOf(form.getPlatform());

platform.prepareAndQueueRunJob(vbi, root, new File(form.getReadsPath()), run, form.getPrefix());
Expand Down Expand Up @@ -1178,10 +1186,17 @@ private ColumnInfo getColumnInfo(Map<FieldKey, ColumnInfo> fieldMap, String colu
public boolean handlePost(AnalyzeForm form, BindException errors) throws Exception
{
GenotypingRun run = GenotypingManager.get().getRun(getContainer(), form.getRun());
File readsPath = new File(run.getPath(), run.getFileName());
ViewBackgroundInfo vbi = new ViewBackgroundInfo(getContainer(), getUser(), getViewContext().getActionURL());
if (run == null)
{
errors.rejectValue("run", ERROR_MSG, "No run found");
return false;
}

PipeRoot root = PipelineService.get().findPipelineRoot(getContainer());

FileLike readsFile = run.getWorkingDir().resolveChild(run.getFileName());
ViewBackgroundInfo vbi = new ViewBackgroundInfo(getContainer(), getUser(), getViewContext().getActionURL());

String sequencesViewName = form.getSequencesView();
String description = form.getDescription();
String sequencesView = DEFAULT_VIEW_PLACEHOLDER.equals(sequencesViewName) ? null : sequencesViewName;
Expand All @@ -1202,7 +1217,7 @@ public boolean handlePost(AnalyzeForm form, BindException errors) throws Excepti
GenotypingAnalysis analysis = GenotypingManager.get().createAnalysis(getContainer(), getUser(), run, description, sequencesView);
try
{
PipelineJob analysisJob = new SubmitAnalysisJob(vbi, root, readsPath, analysis, sampleKeys);
PipelineJob analysisJob = new SubmitAnalysisJob(vbi, root, readsFile, analysis, sampleKeys);
PipelineService.get().queueJob(analysisJob);
}
catch (MinorConfigurationException e)
Expand Down Expand Up @@ -1292,10 +1307,10 @@ public Object execute(ImportAnalysisForm form, BindException errors) throws Exce

try
{
FileLike analysisDir = FileSystemLike.getVerifiedFileLike(getContainer(), form.getPath());
int analysisId = form.getAnalysis();
File analysisDir = new File(form.getPath());
User user = getUser();

User user = getUser();
if (user.isGuest())
{
Properties props = GenotypingManager.get().readProperties(analysisDir);
Expand Down Expand Up @@ -1378,16 +1393,26 @@ public void validateCommand(PipelinePathForm target, Errors errors)
@Override
public boolean handlePost(PipelinePathForm form, BindException errors) throws IOException, PipelineValidationException
{
Container container = getContainer();
// Manual upload of genotyping analysis; pipeline provider posts to this action with matches file.
File matches = form.getValidatedSingleFile(getContainer());
File analysisDir = matches.getParentFile();
Path singleFile = form.getValidatedSinglePath(container);

if (form.getPipeRoot(container).getRootFileLike().isDescendant(singleFile.toUri()))
{

// Load properties to determine the run.
Properties props = GenotypingManager.get().readProperties(analysisDir);
int analysisId = Integer.parseInt((String)props.get("analysis"));
importAnalysis(analysisId, analysisDir, getUser());
FileLike matches = form.getPipeRoot(container).resolvePathToFileLike(singleFile.toString());
FileLike analysisDir = matches.getParent();

return true;
// Load properties to determine the run.
Properties props = GenotypingManager.get().readProperties(analysisDir);
int analysisId = Integer.parseInt((String) props.get("analysis"));
importAnalysis(analysisId, analysisDir, getUser());

return true;
}

errors.reject(ERROR_MSG, "File was not found under the pipeline root");
return false;
}

@Override
Expand All @@ -1398,13 +1423,13 @@ public URLHelper getSuccessURL(PipelinePathForm pipelinePathForm)
}


private void importAnalysis(int analysisId, File pipelineDir, User user) throws IOException, PipelineValidationException
private void importAnalysis(int analysisId, FileLike pipelineDir, User user) throws IOException, PipelineValidationException
{
GenotypingAnalysis analysis = GenotypingManager.get().getAnalysis(getContainer(), analysisId);
File analysisDir = new File(analysis.getPath());
FileLike analysisDir = new FileSystemLike.Builder(Paths.get(analysis.getPath())).readwrite().root();

String pipelinePath = pipelineDir.getCanonicalPath();
String analysisPath = analysisDir.getCanonicalPath();
String pipelinePath = FileUtil.getAbsoluteCaseSensitiveFile(pipelineDir.toNioPathForRead().toFile()).getAbsolutePath();
String analysisPath = FileUtil.getAbsoluteCaseSensitiveFile(analysisDir.toNioPathForRead().toFile()).getAbsolutePath();

if (!pipelinePath.equals(analysisPath))
throw new FileNotFoundException("Analysis path (\"" + analysisPath +
Expand Down
31 changes: 11 additions & 20 deletions genotyping/src/org/labkey/genotyping/GenotypingManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,12 @@
import org.labkey.api.query.FieldKey;
import org.labkey.api.query.QueryHelper;
import org.labkey.api.security.User;
import org.labkey.api.util.FileUtil;
import org.labkey.api.util.SafeToRenderEnum;
import org.labkey.api.view.NotFoundException;
import org.labkey.vfs.FileLike;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
Expand Down Expand Up @@ -124,14 +123,14 @@ public void saveSettings(Container c, GenotypingFolderSettings settings)
map.save();
}

public GenotypingRun createRun(Container c, User user, Integer metaDataId, File readsFile, String platform)
public GenotypingRun createRun(Container c, User user, Integer metaDataId, FileLike readsFile, String platform)
{
MetaDataRun mdRun = null;

if (null != metaDataId)
mdRun = getMetaDataRun(c, user, metaDataId, "importing reads");

GenotypingRun run = new GenotypingRun(c, readsFile, mdRun, platform);
GenotypingRun run = new GenotypingRun(c, readsFile.toNioPathForWrite().toFile(), mdRun, platform);
return Table.insert(user, GenotypingSchema.get().getRunsTable(), run);
}

Expand Down Expand Up @@ -281,39 +280,31 @@ private void deleteAnalyses(CharSequence analysisFilter, Object... params)
}


public void writeProperties(Properties props, File directory) throws IOException
public void writeProperties(Properties props, FileLike directory) throws IOException
{
File propXml = new File(directory, PROPERTIES_FILE_NAME);
OutputStream os = null;
try
try (OutputStream os = directory.resolveChild(PROPERTIES_FILE_NAME).openOutputStream())
{
os = new FileOutputStream(propXml);
props.storeToXML(os, null);
}
finally
{
if (null != os)
os.close();
}
}

public Properties readProperties(File directory) throws IOException
public Properties readProperties(FileLike directory) throws IOException
{
if (!directory.exists())
throw new FileNotFoundException(directory.getAbsolutePath() + " does not exist");
throw new FileNotFoundException(FileUtil.getAbsolutePath(directory.toNioPathForRead()) + " does not exist");

if (!directory.isDirectory())
throw new FileNotFoundException(directory.getAbsolutePath() + " is not a directory");
throw new FileNotFoundException(FileUtil.getAbsolutePath(directory.toNioPathForRead()) + " is not a directory");

File properties = new File(directory, PROPERTIES_FILE_NAME);
FileLike properties = directory.resolveChild(PROPERTIES_FILE_NAME);

// Load properties to determine the run.
Properties props = new Properties();
InputStream is = null;

try
{
is = new FileInputStream(properties);
is = properties.openInputStream();
props.loadFromXML(is);
}
finally
Expand Down
10 changes: 10 additions & 0 deletions genotyping/src/org/labkey/genotyping/GenotypingRun.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,17 @@
*/
package org.labkey.genotyping;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.jetbrains.annotations.Nullable;
import org.labkey.api.data.Container;
import org.labkey.api.pipeline.PipelineService;
import org.labkey.api.security.User;
import org.labkey.api.util.FileUtil;
import org.labkey.api.util.MemTracker;
import org.labkey.vfs.FileLike;

import java.io.File;
import java.nio.file.Paths;
import java.util.Date;

/**
Expand Down Expand Up @@ -167,4 +171,10 @@ public void setStatusEnum(Status statusEnum)
{
_status = statusEnum.getStatusId();
}

@JsonIgnore
public FileLike getWorkingDir()
{
return PipelineService.get().findPipelineRoot(getContainer()).resolvePathToFileLike(PipelineService.get().findPipelineRoot(getContainer()).relativePath(Paths.get(getPath())));
}
}
7 changes: 5 additions & 2 deletions genotyping/src/org/labkey/genotyping/Import454ReadsJob.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
import org.labkey.api.util.FileUtil;
import org.labkey.api.util.Formats;
import org.labkey.api.view.ViewBackgroundInfo;
import org.labkey.vfs.FileLike;
import org.labkey.vfs.FileSystemLike;

import java.io.File;
import java.io.IOException;
Expand Down Expand Up @@ -65,8 +67,9 @@ protected Import454ReadsJob(@JsonProperty("_reads") File reads)
public Import454ReadsJob(ViewBackgroundInfo info, PipeRoot root, File reads, GenotypingRun run)
{
super(Import454ReadsPipelineProvider.NAME, info, root, run);
_reads = reads;
setLogFile(new File(_reads.getParentFile(), FileUtil.makeFileNameWithTimestamp("import_reads", "log")));
FileLike verifiedFileLike = FileSystemLike.getVerifiedFileLike(root.getContainer(), reads.getAbsolutePath());
_reads = FileSystemLike.toFile(verifiedFileLike);
setLogFile(verifiedFileLike.getParent().resolveChild(FileUtil.makeFileNameWithTimestamp("import_reads", "log")).toNioPathForWrite());
}

@Override
Expand Down
16 changes: 8 additions & 8 deletions genotyping/src/org/labkey/genotyping/ImportAnalysisJob.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@
import org.labkey.api.view.ViewBackgroundInfo;
import org.labkey.genotyping.sequences.SequenceDictionary;
import org.labkey.genotyping.sequences.SequenceManager;
import org.labkey.vfs.FileLike;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Map;
Expand All @@ -50,21 +50,21 @@
*/
public class ImportAnalysisJob extends PipelineJob
{
private File _dir;
private FileLike _dir;
private GenotypingAnalysis _analysis;

// For serialization
protected ImportAnalysisJob() {}

public ImportAnalysisJob(ViewBackgroundInfo info, PipeRoot root, File pipelineDir, GenotypingAnalysis analysis)
public ImportAnalysisJob(ViewBackgroundInfo info, PipeRoot root, FileLike pipelineDir, GenotypingAnalysis analysis)
{
super("Import Analysis", info, root);
_dir = pipelineDir;
_analysis = analysis;
setLogFile(new File(_dir, FileUtil.makeFileNameWithTimestamp("import_analysis", "log")));
setLogFile(_dir.resolveChild(FileUtil.makeFileNameWithTimestamp("import_analysis", "log")).toNioPathForWrite());

if (!_dir.exists())
throw new IllegalArgumentException("Pipeline directory does not exist: " + _dir.getAbsolutePath());
throw new IllegalArgumentException("Pipeline directory does not exist: " + _dir.toNioPathForRead().toAbsolutePath());

if (null == _analysis)
throw new IllegalArgumentException("Analysis was not specified");
Expand Down Expand Up @@ -92,7 +92,7 @@ public void run()

try
{
File sourceMatches = new File(_dir, GenotypingManager.MATCHES_FILE_NAME);
FileLike sourceMatches = _dir.resolveChild(GenotypingManager.MATCHES_FILE_NAME);
GenotypingSchema gs = GenotypingSchema.get();
DbSchema schema = gs.getSchema();
TempTableInfo matches = null;
Expand Down Expand Up @@ -180,9 +180,9 @@ public void run()


// columnNames: comma-separated list of column names to include; null means include all columns
private TempTableInfo createTempTable(File file, @Nullable String columnNames) throws IOException, SQLException
private TempTableInfo createTempTable(FileLike file, @Nullable String columnNames) throws IOException, SQLException
{
try (TabLoader loader = new TabLoader(file, true))
try (TabLoader loader = new TabLoader(file.toNioPathForRead().toFile(), true))
{
// Load only the specified columns
if (null != columnNames)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
import org.labkey.api.util.FileUtil;
import org.labkey.api.util.Pair;
import org.labkey.api.view.ViewBackgroundInfo;
import org.labkey.vfs.FileLike;
import org.labkey.vfs.FileSystemLike;

import java.io.File;
import java.io.IOException;
Expand Down Expand Up @@ -71,9 +73,10 @@ protected ImportIlluminaReadsJob(@JsonProperty("_sampleFile") File sampleFile, @
public ImportIlluminaReadsJob(ViewBackgroundInfo info, PipeRoot root, File sampleFile, GenotypingRun run, @Nullable String fastqPrefix)
{
super(ImportIlluminaReadsPipelineProvider.NAME, info, root, run);
_sampleFile = sampleFile;
FileLike verifiedFileLike = FileSystemLike.getVerifiedFileLike(root.getContainer(), sampleFile.getAbsolutePath());
_sampleFile = FileSystemLike.toFile(verifiedFileLike);
_fastqPrefix = fastqPrefix;
setLogFile(new File(_sampleFile.getParentFile(), FileUtil.makeFileNameWithTimestamp("import_reads", "log")));
setLogFile(verifiedFileLike.getParent().resolveChild(FileUtil.makeFileNameWithTimestamp("import_reads", "log")).toNioPathForWrite());
}

@Override
Expand Down
Loading