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
1 change: 0 additions & 1 deletion api/src/org/labkey/api/exp/api/ExperimentService.java
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,6 @@ static boolean isAliquotedFromColumn(String columnName)
try (TabLoader tabLoader = new TabLoader(valueStr))
{
tabLoader.setDelimiterCharacter(',');
tabLoader.setUnescapeBackslashes(false);
// Issue 50924: LKSM: Importing samples using naming expression referencing parent inputs with # result in error
tabLoader.setIncludeComments(true);
// Issue 51056 Samples with single double quotes in the name will not resolve if added as parent samples.
Expand Down
18 changes: 7 additions & 11 deletions api/src/org/labkey/api/qc/TsvDataExchangeHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -513,12 +513,10 @@ private RunInfo processWarningsFile(FileLike runInfoFile) throws ValidationExcep
{
try (TabLoader loader = new TabLoader(runInfoFile.toNioPathForRead().toFile(), false))
{
// Don't unescape file path names on windows (C:\foo\bar.tsv)
loader.setUnescapeBackslashes(false);
loader.setColumns(new ColumnDescriptor[]{
new ColumnDescriptor("name", String.class),
new ColumnDescriptor("value", String.class),
new ColumnDescriptor("type", String.class)
new ColumnDescriptor("name", String.class),
new ColumnDescriptor("value", String.class),
new ColumnDescriptor("type", String.class)
});

for (Map<String, Object> row : loader)
Expand Down Expand Up @@ -790,13 +788,11 @@ private List<Map<String, Object>> parseRunInfo(File runInfo)
{
try (TabLoader loader = new TabLoader(runInfo, false))
{
// Don't unescape file path names on windows (C:\foo\bar.tsv)
loader.setUnescapeBackslashes(false);
loader.setColumns(new ColumnDescriptor[]{
new ColumnDescriptor("name", String.class),
new ColumnDescriptor("value", String.class),
new ColumnDescriptor("type", String.class),
new ColumnDescriptor("transformedData", String.class)
new ColumnDescriptor("name", String.class),
new ColumnDescriptor("value", String.class),
new ColumnDescriptor("type", String.class),
new ColumnDescriptor("transformedData", String.class)
});
return loader.load();
}
Expand Down
85 changes: 2 additions & 83 deletions api/src/org/labkey/api/reader/TabLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import org.apache.commons.io.input.CharSequenceReader;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand All @@ -30,7 +29,6 @@
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;
Expand Down Expand Up @@ -68,8 +66,6 @@
*/
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");

Expand Down Expand Up @@ -138,7 +134,6 @@ private TabLoader configParsing(TabLoader loader)
{
loader.setInferTypes(false);
// Issue 43661 - Excessive logging when indexing a .log file containing backslash followed by "u" that confuses TabLoader
loader.setUnescapeBackslashes(false);
return loader;
}

Expand All @@ -160,7 +155,6 @@ public static class MysqlFactory extends AbstractDataLoaderFactory
public DataLoader createLoader(File file, boolean hasColumnHeaders, Container mvIndicatorContainer)
{
TabLoader loader = new TabLoader(file, hasColumnHeaders, mvIndicatorContainer);
loader.setUnescapeBackslashes(false);
loader.setDelimiters(fieldTerminator, lineTerminator);
loader.setParseQuotes(false);
return loader;
Expand All @@ -170,7 +164,6 @@ public DataLoader createLoader(File file, boolean hasColumnHeaders, Container mv
public DataLoader createLoader(InputStream is, boolean hasColumnHeaders, Container mvIndicatorContainer) throws IOException
{
TabLoader loader = new TabLoader(Readers.getBOMDetectingReader(is), hasColumnHeaders, mvIndicatorContainer);
loader.setUnescapeBackslashes(false);
loader.setDelimiters(fieldTerminator,lineTerminator);
loader.setParseQuotes(false);
return loader;
Expand Down Expand Up @@ -203,7 +196,6 @@ 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 = AppProps.getInstance().isOptionalFeatureEnabled(FEATUREFLAG_UNESCAPE_BACKSLASH);

// Infer whether there are headers
public TabLoader(File inputFile)
Expand Down Expand Up @@ -338,26 +330,6 @@ protected String parseValue(String value)
value = StringUtils.trimToEmpty(value);
if ("\\N".equals(value))
return _preserveEmptyString ? null : "";
if (_unescapeBackslashes && value.indexOf('\\') >= 0) // unescapeJava() is really slow
{
try
{
return StringEscapeUtils.unescapeJava(value);
}
catch (IllegalArgumentException e)
{
// Issue 16691: OctalUnescaper or UnicodeUnescaper translators will throw NumberFormatException for illegal sequences such as '\' followed by octal '9' or unicode 'zzzz'.
// StringEscapeUtils can also throw IllegalArgumentException
String msg = "Error reading data. Can't unescape value '" + value + "'. ";
if (e instanceof NumberFormatException)
msg += "Number format error ";
msg += e.getMessage();
if (isThrowOnErrors())
throw new IllegalArgumentException(msg, e);
else
_log.warn(msg);
}
}
return value;
}

Expand Down Expand Up @@ -591,11 +563,6 @@ public void setParseEnclosedQuotes(boolean parseEnclosedQuotes)
_parseEnclosedQuotes = parseEnclosedQuotes;
}

public void setUnescapeBackslashes(boolean unescapeBackslashes)
{
_unescapeBackslashes = unescapeBackslashes;
}

@Override
public void close()
{
Expand Down Expand Up @@ -1093,27 +1060,9 @@ public void testUnescape()
\tthis\\nis\\tmulti-line\tb
""";

// test no-unescaping
try (TabLoader loader = new TabLoader(data, true))
{
loader.setUnescapeBackslashes(true);
List<Map<String, Object>> rows = loader.load();
assertEquals(2, rows.size());

Map<String, Object> row = rows.get(0);
assertEquals("a", row.get("A"));
assertEquals("this\nis\tmulti-line", row.get("Multi-Line"));
assertEquals("b", row.get("B"));

row = rows.get(1);
assertNull(row.get("A"));
assertEquals("this\nis\tmulti-line", row.get("Multi-Line"));
assertEquals("b", row.get("B"));
}

// now test no-unescaping
try (TabLoader loader = new TabLoader(data, true))
{
loader.setUnescapeBackslashes(false);
List<Map<String, Object>> rows = loader.load();
assertEquals(2, rows.size());

Expand Down Expand Up @@ -1196,40 +1145,10 @@ public void testParseQuotes()
Fred\t"quoted stuff" unquoted\t1""";
data = data + "\nAlice\t\"\"\"quoted stuff\"\" unquoted";

// test no-unescaping
try (TabLoader loader = new TabLoader(data, true))
{
loader.setParseQuotes(true);
loader.setUnescapeBackslashes(true);

List<Map<String, Object>> rows = loader.load();
assertEquals(6, rows.size());

Map<String, Object> row = rows.get(0);
assertEquals("Bob", row.get("Name"));
assertEquals("with\ttab\nwith\"quote", row.get("Multi-Line"));
assertEquals(10, row.get("Age"));

row = rows.get(1);
assertEquals("Bob", row.get("Name"));
assertEquals("apple \norange\tgrape", row.get("Multi-Line"));
assertEquals(3, row.get("Age"));

row = rows.get(2);
assertEquals("Bob", row.get("Name"));
assertEquals("one\n\"two\" \tthree", row.get("Multi-Line"));
assertNull(row.get("Age"));

row = rows.get(3);
assertNull(row.get("Name"));
assertEquals("red\nblue\tgreen", row.get("Multi-Line"));
assertEquals(4, row.get("Age"));
}

// now test no-unescaping
try (TabLoader loader = new TabLoader(data, true))
{
loader.setParseQuotes(true);
loader.setUnescapeBackslashes(false);

List<Map<String, Object>> rows = loader.load();
assertEquals(6, rows.size());
Expand Down
5 changes: 0 additions & 5 deletions core/src/org/labkey/core/CoreModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -535,11 +535,6 @@ public QuerySchema createSchema(DefaultSchema schema, Module module)
"Short-circuit robots",
"Save resources by not rendering pages marked as 'noindex' for robots. This is experimental as not all robots are search engines.",
false);
OptionalFeatureService.get().addFeatureFlag(new OptionalFeatureFlag(TabLoader.FEATUREFLAG_UNESCAPE_BACKSLASH,
"Unescape backslash character on import",
"Treat backslash '\\' character as an escape character when loading data from file. This option will be removed in LabKey Server v26.3.",
false, false, OptionalFeatureService.FeatureType.Deprecated
));
OptionalFeatureService.get().addFeatureFlag(new OptionalFeatureFlag(AppProps.GENERATE_CONTROLLER_FIRST_URLS,
"Restore controller-first URLs",
"Generate URLs in a legacy format that puts the controller name before the folder path. This option will be removed in LabKey Server 26.3.",
Expand Down