Skip to content

Commit 4618453

Browse files
Improve file path validation (#940)
1 parent 3c67823 commit 4618453

50 files changed

Lines changed: 251 additions & 236 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

elisa/src/org/labkey/elisa/AbstractElisaImportHelper.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import org.labkey.api.exp.api.ProvenanceService;
1515
import org.labkey.api.exp.property.Domain;
1616
import org.labkey.api.exp.property.DomainProperty;
17+
import org.labkey.vfs.FileLike;
1718

18-
import java.io.File;
1919
import java.util.Collections;
2020
import java.util.HashMap;
2121
import java.util.Map;
@@ -26,11 +26,11 @@ public abstract class AbstractElisaImportHelper implements ElisaImportHelper
2626
protected AssayUploadXarContext _context;
2727
protected PlateBasedAssayProvider _provider;
2828
protected ExpProtocol _protocol;
29-
protected File _dataFile;
29+
protected FileLike _dataFile;
3030
protected Container _container;
3131
Map<Position, String> _specimenGroupMap;
3232

33-
public AbstractElisaImportHelper(AssayUploadXarContext context, PlateBasedAssayProvider provider, ExpProtocol protocol, File dataFile)
33+
public AbstractElisaImportHelper(AssayUploadXarContext context, PlateBasedAssayProvider provider, ExpProtocol protocol, FileLike dataFile)
3434
{
3535
_context = context;
3636
_provider = provider;

elisa/src/org/labkey/elisa/ElisaDataHandler.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ protected boolean shouldAddInputMaterials()
107107
return true;
108108
}
109109

110-
private ElisaImportHelper getImportHelper(AssayUploadXarContext context, PlateBasedAssayProvider provider, ExpProtocol protocol, File dataFile) throws ExperimentException
110+
private ElisaImportHelper getImportHelper(AssayUploadXarContext context, PlateBasedAssayProvider provider, ExpProtocol protocol, FileLike dataFile) throws ExperimentException
111111
{
112112
if (provider.getMetadataInputFormat(protocol).equals(SampleMetadataInputFormat.MANUAL))
113113
{
@@ -135,7 +135,7 @@ public Map<DataType, DataIteratorBuilder> getValidationDataMap(ExpData data, Fil
135135
Map<String, DomainProperty> sampleProperties = plateProvider.getSampleWellGroupDomain(protocol)
136136
.getProperties().stream()
137137
.collect(Collectors.toMap(DomainProperty::getName, dp -> dp));
138-
ElisaImportHelper importHelper = getImportHelper(xarContext, plateProvider, protocol, dataFile.toNioPathForRead().toFile());
138+
ElisaImportHelper importHelper = getImportHelper(xarContext, plateProvider, protocol, dataFile);
139139

140140
for (String plateName : importHelper.getPlates())
141141
{
@@ -148,7 +148,7 @@ public Map<DataType, DataIteratorBuilder> getValidationDataMap(ExpData data, Fil
148148
SimpleRegression regression = new SimpleRegression(true);
149149
Map<String, Double> standardConcentrations = importHelper.getStandardConcentrations(plateName, analytePlateEntry.getKey());
150150

151-
CurveFit standardCurve = calculateStandardCurve(run, plate, regression, standardConcentrations, runDomain);
151+
CurveFit<?> standardCurve = calculateStandardCurve(run, plate, regression, standardConcentrations, runDomain);
152152
if (standardCurve != null && standardCurve.getParameters() == null)
153153
throw new ExperimentException("Unable to fit the standard concentrations to a curve, please check the input data and try again");
154154

@@ -321,7 +321,7 @@ private boolean isRowEmptyOrNull(Map<String, Object> row)
321321
* data and can be used to generate an R squared value.
322322
*/
323323
@Nullable
324-
private CurveFit calculateStandardCurve(ExpRun run, Plate plate, @Nullable SimpleRegression regression, Map<String, Double> standardConcentrations,
324+
private CurveFit<?> calculateStandardCurve(ExpRun run, Plate plate, @Nullable SimpleRegression regression, Map<String, Double> standardConcentrations,
325325
Domain runDomain) throws ExperimentException
326326
{
327327
// compute the calibration curve, there could be multiple control groups but one contains the standards
@@ -333,7 +333,7 @@ private CurveFit calculateStandardCurve(ExpRun run, Plate plate, @Nullable Simpl
333333

334334
for (WellGroup replicate : stdWellGroup.getOverlappingGroups(WellGroup.Type.REPLICATE))
335335
{
336-
maxValue = replicate.getMean() > maxValue ? replicate.getMean() : maxValue;
336+
maxValue = Math.max(replicate.getMean(), maxValue);
337337
}
338338

339339
for (WellGroup replicate : stdWellGroup.getOverlappingGroups(WellGroup.Type.REPLICATE))
@@ -358,7 +358,7 @@ private CurveFit calculateStandardCurve(ExpRun run, Plate plate, @Nullable Simpl
358358

359359
// Compute curve fit parameters based on the selected curve fit (default to linear for legacy assay designs)
360360
StatsService.CurveFitType curveFitType = ElisaManager.getRunCurveFitType(runDomain, run);
361-
CurveFit curveFit = StatsService.get().getCurveFit(curveFitType, points.toArray(DoublePoint[]::new));
361+
CurveFit<?> curveFit = StatsService.get().getCurveFit(curveFitType, points.toArray(DoublePoint[]::new));
362362
curveFit.setLogXScale(false);
363363
curveFit.setAssumeCurveDecreasing(false);
364364

elisa/src/org/labkey/elisa/ElisaSampleFilePropertyHelper.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
import org.labkey.api.study.assay.SampleMetadataInputFormat;
1717

1818
import jakarta.servlet.http.HttpServletRequest;
19-
import java.io.File;
19+
import org.labkey.vfs.FileLike;
20+
2021
import java.io.IOException;
22+
import java.io.InputStream;
2123
import java.util.Arrays;
2224
import java.util.HashMap;
2325
import java.util.List;
@@ -41,13 +43,14 @@ public Map<String, Map<DomainProperty, String>> getSampleProperties(HttpServletR
4143
if (_sampleProperties != null)
4244
return _sampleProperties;
4345

44-
File metadataFile = getSampleMetadata(request);
46+
FileLike metadataFile = getSampleMetadata(request);
4547
if (metadataFile == null)
4648
throw new ExperimentException("No metadata or data file provided");
4749

4850
Map<String, Map<DomainProperty, String>> allProperties = new HashMap<>();
4951
DataLoaderFactory factory = DataLoaderService.get().findFactory(metadataFile, null);
50-
try (DataLoader loader = factory.createLoader(metadataFile, true))
52+
try (InputStream in = metadataFile.openInputStream();
53+
DataLoader loader = factory.createLoader(in, true))
5154
{
5255
validateRequiredColumns(loader.getColumns());
5356

elisa/src/org/labkey/elisa/HighThroughputImportHelper.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
import org.labkey.api.reader.DataLoader;
2222
import org.labkey.api.reader.DataLoaderFactory;
2323
import org.labkey.api.reader.DataLoaderService;
24+
import org.labkey.vfs.FileLike;
2425

25-
import java.io.File;
2626
import java.io.IOException;
27+
import java.io.InputStream;
2728
import java.util.Collections;
2829
import java.util.HashMap;
2930
import java.util.List;
@@ -37,7 +38,7 @@ public class HighThroughputImportHelper extends AbstractElisaImportHelper
3738
private final Map<String, AnalytePlate> _plateMap = new HashMap<>();
3839
private Plate _plateTemplate;
3940

40-
public HighThroughputImportHelper(AssayUploadXarContext context, PlateBasedAssayProvider provider, ExpProtocol protocol, File dataFile) throws ExperimentException
41+
public HighThroughputImportHelper(AssayUploadXarContext context, PlateBasedAssayProvider provider, ExpProtocol protocol, FileLike dataFile) throws ExperimentException
4142
{
4243
super(context, provider, protocol, dataFile);
4344
ensureData();
@@ -47,7 +48,8 @@ private void ensureData() throws ExperimentException
4748
{
4849
_plateTemplate = _provider.getPlate(_protocol.getContainer(), _protocol);
4950
DataLoaderFactory factory = DataLoaderService.get().findFactory(_dataFile, null);
50-
try (DataLoader loader = factory.createLoader(_dataFile, true))
51+
try (InputStream in = _dataFile.openInputStream();
52+
DataLoader loader = factory.createLoader(in, true))
5153
{
5254
String signalColumnName = "Signal";
5355

elisa/src/org/labkey/elisa/ManualImportHelper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.labkey.api.exp.property.DomainProperty;
2121
import org.labkey.elisa.actions.ElisaRunUploadForm;
2222
import org.labkey.elisa.plate.BioTekPlateReader;
23+
import org.labkey.vfs.FileLike;
2324

2425
import java.io.File;
2526
import java.util.HashMap;
@@ -32,7 +33,7 @@
3233
*/
3334
public class ManualImportHelper extends AbstractElisaImportHelper
3435
{
35-
public ManualImportHelper(AssayUploadXarContext context, PlateBasedAssayProvider provider, ExpProtocol protocol, File dataFile)
36+
public ManualImportHelper(AssayUploadXarContext context, PlateBasedAssayProvider provider, ExpProtocol protocol, FileLike dataFile)
3637
{
3738
super(context, provider, protocol, dataFile);
3839
}

elispotassay/src/org/labkey/elispot/AbstractElispotDataHandler.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.labkey.elispot;
1818

1919
import org.apache.logging.log4j.Logger;
20+
import org.jetbrains.annotations.NotNull;
2021
import org.labkey.api.assay.AssayUrls;
2122
import org.labkey.api.assay.plate.Position;
2223
import org.labkey.api.data.Container;
@@ -39,8 +40,8 @@
3940
import org.labkey.api.util.PageFlowUtil;
4041
import org.labkey.api.view.ActionURL;
4142
import org.labkey.api.view.ViewBackgroundInfo;
43+
import org.labkey.vfs.FileLike;
4244

43-
import java.io.File;
4445
import java.util.HashMap;
4546
import java.util.List;
4647
import java.util.Map;
@@ -79,10 +80,10 @@ public interface ElispotDataFileParser
7980
List<Map<String, Object>> getResults() throws ExperimentException;
8081
}
8182

82-
public abstract ElispotDataFileParser getDataFileParser(ExpData data, File dataFile, ViewBackgroundInfo info, Logger log, XarContext context);
83+
public abstract ElispotDataFileParser getDataFileParser(ExpData data, FileLike dataFile, ViewBackgroundInfo info, Logger log, XarContext context);
8384

8485
@Override
85-
public void importFile(ExpData data, File dataFile, ViewBackgroundInfo info, Logger log, XarContext context) throws ExperimentException
86+
public void importFile(@NotNull ExpData data, @NotNull FileLike dataFile, @NotNull ViewBackgroundInfo info, @NotNull Logger log, @NotNull XarContext context) throws ExperimentException
8687
{
8788
ExpRun run = data.getRun();
8889

elispotassay/src/org/labkey/elispot/ElispotDataHandler.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,10 @@ public DataType getDataType()
8989
static class ElispotFileParser implements ElispotDataFileParser
9090
{
9191
private final ExpData _data;
92-
private final File _dataFile;
92+
private final FileLike _dataFile;
9393
private final XarContext _context;
9494

95-
public ElispotFileParser(ExpData data, File dataFile, XarContext context)
95+
public ElispotFileParser(ExpData data, FileLike dataFile, XarContext context)
9696
{
9797
_data = data;
9898
_dataFile = dataFile;
@@ -199,7 +199,7 @@ else if (SPOT_SIZE_PROPERTY_NAME.equalsIgnoreCase(measurement))
199199
}
200200

201201
@Override
202-
public ElispotDataFileParser getDataFileParser(ExpData data, File dataFile, ViewBackgroundInfo info, Logger log, XarContext context)
202+
public ElispotDataFileParser getDataFileParser(ExpData data, FileLike dataFile, ViewBackgroundInfo info, Logger log, XarContext context)
203203
{
204204
return new ElispotFileParser(data, dataFile, context);
205205
}
@@ -213,7 +213,7 @@ public void importTransformDataMap(ExpData data, AssayRunUploadContext<?> contex
213213
@Override
214214
public Map<DataType, DataIteratorBuilder> getValidationDataMap(ExpData data, FileLike dataFile, ViewBackgroundInfo info, Logger log, XarContext context, DataLoaderSettings settings) throws ExperimentException
215215
{
216-
ElispotDataFileParser parser = getDataFileParser(data, dataFile.toNioPathForRead().toFile(), info, log, context);
216+
ElispotDataFileParser parser = getDataFileParser(data, dataFile, info, log, context);
217217

218218
Map<DataType, DataIteratorBuilder> datas = new HashMap<>();
219219
List<Map<String, Object>> rows = parser.getResults();
@@ -222,7 +222,7 @@ public Map<DataType, DataIteratorBuilder> getValidationDataMap(ExpData data, Fil
222222
return datas;
223223
}
224224

225-
public static Map<PlateInfo, Plate> initializePlates(ExpProtocol protocol, File dataFile, Plate template, PlateReader reader) throws ExperimentException
225+
public static Map<PlateInfo, Plate> initializePlates(ExpProtocol protocol, FileLike dataFile, Plate template, PlateReader reader) throws ExperimentException
226226
{
227227
AssayProvider provider = AssayService.get().getProvider(protocol);
228228
Map<PlateInfo, Plate> plateMap = new HashMap<>();

elispotassay/src/org/labkey/elispot/ElispotUploadWizardAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ protected ExpRun finishPost(ElispotRunUploadForm form, BindException errors)
519519
if (runPropMap.containsKey(ElispotAssayProvider.READER_PROPERTY_NAME))
520520
{
521521
reader = provider.getPlateReader(runPropMap.get(ElispotAssayProvider.READER_PROPERTY_NAME));
522-
plates = ElispotDataHandler.initializePlates(form.getProtocol(), data.get(0).getFile(), template, reader);
522+
plates = ElispotDataHandler.initializePlates(form.getProtocol(), data.get(0).getFileLike(), template, reader);
523523
}
524524

525525
boolean subtractBackground = NumberUtils.toInt(runPropMap.get(ElispotAssayProvider.BACKGROUND_WELL_PROPERTY_NAME), 0) > 0;

elispotassay/src/org/labkey/elispot/PlateAnalytePropertyHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public PlateAnalytePropertyHelper(ElispotRunUploadForm form, List<? extends Doma
6161
if (runPropMap.containsKey(ElispotAssayProvider.READER_PROPERTY_NAME))
6262
{
6363
reader = form.getProvider().getPlateReader(runPropMap.get(ElispotAssayProvider.READER_PROPERTY_NAME));
64-
for (PlateUtils.GridInfo grid : reader.loadMultiGridFile(template, file.toNioPathForRead().toFile()))
64+
for (PlateUtils.GridInfo grid : reader.loadMultiGridFile(template, file))
6565
{
6666
// attempt to parse the plate grid annotation into a PlateInfo object
6767
FluorescentPlateInfo plateInfo = FluorescentPlateInfo.create(grid.getAnnotations());

elispotassay/src/org/labkey/elispot/pipeline/BackgroundSubtractionJob.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.labkey.elispot.ElispotManager;
4747
import org.labkey.elispot.RunDataRow;
4848
import org.labkey.elispot.plate.PlateInfo;
49+
import org.labkey.vfs.FileLike;
4950

5051
import java.io.File;
5152
import java.io.IOException;
@@ -185,12 +186,12 @@ private Plate initializePlate(PlateBasedAssayProvider provider, ExpRun run, Plat
185186

186187
if (reader != null)
187188
{
188-
File dataFile = data.get(0).getFile();
189+
FileLike dataFile = data.get(0).getFileLike();
189190

190191
if (dataFile.exists())
191192
{
192193
// TODO: how to handle background subtraction for fluorospot scans
193-
for (Map.Entry<PlateInfo, Plate> entry : ElispotDataHandler.initializePlates(run.getProtocol(), data.get(0).getFile(), template, reader).entrySet())
194+
for (Map.Entry<PlateInfo, Plate> entry : ElispotDataHandler.initializePlates(run.getProtocol(), dataFile, template, reader).entrySet())
194195
{
195196
if (entry.getKey().getMeasurement().equals(ElispotDataHandler.SFU_PROPERTY_NAME))
196197
{

0 commit comments

Comments
 (0)