Skip to content

Commit 8a723bf

Browse files
committed
Merge branch 'develop' into fb_filePathIssues
# Conflicts: # study/test/src/org/labkey/test/tests/study/StudyDatasetFileFieldTest.java
2 parents 461682c + b33bd93 commit 8a723bf

44 files changed

Lines changed: 463 additions & 226 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.

api/src/org/labkey/api/ApiModule.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.labkey.api.action.ApiXmlWriter;
2626
import org.labkey.api.action.SpringActionController;
2727
import org.labkey.api.admin.SubfolderWriter;
28-
import org.labkey.api.assay.AssayFileWriter;
2928
import org.labkey.api.assay.AssayResultsFileWriter;
3029
import org.labkey.api.assay.ReplacedRunFilter;
3130
import org.labkey.api.assay.sample.MaterialInputRoleComparator;
@@ -445,7 +444,6 @@ public void registerServlets(ServletContext servletCtx)
445444
Table.IsSelectTestCase.class,
446445
ValidEmail.TestCase.class,
447446
URIUtil.TestCase.class,
448-
AssayFileWriter.TestCase.class,
449447
AssayResultsFileWriter.TestCase.class
450448
);
451449
}

api/src/org/labkey/api/action/AbstractFileUploadAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.labkey.api.action;
1717

18+
import jakarta.servlet.http.HttpServletRequest;
19+
import jakarta.servlet.http.HttpServletResponse;
1820
import org.labkey.api.util.ExceptionUtil;
1921
import org.labkey.api.util.FileUtil;
2022
import org.labkey.api.util.PageFlowUtil;
@@ -28,8 +30,6 @@
2830
import org.springframework.web.multipart.MultipartHttpServletRequest;
2931
import org.springframework.web.servlet.ModelAndView;
3032

31-
import jakarta.servlet.http.HttpServletRequest;
32-
import jakarta.servlet.http.HttpServletResponse;
3333
import java.io.ByteArrayInputStream;
3434
import java.io.File;
3535
import java.io.FileOutputStream;

api/src/org/labkey/api/assay/AbstractAssayProvider.java

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.labkey.api.assay.transform.DataExchangeHandler;
3232
import org.labkey.api.assay.transform.DataTransformService;
3333
import org.labkey.api.audit.AuditLogService;
34+
import org.labkey.api.audit.provider.FileSystemAuditProvider;
3435
import org.labkey.api.data.ActionButton;
3536
import org.labkey.api.data.ButtonBar;
3637
import org.labkey.api.data.ColumnInfo;
@@ -136,7 +137,6 @@
136137
import java.util.Iterator;
137138
import java.util.LinkedHashMap;
138139
import java.util.List;
139-
import java.util.ListIterator;
140140
import java.util.Map;
141141
import java.util.Objects;
142142
import java.util.Set;
@@ -1798,7 +1798,7 @@ public record AssayFileMoveData(ExpRun run, Container sourceContainer, String fi
17981798
public record AssayMoveData(Map<String, Integer> counts, Map<Integer, List<AssayFileMoveData>> fileMovesByRunId) {}
17991799

18001800
@Override
1801-
public void moveRuns(List<ExpRun> runs, Container targetContainer, User user, AbstractAssayProvider.AssayMoveData assayMoveData) throws ExperimentException
1801+
public void moveRuns(List<ExpRun> runs, Container targetContainer, User user, AssayMoveData assayMoveData) throws ExperimentException
18021802
{
18031803
if (runs.isEmpty())
18041804
return;
@@ -1968,7 +1968,7 @@ private void moveRunsBatch(List<ExpRun> runs, Container sourceContainer, Contain
19681968
if (updatedFile != null)
19691969
{
19701970
if (!fileMoveReferences.containsKey(sourceFileName))
1971-
fileMoveReferences.put(sourceFileName, new AssayFileMoveReference(sourceFileName, updatedFile, experiment.getName()));
1971+
fileMoveReferences.put(sourceFileName, new AssayFileMoveReference(sourceFileName, updatedFile, experiment.getName(), fileProp.getName()));
19721972

19731973
if (!fileMoveCounts.containsKey(sourceFileName))
19741974
fileMoveCounts.put(sourceFileName, 0);
@@ -1991,6 +1991,11 @@ private void moveRunsBatch(List<ExpRun> runs, Container sourceContainer, Contain
19911991
throw new ExperimentException("Assay batch " + ref.runName + " cannot be moved since it references a shared file: " + sourceFile.getName());
19921992

19931993
fileContentService.fireFileMoveEvent(sourceFile.toPath(), ref.updatedFile.toPath(), user, sourceContainer, targetContainer);
1994+
FileSystemAuditProvider.FileSystemAuditEvent event = new FileSystemAuditProvider.FileSystemAuditEvent(targetContainer, "File moved from " + sourceContainer.getPath() + " to " + targetContainer.getPath() + ".");
1995+
event.setProvidedFileName(sourceFile.getName());
1996+
event.setFile(ref.updatedFile.getName());
1997+
event.setDirectory(ref.updatedFile.getParent());
1998+
AuditLogService.get().addEvent(user, event);
19941999
}
19952000

19962001
}
@@ -2050,7 +2055,7 @@ private void updateRunFiles(List<ExpRun> runs, Container sourceContainer, Contai
20502055
if (updatedFile != null)
20512056
{
20522057
if (!fileMoveReferences.containsKey(sourceFileName))
2053-
fileMoveReferences.put(sourceFileName, new AssayFileMoveReference(sourceFileName, updatedFile, run.getName()));
2058+
fileMoveReferences.put(sourceFileName, new AssayFileMoveReference(sourceFileName, updatedFile, run.getName(), fileProp.getName()));
20542059

20552060
if (!fileMoveCounts.containsKey(sourceFileName))
20562061
fileMoveCounts.put(sourceFileName, 0);
@@ -2072,6 +2077,12 @@ private void updateRunFiles(List<ExpRun> runs, Container sourceContainer, Contai
20722077
throw new ExperimentException("Assay run " + ref.runName + " cannot be moved since it references a shared file: " + sourceFile.getName());
20732078

20742079
fileContentService.fireFileMoveEvent(sourceFile.toPath(), ref.updatedFile.toPath(), user, sourceContainer, targetContainer);
2080+
FileSystemAuditProvider.FileSystemAuditEvent event = new FileSystemAuditProvider.FileSystemAuditEvent(targetContainer, "File moved from " + sourceContainer.getPath() + " to " + targetContainer.getPath() + ".");
2081+
event.setProvidedFileName(sourceFile.getName());
2082+
event.setFile(ref.updatedFile.getName());
2083+
event.setDirectory(ref.updatedFile.getParent());
2084+
event.setFieldName(ref.fieldName);
2085+
AuditLogService.get().addEvent(user, event);
20752086
}
20762087

20772088
}
@@ -2116,6 +2127,11 @@ private void updateDataFileUrl(List<ExpRun> runs, Container sourceContainer, Con
21162127
movedFiles.putIfAbsent(runId, new ArrayList<>());
21172128
movedFiles.get(runId).add(new AssayFileMoveData(run, run.getContainer(), null, sourceFile, updatedFile));
21182129
fileContentService.fireFileMoveEvent(sourceFile.toPath(), updatedFile.toPath(), user, sourceContainer, targetContainer);
2130+
FileSystemAuditProvider.FileSystemAuditEvent event = new FileSystemAuditProvider.FileSystemAuditEvent(targetContainer, "File moved from " + sourceContainer.getPath() + " to " + targetContainer.getPath() + ".");
2131+
event.setProvidedFileName(sourceFile.getName());
2132+
event.setFile(updatedFile.getName());
2133+
event.setDirectory(updatedFile.getParent());
2134+
AuditLogService.get().addEvent(user, event);
21192135
}
21202136
}
21212137
catch (Exception e)
@@ -2136,7 +2152,7 @@ protected void moveAssayResults(List<ExpRun> runs, ExpProtocol protocol, Contain
21362152
updateResultFiles(assayResultTable, runs, protocol, sourceContainer, targetContainer, user, assayMoveData);
21372153
}
21382154

2139-
record AssayFileMoveReference(String sourceFilePath, File updatedFile, String runName) {}
2155+
record AssayFileMoveReference(String sourceFilePath, File updatedFile, String runName, String fieldName) {}
21402156

21412157
private void updateResultFiles(FilteredTable assayResultTable, List<ExpRun> runs, ExpProtocol assayProtocol, Container sourceContainer, Container targetContainer, User user, AssayMoveData assayMoveData) throws ExperimentException
21422158
{
@@ -2169,10 +2185,10 @@ private void updateResultFiles(FilteredTable assayResultTable, List<ExpRun> runs
21692185
Map<Integer, ExpRun> runMap = new HashMap<>();
21702186
runs.forEach(run -> runMap.put(run.getRowId(), run));
21712187

2172-
Map<String, AssayFileMoveReference> fileMoveReferences = new HashMap<>();
2173-
Map<String, List<Integer>> fileMoveResultRowIds = new HashMap<>();
21742188
for (String fileField : fileFields)
21752189
{
2190+
Map<String, AssayFileMoveReference> fileMoveReferences = new HashMap<>();
2191+
Map<String, List<Integer>> fileMoveResultRowIds = new HashMap<>();
21762192
var fileColumn = assayResultTable.getColumn(fileField);
21772193
TableSelector ts = new TableSelector(assayResultTable, assayResultTable.getColumns("rowid", "run", fileField), filter, null);
21782194
Map<String, Object>[] resultFiles = ts.getMapArray();
@@ -2194,7 +2210,7 @@ private void updateResultFiles(FilteredTable assayResultTable, List<ExpRun> runs
21942210
ExpRun run = runMap.get(resultRunId);
21952211

21962212
if (!fileMoveReferences.containsKey(sourceFileName))
2197-
fileMoveReferences.put(sourceFileName, new AssayFileMoveReference(sourceFileName, updatedFile, run.getName()));
2213+
fileMoveReferences.put(sourceFileName, new AssayFileMoveReference(sourceFileName, updatedFile, run.getName(),fileField));
21982214

21992215
movedFiles.putIfAbsent(resultRunId, new ArrayList<>());
22002216
movedFiles.get(resultRunId).add(new AssayFileMoveData(run, run.getContainer(), fileField, sourceFile, updatedFile));
@@ -2234,6 +2250,12 @@ private void updateResultFiles(FilteredTable assayResultTable, List<ExpRun> runs
22342250
.append(" WHERE rowId ").appendInClause(fileMoveResultRowIds.get(sourceFileName), realTable.getSqlDialect());
22352251
new SqlExecutor(assayResultTable.getSchema()).execute(updateSql);
22362252

2253+
FileSystemAuditProvider.FileSystemAuditEvent event = new FileSystemAuditProvider.FileSystemAuditEvent(targetContainer, "File moved from " + sourceContainer.getPath() + " to " + targetContainer.getPath() + ".");
2254+
event.setProvidedFileName(sourceFile.getName());
2255+
event.setFile(updatedFile.getName());
2256+
event.setDirectory(updatedFile.getParent());
2257+
event.setFieldName(ref.fieldName);
2258+
AuditLogService.get().addEvent(user, event);
22372259
}
22382260

22392261
}

api/src/org/labkey/api/assay/AbstractTempDirDataCollector.java

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,18 @@
1616
package org.labkey.api.assay;
1717

1818
import org.apache.commons.io.FileUtils;
19-
import org.apache.logging.log4j.LogManager;
2019
import org.apache.logging.log4j.Logger;
2120
import org.jetbrains.annotations.Nullable;
2221
import org.labkey.api.assay.actions.AssayRunUploadForm;
22+
import org.labkey.api.audit.AuditLogService;
23+
import org.labkey.api.audit.provider.FileSystemAuditProvider;
2324
import org.labkey.api.exp.ExperimentException;
2425
import org.labkey.api.exp.api.ExpData;
2526
import org.labkey.api.exp.api.ExpRun;
2627
import org.labkey.api.query.BatchValidationException;
2728
import org.labkey.api.util.FileUtil;
2829
import org.labkey.api.util.NetworkDrive;
30+
import org.labkey.api.util.logging.LogHelper;
2931
import org.labkey.vfs.FileLike;
3032

3133
import java.io.File;
@@ -43,17 +45,16 @@
4345
public abstract class AbstractTempDirDataCollector<ContextType extends AssayRunUploadContext<? extends AssayProvider>> extends AbstractAssayDataCollector<ContextType>
4446
{
4547
protected boolean _uploadComplete = false;
46-
private static final String TMPFILE = "tmp";
4748

48-
private static final Logger LOG = LogManager.getLogger(AbstractTempDirDataCollector.class);
49+
private static final Logger LOG = LogHelper.getLogger(AbstractTempDirDataCollector.class, "Activity related to data collection into a temporary directory");
4950

5051
private void removeTempDir(ContextType context) throws ExperimentException
5152
{
5253
// TODO: remove this instanceof check
5354
if (!(context instanceof AssayRunUploadForm))
5455
return;
5556

56-
String uploadAttemptID = ((AssayRunUploadForm)context).getUploadAttemptID();
57+
String uploadAttemptID = ((AssayRunUploadForm<?>) context).getUploadAttemptID();
5758

5859
// Cleanup files other than input generated by transform scripts
5960
FileLike tempDir = ensureSubdirectory(context.getContainer(), TEMP_DIR_NAME);
@@ -71,24 +72,6 @@ private void removeTempDir(ContextType context) throws ExperimentException
7172
}
7273
}
7374

74-
private void removeFiles(ContextType context, Collection<Map<String, File>> assayFiles) throws ExperimentException
75-
{
76-
for (Map<String, File> fileMap : assayFiles)
77-
{
78-
for (File file : fileMap.values())
79-
{
80-
FileLike assayFile = ensureUploadDirectory(context.getContainer(), DIR_NAME).resolveChild(file.getName());
81-
FileUtils.deleteQuietly(assayFile.toNioPathForWrite().toFile());
82-
}
83-
}
84-
}
85-
86-
protected void uploadFailed(ContextType context, List<Map<String, File>> assayFiles) throws ExperimentException
87-
{
88-
removeTempDir(context);
89-
removeFiles(context, assayFiles);
90-
}
91-
9275
@Override
9376
public void initDir(ContextType context) throws ExperimentException
9477
{
@@ -99,7 +82,7 @@ public void initDir(ContextType context) throws ExperimentException
9982
if (!(context instanceof AssayRunUploadForm))
10083
return;
10184

102-
String uploadAttemptID = ((AssayRunUploadForm)context).getUploadAttemptID();
85+
String uploadAttemptID = ((AssayRunUploadForm<?>)context).getUploadAttemptID();
10386

10487
// Cleanup transform script output files if generated by warning feature
10588
FileLike tempDir = AssayFileWriter.ensureSubdirectory(context.getContainer(), TEMP_DIR_NAME);
@@ -140,7 +123,7 @@ protected FileLike getFileTargetDir(ContextType context) throws ExperimentExcept
140123
try
141124
{
142125
FileLike tempDir = ensureSubdirectory(context.getContainer(), TEMP_DIR_NAME);
143-
uploadAttemptDir = tempDir.resolveChild(((AssayRunUploadForm)context).getUploadAttemptID());
126+
uploadAttemptDir = tempDir.resolveChild(((AssayRunUploadForm<?>)context).getUploadAttemptID());
144127

145128
if (!NetworkDrive.exists(uploadAttemptDir))
146129
{
@@ -169,7 +152,7 @@ protected FileLike getFileTargetDir(ContextType context) throws ExperimentExcept
169152
protected FileLike getFilePath(ContextType context, @Nullable ExpRun run, FileLike tempDirFile) throws ExperimentException
170153
{
171154
FileLike assayDir = ensureUploadDirectory(context.getContainer());
172-
return findUniqueFileName(tempDirFile.getName(), assayDir);
155+
return FileUtil.findUniqueFileName(tempDirFile.getName(), assayDir);
173156
}
174157

175158
// This is the default case to move the primary file from the temp directory to the assayData directory
@@ -229,10 +212,15 @@ public Map<String, FileLike> uploadComplete(ContextType context, @Nullable ExpRu
229212
run.save(context.getUser());
230213
}
231214
handleTempFile(tempDirFile.toNioPathForWrite().toFile(), assayDirFile.toNioPathForWrite().toFile());
215+
FileSystemAuditProvider.FileSystemAuditEvent event = new FileSystemAuditProvider.FileSystemAuditEvent(context.getContainer(), "Primary file provided for assay import");
216+
event.setProvidedFileName(tempDirFile.getName());
217+
event.setFile(assayDirFile.getName());
218+
event.setDirectory(assayDirFile.getParent().toURI().getPath());
219+
AuditLogService.get().addEvent(context.getUser(), event);
232220
}
233221
else
234222
{
235-
LOG.warn("Unable to resolve import/upload file location for file: " + tempDirFile);
223+
LOG.warn("Unable to resolve import/upload file location for file: {}", tempDirFile);
236224
}
237225
}
238226
FileUtils.deleteDirectory(tempDir.toNioPathForWrite().toFile());

0 commit comments

Comments
 (0)