From c85bc0bae8ca24aaacfa0cf2368cc5ea024d74fa Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 12 Aug 2025 15:33:59 -0700 Subject: [PATCH 1/2] Move unescapeBackslashes to a deprecated feature --- api/src/org/labkey/api/reader/TabLoader.java | 5 ++++- core/src/org/labkey/core/CoreModule.java | 5 +++++ .../labkey/test/tests/study/StudyDatasetFileFieldTest.java | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/api/src/org/labkey/api/reader/TabLoader.java b/api/src/org/labkey/api/reader/TabLoader.java index bb032c90537..f827106f888 100644 --- a/api/src/org/labkey/api/reader/TabLoader.java +++ b/api/src/org/labkey/api/reader/TabLoader.java @@ -30,6 +30,7 @@ import org.labkey.api.dataiterator.HashDataIterator; import org.labkey.api.iterator.BeanIterator; import org.labkey.api.iterator.CloseableIterator; +import org.labkey.api.settings.AppProps; import org.labkey.api.util.FileType; import org.labkey.api.util.FileUtil; import org.labkey.api.util.JunitUtil; @@ -67,6 +68,8 @@ */ public class TabLoader extends DataLoader { + public static final String FEATUREFLAG_UNESCAPE_BACKSLASH = "dataloader-unescape-backslashes"; + public static final FileType TSV_FILE_TYPE = new TabFileType(Arrays.asList(".tsv", ".txt"), ".tsv", "text/tab-separated-values"); public static final FileType CSV_FILE_TYPE = new TabFileType(Collections.singletonList(".csv"), ".csv", "text/comma-separated-values"); @@ -200,7 +203,7 @@ public FileType getFileType() private boolean _parseQuotes = true; private boolean _parseEnclosedQuotes = false; // only treat quote as quote if it comes in pairs, otherwise treat it as a regular character - private boolean _unescapeBackslashes = true; + private boolean _unescapeBackslashes = AppProps.getInstance().isOptionalFeatureEnabled(FEATUREFLAG_UNESCAPE_BACKSLASH); // Infer whether there are headers public TabLoader(File inputFile) diff --git a/core/src/org/labkey/core/CoreModule.java b/core/src/org/labkey/core/CoreModule.java index 5b9746caec2..9130b494816 100644 --- a/core/src/org/labkey/core/CoreModule.java +++ b/core/src/org/labkey/core/CoreModule.java @@ -543,6 +543,11 @@ public QuerySchema createSchema(DefaultSchema schema, Module module) "Resolve Missing Lookup Values to Null", "When Lookup Validation for a field is not selected and lookup by alternate key is enabled, resolves missing lookup values to null instead of throwing an error. This option will be removed in LabKey Server v25.11.", false, false, OptionalFeatureService.FeatureType.Deprecated)); + OptionalFeatureService.get().addFeatureFlag(new OptionalFeatureFlag(TabLoader.FEATUREFLAG_UNESCAPE_BACKSLASH, + "Resolve Missing Lookup Values to Null", + "When Lookup Validation for a field is not selected and lookup by alternate key is enabled, resolves missing lookup values to null instead of throwing an error. This option will be removed in LabKey Server v25.11.", + false, false, OptionalFeatureService.FeatureType.Deprecated)); + SiteValidationService svc = SiteValidationService.get(); if (null != svc) diff --git a/study/test/src/org/labkey/test/tests/study/StudyDatasetFileFieldTest.java b/study/test/src/org/labkey/test/tests/study/StudyDatasetFileFieldTest.java index 3bd79fbf2e7..8c354e6a0f8 100644 --- a/study/test/src/org/labkey/test/tests/study/StudyDatasetFileFieldTest.java +++ b/study/test/src/org/labkey/test/tests/study/StudyDatasetFileFieldTest.java @@ -243,7 +243,7 @@ public void testFileField() throws IOException, CommandException private void importFilePathError(String participantId, String sequenceNum, String filePath) { - String pasteData = TestDataUtils.tsvStringFromRowMapsEscapeBackslash(List.of( + String pasteData = TestDataUtils.tsvStringFromRowMaps(List.of( Map.of("ParticipantId", participantId, "SequenceNum", sequenceNum, FILE_FIELD_1, filePath)), List.of("ParticipantId", "SequenceNum", FILE_FIELD_1), true); setFormElement(Locator.name("text"), pasteData); From 4b1f2cb844755bf5b8760fb71888a9bf50496460 Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 12 Aug 2025 15:50:16 -0700 Subject: [PATCH 2/2] Fix msg --- core/src/org/labkey/core/CoreModule.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/org/labkey/core/CoreModule.java b/core/src/org/labkey/core/CoreModule.java index 9130b494816..6a18a5d3c88 100644 --- a/core/src/org/labkey/core/CoreModule.java +++ b/core/src/org/labkey/core/CoreModule.java @@ -544,8 +544,8 @@ public QuerySchema createSchema(DefaultSchema schema, Module module) "When Lookup Validation for a field is not selected and lookup by alternate key is enabled, resolves missing lookup values to null instead of throwing an error. This option will be removed in LabKey Server v25.11.", false, false, OptionalFeatureService.FeatureType.Deprecated)); OptionalFeatureService.get().addFeatureFlag(new OptionalFeatureFlag(TabLoader.FEATUREFLAG_UNESCAPE_BACKSLASH, - "Resolve Missing Lookup Values to Null", - "When Lookup Validation for a field is not selected and lookup by alternate key is enabled, resolves missing lookup values to null instead of throwing an error. This option will be removed in LabKey Server v25.11.", + "Unescape backslash character on import", + "Treat backslash '\\' character as an escape character when loading data from file.", false, false, OptionalFeatureService.FeatureType.Deprecated));