diff --git a/api/src/org/labkey/api/assay/AssayFileWriter.java b/api/src/org/labkey/api/assay/AssayFileWriter.java index 4f04e8c478a..e1d0d10a2af 100644 --- a/api/src/org/labkey/api/assay/AssayFileWriter.java +++ b/api/src/org/labkey/api/assay/AssayFileWriter.java @@ -47,10 +47,6 @@ import java.util.Set; import java.util.TreeMap; -/** - * User: jeckels - * Date: Sep 21, 2007 - */ public class AssayFileWriter> { private static final Logger LOG = LogManager.getLogger(AssayFileWriter.class); @@ -176,7 +172,7 @@ public static File findUniqueFileName(String originalFilename, File dir) public static Path findUniqueFileName(String originalFilename, Path dir) { - if (originalFilename == null || "".equals(originalFilename)) + if (originalFilename == null || originalFilename.isEmpty()) { originalFilename = "[unnamed]"; } @@ -250,9 +246,8 @@ public Map savePostedFiles(ContextType context, Set parame { Map files = new TreeMap<>(); Set originalFileNames = new HashSet<>(); - if (context.getRequest() instanceof MultipartHttpServletRequest) + if (context.getRequest() instanceof MultipartHttpServletRequest multipartRequest) { - MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)context.getRequest(); Iterator>> iter = multipartRequest.getMultiFileMap().entrySet().iterator(); File dir = getFileTargetDir(context); Deque overflowFiles = new ArrayDeque<>(); // using a deque for easy removal of single elements @@ -292,7 +287,7 @@ public Map savePostedFiles(ContextType context, Set parame // now process overflow files, if any for (String unusedParameterName : unusedParameterNames) { - if (overflowFiles.size() < 1) + if (overflowFiles.isEmpty()) break; // we're done else { @@ -300,7 +295,7 @@ public Map savePostedFiles(ContextType context, Set parame } } - if (overflowFiles.size() > 0) // too many files; shouldn't happen, but if it does, throw an error + if (!overflowFiles.isEmpty()) // too many files; shouldn't happen, but if it does, throw an error throw new ExperimentException("Tried to save too many files: number of keys is " + parameterNames.size() + ", but " + overflowFiles.size() + " extra file(s) were found."); } diff --git a/api/src/org/labkey/api/reports/report/r/RReport.java b/api/src/org/labkey/api/reports/report/r/RReport.java index ddd87e0e3fa..97905d564e1 100644 --- a/api/src/org/labkey/api/reports/report/r/RReport.java +++ b/api/src/org/labkey/api/reports/report/r/RReport.java @@ -820,7 +820,7 @@ public String getDownloadDataHelpMessage() { try { - return new JspTemplate("/org/labkey/api/reports/report/view/rReportDesignerSyntaxRef.jsp").render(); + return new JspTemplate<>("/org/labkey/api/reports/report/view/rReportDesignerSyntaxRef.jsp").render(); } catch (Exception e) { diff --git a/api/src/org/labkey/api/util/element/DisplayField.java b/api/src/org/labkey/api/util/element/DisplayField.java index d8acfda7b42..2c78f1365af 100644 --- a/api/src/org/labkey/api/util/element/DisplayField.java +++ b/api/src/org/labkey/api/util/element/DisplayField.java @@ -17,7 +17,6 @@ import org.apache.commons.lang3.StringUtils; import org.labkey.api.util.HtmlString; -import org.labkey.api.util.PageFlowUtil; import java.io.IOException; diff --git a/api/src/org/labkey/api/view/JspTemplate.java b/api/src/org/labkey/api/view/JspTemplate.java index 594339f5efd..5188ad43df8 100644 --- a/api/src/org/labkey/api/view/JspTemplate.java +++ b/api/src/org/labkey/api/view/JspTemplate.java @@ -28,8 +28,6 @@ /** * Executes a JSP and renders output to a string. Useful for JSP templating of SQL queries, etc. - * User: adam - * Date: Aug 10, 2010 */ public class JspTemplate extends JspView { diff --git a/api/src/org/labkey/api/view/template/PageConfig.java b/api/src/org/labkey/api/view/template/PageConfig.java index b085f9118c1..9d7ed05c997 100644 --- a/api/src/org/labkey/api/view/template/PageConfig.java +++ b/api/src/org/labkey/api/view/template/PageConfig.java @@ -613,7 +613,7 @@ private void _addHandler(EventHandler eh) * NOTE element.addListener(function) is not the same as element.onclick=function! * This is for onevent handlers */ - public void addHandler(String id, String event, String handler) + public void addHandler(String id, String event, @Nullable String handler) { if (StringUtils.isBlank(id) || StringUtils.isBlank(event)) throw new IllegalArgumentException(); diff --git a/assay/api-src/org/labkey/api/assay/plate/PlateSampleFilePropertyHelper.java b/assay/api-src/org/labkey/api/assay/plate/PlateSampleFilePropertyHelper.java index 4b52f9b9d18..27d471b8d17 100644 --- a/assay/api-src/org/labkey/api/assay/plate/PlateSampleFilePropertyHelper.java +++ b/assay/api-src/org/labkey/api/assay/plate/PlateSampleFilePropertyHelper.java @@ -15,6 +15,7 @@ */ package org.labkey.api.assay.plate; +import org.apache.commons.io.IOUtils; import org.jetbrains.annotations.Nullable; import org.labkey.api.assay.AssayDataCollector; import org.labkey.api.assay.AssayFileWriter; @@ -40,6 +41,7 @@ import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.HttpView; import org.labkey.api.view.InsertView; +import org.labkey.api.view.template.PageConfig; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; @@ -57,24 +59,20 @@ import java.util.Objects; import java.util.Set; -/** - * User: brittp - * Date: Aug 16, 2010 4:59:46 PM - */ public class PlateSampleFilePropertyHelper extends PlateSamplePropertyHelper { private static final String SAMPLE_FILE_INPUT_NAME = "__sampleMetadataFile__"; - private static final int BUFFER_SIZE = 2048; public static final String SAMPLE_WELLGROUP_COLUMN = "SampleWellGroup"; public static final String PLATELOCATION_COLUMN = "PlateLocation"; + private final Container _container; + private final SampleMetadataInputFormat _metadataInputFormat; + protected ExpProtocol _protocol; protected Map> _sampleProperties; protected String _metadataNoun = "Sample"; protected String _wellGroupColumnName = SAMPLE_WELLGROUP_COLUMN; - private Container _container; private File _metadataFile; - private SampleMetadataInputFormat _metadataInputFormat; public PlateSampleFilePropertyHelper(Container container, ExpProtocol protocol, List domainProperties, Plate template, SampleMetadataInputFormat inputFormat) { @@ -86,9 +84,8 @@ public PlateSampleFilePropertyHelper(Container container, ExpProtocol protocol, private MultipartFile getMetadataFile(HttpServletRequest request) { - if (request instanceof MultipartHttpServletRequest) + if (request instanceof MultipartHttpServletRequest multipartRequest) { - MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; String entryKeyToFind; if (_metadataInputFormat == SampleMetadataInputFormat.FILE_BASED) { @@ -118,13 +115,10 @@ else if (_metadataInputFormat == SampleMetadataInputFormat.COMBINED) @Override public Map> getPostedPropertyValues(HttpServletRequest request) throws ExperimentException { - Map> result = new HashMap<>(); Map> sampleProperties = getSampleProperties(request); if (sampleProperties == null || sampleProperties.isEmpty()) throw new ExperimentException(_metadataNoun + " metadata must be provided."); - for (Map.Entry> entry : sampleProperties.entrySet()) - result.put(entry.getKey(), entry.getValue()); - return result; + return new HashMap<>(sampleProperties); } protected File getSampleMetadata(HttpServletRequest request) throws ExperimentException @@ -153,28 +147,22 @@ protected File getSampleMetadata(HttpServletRequest request) throws ExperimentEx MultipartFile metadata = getMetadataFile(request); if (metadata == null) return null; - BufferedOutputStream fos = null; - InputStream is = null; + try { File uploadDirectory = AssayFileWriter.ensureUploadDirectory(_container); _metadataFile = AssayFileWriter.findUniqueFileName(metadata.getOriginalFilename(), uploadDirectory); - fos = new BufferedOutputStream(new FileOutputStream(_metadataFile)); - is = metadata.getInputStream(); - byte[] data = new byte[BUFFER_SIZE]; - int bytes; - while ((bytes = is.read(data, 0, BUFFER_SIZE)) != -1) - fos.write(data, 0, bytes); + try (BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(_metadataFile)); + InputStream is = metadata.getInputStream()) + { + IOUtils.copy(is, fos); + } } catch (IOException e) { throw new RuntimeException(e); } - finally - { - try { if (fos != null) fos.close(); } catch (IOException ignored) {} - try { if (is != null) is.close(); } catch (IOException ignored) {} - } + return _metadataFile; } @@ -238,12 +226,7 @@ public Map> getSampleProperties(HttpServletR validateMetadataRow(row, wellGroupName, wellgroup); - Map sampleProperties = allProperties.get(wellgroup.getName()); - if (sampleProperties == null) - { - sampleProperties = new HashMap<>(); - allProperties.put(wellgroup.getName(), sampleProperties); - } + Map sampleProperties = allProperties.computeIfAbsent(wellgroup.getName(), k -> new HashMap<>()); for (DomainProperty property : _domainProperties) { @@ -260,7 +243,7 @@ public Map> getSampleProperties(HttpServletR } catch (IOException e) { - throw new ExperimentException("Unable to parse sample properties file. Please verify that the file is a valid TSV, CSV or Excel file.", e); + throw new ExperimentException("Unable to parse sample properties file. Please verify that the file is a valid TSV, CSV or Excel file.", e); } _sampleProperties = allProperties; return _sampleProperties; @@ -273,7 +256,7 @@ protected void validateMetadataRow(Map row, String wellGroupName { throw new ExperimentException("Well group \"" + wellGroupName + "\" is listed in plate location " + plateLocation + ", but the stored plate template indicates that this group should be in location " + - wellgroup.getPositionDescription() + ". Please contact an administrator to correct the saved template " + + wellgroup.getPositionDescription() + ". Please contact an administrator to correct the saved template " + "if sample locations have changed on the plate."); } } @@ -364,6 +347,7 @@ public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws out.write("
"); if (reshowFile != null) { + PageConfig pageConfig = HttpView.currentPageConfig(); PipeRoot pipelineRoot = PipelineService.get().findPipelineRoot(ctx.getContainer()); String filePath = PageFlowUtil.filter(pipelineRoot.relativePath(reshowFile).replace('\\', '/')); String updateInputFn = ""; out.write(updateInputFn); out.write("\n"); - out.write("\n"); + out.write("\n"); + pageConfig.addHandler("optionPrevUpload", "change", "showMetadataPicker(!this.checked);"); out.write("\n"); out.write("\n"); out.write("\n"); out.write("\n"); out.write("\n"); + out.write("\n"); + pageConfig.addHandler("optionNewUpload", "change", "showMetadataPicker(this.checked);"); out.write("\n"); out.write("\n"); - out.write("\n"); out.write("\n
Use the metadata that was already uploaded to the server
" + PageFlowUtil.filter(reshowFile.getName()) + "
"); - out.write("\nUpload a data file
"); } @@ -399,7 +383,6 @@ public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws } } }); - } public SampleMetadataInputFormat getMetadataInputFormat() diff --git a/core/resources/views/login.html b/core/resources/views/login.html index 36acdc22cb6..e0bfd903fca 100644 --- a/core/resources/views/login.html +++ b/core/resources/views/login.html @@ -14,7 +14,7 @@
Terms of Use
- +
diff --git a/core/src/org/labkey/core/junit/runner.jsp b/core/src/org/labkey/core/junit/runner.jsp index fcd085cec57..43990deadb8 100644 --- a/core/src/org/labkey/core/junit/runner.jsp +++ b/core/src/org/labkey/core/junit/runner.jsp @@ -15,22 +15,20 @@ * limitations under the License. */ %> -<%@ page import="org.labkey.api.util.PageFlowUtil" %> +<%@ page import="org.junit.runner.Description" %> +<%@ page import="org.junit.runner.Request" %> +<%@ page import="org.junit.runner.Runner" %> <%@ page import="org.labkey.api.view.ActionURL" %> <%@ page import="org.labkey.api.view.HttpView" %> <%@ page import="org.labkey.api.view.JspView" %> <%@ page import="org.labkey.core.junit.JunitController" %> <%@ page import="org.labkey.core.junit.JunitController.JUnitViewBean" %> -<%@ page import="org.labkey.core.junit.JunitController.RunAction" %> <%@ page import="org.labkey.core.junit.JunitController.Run2Action" %> <%@ page import="org.labkey.core.junit.JunitController.Run3Action" %> +<%@ page import="org.labkey.core.junit.JunitController.RunAction" %> <%@ page import="static org.labkey.api.util.DOM.*" %> <%@ page import="static org.labkey.api.util.DOM.Attribute.*" %> <%@ page import="static org.labkey.api.util.HtmlString.NBSP" %> -<%@ page import="org.junit.runner.Request" %> -<%@ page import="org.junit.runner.Runner" %> -<%@ page import="org.junit.runner.Description" %> -<%@ page import="org.w3c.dom.css.CSS2Properties" %> <%@ page extends="org.labkey.api.jsp.JspBase" %> <% JspView me = (JspView) HttpView.currentView(); diff --git a/pipeline/src/org/labkey/pipeline/api/PipelineQuerySchema.java b/pipeline/src/org/labkey/pipeline/api/PipelineQuerySchema.java index d7e7c43abc6..c67098bfd02 100644 --- a/pipeline/src/org/labkey/pipeline/api/PipelineQuerySchema.java +++ b/pipeline/src/org/labkey/pipeline/api/PipelineQuerySchema.java @@ -104,7 +104,7 @@ public FieldKey getContainerFieldKey() folderColumn.setFk(new ContainerForeignKey(this)); folderColumn.setDisplayColumnFactory(ContainerDisplayColumn.FACTORY); table.addColumn(folderColumn); - String urlExp = "/pipeline-status/details.view?rowId=${rowId}"; + String urlExp = "/pipeline-status-details.view?rowId=${rowId}"; table.setDetailsURL(DetailsURL.fromString(urlExp)); table.setDescription("Contains one row per pipeline job"); diff --git a/study/src/org/labkey/study/view/createStudy.jsp b/study/src/org/labkey/study/view/createStudy.jsp index 6b5e9c87ec9..49fdf128db6 100644 --- a/study/src/org/labkey/study/view/createStudy.jsp +++ b/study/src/org/labkey/study/view/createStudy.jsp @@ -70,9 +70,9 @@ Timepoint Style<%=helpPopup("Timepoint Styles", "

When using visits, administrators assign a label and a range of numerical \"Sequence Numbers\" that are grouped into visits.

If using dates, data can be grouped by day or week.

", true)%> - Dates    - Assigned Visits    - Continuous + Dates    + Assigned Visits    + Continuous ">