From e50b6692159a2dcecb376dd7d551a9ad092c321e Mon Sep 17 00:00:00 2001 From: izabel <izabel> Date: Fri, 4 Jul 2008 12:41:16 +0000 Subject: [PATCH] [LMS-465] check key-value pair files for extra white characters SVN: 7042 --- .../java/ch/systemsx/cisd/bds/Utilities.java | 18 +++- .../cisd/bds/check/AbstractChecker.java | 18 ++++ .../cisd/bds/check/HCSImageChecker.java | 2 +- .../cisd/bds/check/StructureChecker.java | 45 +++++---- .../ch/systemsx/cisd/bds/storage/IFile.java | 8 ++ .../cisd/bds/storage/filesystem/File.java | 13 ++- .../cisd/bds/check/AbstractCheckerTest.java | 98 +++++++++++++++++++ .../cisd/bds/check/HCSImageCheckerTest.java | 25 ++++- .../cisd/bds/check/StructureCheckerTest.java | 46 ++++++++- .../annotations/channel1/wavelength | 2 + .../annotations/channel2/wavelength | 2 + .../TIFF/blabla_3VCP1_K13_8_w460.tif | 1 + .../TIFF/blabla_3VCP1_M03_2_w530.tif | 1 + .../TIFF/readme-not.txt | 1 + .../microX_200801011213_3VCP1/log.txt | 1 + .../channel1/row11/column13/row3_column2.tiff | 1 + .../channel2/row13/column3/row1_column2.tiff | 1 + .../bds_new_lines/metadata/data_set/code | 2 + .../metadata/data_set/is_complete | 2 + .../metadata/data_set/is_measured | 2 + .../metadata/data_set/observable_type | 2 + .../metadata/data_set/parent_codes | 0 .../metadata/data_set/producer_code | 2 + .../metadata/data_set/production_timestamp | 2 + .../experiment_identifier/experiment_code | 2 + .../metadata/experiment_identifier/group_code | 2 + .../experiment_identifier/instance_code | 2 + .../experiment_identifier/project_code | 2 + .../experiment_registration_timestamp | 2 + .../metadata/experiment_registrator/email | 2 + .../experiment_registrator/first_name | 2 + .../metadata/experiment_registrator/last_name | 2 + .../bds_new_lines/metadata/format/code | 2 + .../metadata/format/version/major | 2 + .../metadata/format/version/minor | 2 + .../bds_new_lines/metadata/md5sum/original | 4 + .../parameters/contains_original_data | 2 + .../metadata/parameters/number_of_channels | 2 + .../parameters/plate_geometry/columns | 2 + .../metadata/parameters/plate_geometry/rows | 2 + .../metadata/parameters/well_geometry/columns | 2 + .../metadata/parameters/well_geometry/rows | 2 + .../bds_new_lines/metadata/sample/code | 2 + .../bds_new_lines/metadata/sample/type_code | 2 + .../metadata/sample/type_description | 2 + .../metadata/standard_original_mapping | 2 + bds/testdata/bds_new_lines/version/major | 2 + bds/testdata/bds_new_lines/version/minor | 2 + bds/testdata/trimming/new_line_beginning | 2 + bds/testdata/trimming/new_line_end | 1 + bds/testdata/trimming/ok | 1 + bds/testdata/trimming/space_beginning | 1 + bds/testdata/trimming/space_end | 1 + .../cisd/common/utilities/FileUtilities.java | 53 ++++++++-- 54 files changed, 369 insertions(+), 35 deletions(-) create mode 100644 bds/sourceTest/java/ch/systemsx/cisd/bds/check/AbstractCheckerTest.java create mode 100644 bds/testdata/bds_new_lines/annotations/channel1/wavelength create mode 100644 bds/testdata/bds_new_lines/annotations/channel2/wavelength create mode 100644 bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/TIFF/blabla_3VCP1_K13_8_w460.tif create mode 100644 bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/TIFF/blabla_3VCP1_M03_2_w530.tif create mode 100644 bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/TIFF/readme-not.txt create mode 100644 bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/log.txt create mode 100644 bds/testdata/bds_new_lines/data/standard/channel1/row11/column13/row3_column2.tiff create mode 100644 bds/testdata/bds_new_lines/data/standard/channel2/row13/column3/row1_column2.tiff create mode 100644 bds/testdata/bds_new_lines/metadata/data_set/code create mode 100644 bds/testdata/bds_new_lines/metadata/data_set/is_complete create mode 100644 bds/testdata/bds_new_lines/metadata/data_set/is_measured create mode 100644 bds/testdata/bds_new_lines/metadata/data_set/observable_type create mode 100644 bds/testdata/bds_new_lines/metadata/data_set/parent_codes create mode 100644 bds/testdata/bds_new_lines/metadata/data_set/producer_code create mode 100644 bds/testdata/bds_new_lines/metadata/data_set/production_timestamp create mode 100644 bds/testdata/bds_new_lines/metadata/experiment_identifier/experiment_code create mode 100644 bds/testdata/bds_new_lines/metadata/experiment_identifier/group_code create mode 100644 bds/testdata/bds_new_lines/metadata/experiment_identifier/instance_code create mode 100644 bds/testdata/bds_new_lines/metadata/experiment_identifier/project_code create mode 100644 bds/testdata/bds_new_lines/metadata/experiment_registration_timestamp create mode 100644 bds/testdata/bds_new_lines/metadata/experiment_registrator/email create mode 100644 bds/testdata/bds_new_lines/metadata/experiment_registrator/first_name create mode 100644 bds/testdata/bds_new_lines/metadata/experiment_registrator/last_name create mode 100644 bds/testdata/bds_new_lines/metadata/format/code create mode 100644 bds/testdata/bds_new_lines/metadata/format/version/major create mode 100644 bds/testdata/bds_new_lines/metadata/format/version/minor create mode 100644 bds/testdata/bds_new_lines/metadata/md5sum/original create mode 100644 bds/testdata/bds_new_lines/metadata/parameters/contains_original_data create mode 100644 bds/testdata/bds_new_lines/metadata/parameters/number_of_channels create mode 100644 bds/testdata/bds_new_lines/metadata/parameters/plate_geometry/columns create mode 100644 bds/testdata/bds_new_lines/metadata/parameters/plate_geometry/rows create mode 100644 bds/testdata/bds_new_lines/metadata/parameters/well_geometry/columns create mode 100644 bds/testdata/bds_new_lines/metadata/parameters/well_geometry/rows create mode 100644 bds/testdata/bds_new_lines/metadata/sample/code create mode 100644 bds/testdata/bds_new_lines/metadata/sample/type_code create mode 100644 bds/testdata/bds_new_lines/metadata/sample/type_description create mode 100644 bds/testdata/bds_new_lines/metadata/standard_original_mapping create mode 100644 bds/testdata/bds_new_lines/version/major create mode 100644 bds/testdata/bds_new_lines/version/minor create mode 100644 bds/testdata/trimming/new_line_beginning create mode 100644 bds/testdata/trimming/new_line_end create mode 100644 bds/testdata/trimming/ok create mode 100644 bds/testdata/trimming/space_beginning create mode 100644 bds/testdata/trimming/space_end diff --git a/bds/source/java/ch/systemsx/cisd/bds/Utilities.java b/bds/source/java/ch/systemsx/cisd/bds/Utilities.java index 305fc25175b..f99601db849 100644 --- a/bds/source/java/ch/systemsx/cisd/bds/Utilities.java +++ b/bds/source/java/ch/systemsx/cisd/bds/Utilities.java @@ -102,6 +102,22 @@ public class Utilities return file.getStringContent(); } + /** + * Returns the string content of a file from the specified directory. Doesn't change line + * terminating characters to '\n'. + * + * @param directory Directory of the requested file. + * @param name Name of the file. + * @return never <code>null</code> but could return an empty string. + * @throws DataStructureException if the requested file does not exist. + */ + public static String getExactString(final IDirectory directory, final String name) + { + final INode node = tryGetFileNode(directory, name); + final IFile file = (IFile) node; + return file.getExactStringContent(); + } + /** * Returns the string content of a file from the specified directory as list of * <code>String</code> objects. @@ -252,7 +268,7 @@ public class Utilities /** Converts this object to corresponding <code>boolean</code>. */ public boolean toBoolean() { - return (this == TRUE) ? true : false; + return this == TRUE ? true : false; } /** Converts given <code>boolean</code> to this enumeration item. */ diff --git a/bds/source/java/ch/systemsx/cisd/bds/check/AbstractChecker.java b/bds/source/java/ch/systemsx/cisd/bds/check/AbstractChecker.java index 7fdd5ec75b8..b0f8178aa5d 100644 --- a/bds/source/java/ch/systemsx/cisd/bds/check/AbstractChecker.java +++ b/bds/source/java/ch/systemsx/cisd/bds/check/AbstractChecker.java @@ -236,6 +236,7 @@ public abstract class AbstractChecker { try { + checkTrimmed(problemReport, dataDir, name); return Utilities.getBoolean(dataDir, name).toBoolean(); } catch (final Exception e) { @@ -249,6 +250,7 @@ public abstract class AbstractChecker { try { + checkTrimmed(problemReport, dataSet, name); final String loadedValue = Utilities.getTrimmedString(dataSet, name); boolean matches = false; for (final String value : values) @@ -276,6 +278,7 @@ public abstract class AbstractChecker { try { + checkTrimmed(problemReport, dir, file); return Utilities.getNumber(dir, file); } catch (final Exception e) { @@ -288,6 +291,7 @@ public abstract class AbstractChecker { try { + // FIXME??? getFileOrFail(dataDir, name); } catch (final Exception e) { @@ -478,6 +482,8 @@ public abstract class AbstractChecker { try { + checkTrimmed(problemReport, dir, file); + final int loaded = Utilities.getNumber(dir, file); if (loaded != value) { @@ -489,6 +495,18 @@ public abstract class AbstractChecker } } + public static void checkTrimmed(final ProblemReport problemReport, final IDirectory dir, + final String file) + { + final String loaded = Utilities.getExactString(dir, file); + final String loadedTrimmed = Utilities.getTrimmedString(dir, file); + if (loaded.equals(loadedTrimmed) == false) + { + problemReport.error(String.format( + "Found not trimmed value in file '%s' (directory '%s').", file, dir)); + } + } + private IFile tryGetFile(final IDirectory bdsRoot, final String name) { IFile file1; diff --git a/bds/source/java/ch/systemsx/cisd/bds/check/HCSImageChecker.java b/bds/source/java/ch/systemsx/cisd/bds/check/HCSImageChecker.java index a41d122f94a..4517a277925 100644 --- a/bds/source/java/ch/systemsx/cisd/bds/check/HCSImageChecker.java +++ b/bds/source/java/ch/systemsx/cisd/bds/check/HCSImageChecker.java @@ -25,7 +25,7 @@ import ch.systemsx.cisd.bds.storage.IDirectory; import ch.systemsx.cisd.bds.storage.filesystem.NodeFactory; /** - * Allows to check consistency of <image>HCS_IMAGE V1.0</code> format. Program will try to find all + * Allows to check consistency of <code>HCS_IMAGE V1.0</code> format. Program will try to find all * the problems. If the path provided as an argument is not a readable directory or version is * incorrect (directory with version does not exist, cannot be parsed, etc.) - program will stop * processing the path complaining only about this basic problem. diff --git a/bds/source/java/ch/systemsx/cisd/bds/check/StructureChecker.java b/bds/source/java/ch/systemsx/cisd/bds/check/StructureChecker.java index 3874a6670c1..0ab1eac47c3 100644 --- a/bds/source/java/ch/systemsx/cisd/bds/check/StructureChecker.java +++ b/bds/source/java/ch/systemsx/cisd/bds/check/StructureChecker.java @@ -137,7 +137,7 @@ public final class StructureChecker extends AbstractChecker try { final IDirectory md5sum = Utilities.getSubDirectory(metadata, AbstractChecker.MD5SUM); - checkFileNotEmpty(md5sum, AbstractChecker.ORIGINAL); + checkFileNotEmpty(md5sum, AbstractChecker.ORIGINAL, false); } catch (final Exception e) { problemReport.error(e.getMessage()); @@ -149,9 +149,9 @@ public final class StructureChecker extends AbstractChecker try { final IDirectory sample = Utilities.getSubDirectory(metadata, AbstractChecker.SAMPLE); - checkFileNotEmpty(sample, AbstractChecker.TYPE_DESCRIPTION); - checkFileNotEmpty(sample, AbstractChecker.TYPE_CODE); - checkFileNotEmpty(sample, AbstractChecker.CODE); + checkFileNotEmptyAndTrimmed(sample, AbstractChecker.TYPE_DESCRIPTION); + checkFileNotEmptyAndTrimmed(sample, AbstractChecker.TYPE_CODE); + checkFileNotEmptyAndTrimmed(sample, AbstractChecker.CODE); } catch (final Exception e) { problemReport.error(e.getMessage()); @@ -164,9 +164,9 @@ public final class StructureChecker extends AbstractChecker { final IDirectory experimentRegistrator = Utilities.getSubDirectory(metadata, AbstractChecker.EXPERIMENT_REGISTRATOR); - checkFileNotEmpty(experimentRegistrator, AbstractChecker.FIRST_NAME); - checkFileNotEmpty(experimentRegistrator, AbstractChecker.LAST_NAME); - checkFileNotEmpty(experimentRegistrator, AbstractChecker.EMAIL); + checkFileNotEmptyAndTrimmed(experimentRegistrator, AbstractChecker.FIRST_NAME); + checkFileNotEmptyAndTrimmed(experimentRegistrator, AbstractChecker.LAST_NAME); + checkFileNotEmptyAndTrimmed(experimentRegistrator, AbstractChecker.EMAIL); } catch (final Exception e) { problemReport.error(e.getMessage()); @@ -184,10 +184,10 @@ public final class StructureChecker extends AbstractChecker { final IDirectory experimentIdentifier = Utilities.getSubDirectory(metadata, AbstractChecker.EXPERIMENT_IDENTIFIER); - checkFileNotEmpty(experimentIdentifier, AbstractChecker.INSTANCE_CODE); - checkFileNotEmpty(experimentIdentifier, AbstractChecker.GROUP_CODE); - checkFileNotEmpty(experimentIdentifier, AbstractChecker.PROJECT_CODE); - checkFileNotEmpty(experimentIdentifier, AbstractChecker.EXPERIMENT_CODE); + checkFileNotEmptyAndTrimmed(experimentIdentifier, AbstractChecker.INSTANCE_CODE); + checkFileNotEmptyAndTrimmed(experimentIdentifier, AbstractChecker.GROUP_CODE); + checkFileNotEmptyAndTrimmed(experimentIdentifier, AbstractChecker.PROJECT_CODE); + checkFileNotEmptyAndTrimmed(experimentIdentifier, AbstractChecker.EXPERIMENT_CODE); } catch (final Exception e) { problemReport.error(e.getMessage()); @@ -200,7 +200,7 @@ public final class StructureChecker extends AbstractChecker { final IDirectory format = getFormatOrFail(metadata); checkVersion(format); - checkFileNotEmpty(format, AbstractChecker.CODE); + checkFileNotEmptyAndTrimmed(format, AbstractChecker.CODE); } catch (final Exception e) { problemReport.error(e.getMessage()); @@ -213,10 +213,10 @@ public final class StructureChecker extends AbstractChecker { final IDirectory dataSet = Utilities.getSubDirectory(metadata, AbstractChecker.DATA_SET); - checkFileNotEmpty(dataSet, AbstractChecker.CODE); + checkFileNotEmptyAndTrimmed(dataSet, AbstractChecker.CODE); checkFileContainsTimestamp(dataSet, AbstractChecker.PRODUCTION_TIMESTAMP); - checkFileNotEmpty(dataSet, AbstractChecker.PRODUCER_CODE); - checkFileNotEmpty(dataSet, AbstractChecker.OBSERVABLE_TYPE); + checkFileNotEmptyAndTrimmed(dataSet, AbstractChecker.PRODUCER_CODE); + checkFileNotEmptyAndTrimmed(dataSet, AbstractChecker.OBSERVABLE_TYPE); final Boolean isMeasured = checkFileContainsBoolean(dataSet, IS_MEASURED); checkFileContainsEnumeration(dataSet, IS_COMPLETE, new String[] { TRUE, FALSE, UNKNOWN }); @@ -236,7 +236,7 @@ public final class StructureChecker extends AbstractChecker checkFileExists(dataSet, PARENT_CODES); } else { - checkFileNotEmpty(dataSet, PARENT_CODES); + checkFileNotEmptyAndTrimmed(dataSet, PARENT_CODES); } } catch (final Exception e) { @@ -262,6 +262,7 @@ public final class StructureChecker extends AbstractChecker { try { + checkTrimmed(problemReport, dataDir, name); if (Utilities.getDateOrNull(dataDir, name) == null) { throw new DataStructureException(String.format( @@ -273,10 +274,15 @@ public final class StructureChecker extends AbstractChecker } } - private void checkFileNotEmpty(final IDirectory dataDir, final String name) + private void checkFileNotEmpty(final IDirectory dataDir, final String name, + final boolean mustBeTrimmed) { try { + if (mustBeTrimmed) + { + checkTrimmed(problemReport, dataDir, name); + } final IFile file = getFileOrFail(dataDir, name); if (StringUtils.isEmpty(file.getStringContent())) { @@ -290,6 +296,11 @@ public final class StructureChecker extends AbstractChecker } } + private void checkFileNotEmptyAndTrimmed(final IDirectory dataDir, final String name) + { + checkFileNotEmpty(dataDir, name, true); + } + private void checkVersion(final IDirectory containerNode) { try diff --git a/bds/source/java/ch/systemsx/cisd/bds/storage/IFile.java b/bds/source/java/ch/systemsx/cisd/bds/storage/IFile.java index 0f28c6016d3..afe652e1e99 100644 --- a/bds/source/java/ch/systemsx/cisd/bds/storage/IFile.java +++ b/bds/source/java/ch/systemsx/cisd/bds/storage/IFile.java @@ -45,6 +45,14 @@ public interface IFile extends INode */ public String getStringContent(); + /** + * Returns the content of this file node as a string. Doesn't change line terminating + * characters. + * + * @return never <code>null</code> but could return an empty string. + */ + public String getExactStringContent(); + /** * Returns the content of this file node as a list of <code>String</code> objects. * <p> diff --git a/bds/source/java/ch/systemsx/cisd/bds/storage/filesystem/File.java b/bds/source/java/ch/systemsx/cisd/bds/storage/filesystem/File.java index 8bde99e3f57..ef9251442cf 100644 --- a/bds/source/java/ch/systemsx/cisd/bds/storage/filesystem/File.java +++ b/bds/source/java/ch/systemsx/cisd/bds/storage/filesystem/File.java @@ -48,11 +48,11 @@ final class File extends AbstractNode implements IFile public final byte[] getBinaryContent() { - InputStream inputStream = getInputStream(); + final InputStream inputStream = getInputStream(); try { return IOUtils.toByteArray(inputStream); - } catch (IOException ex) + } catch (final IOException ex) { throw new EnvironmentFailureException("Couldn't get data from file " + nodeFile.getAbsolutePath(), ex); @@ -67,7 +67,7 @@ final class File extends AbstractNode implements IFile try { return new FileInputStream(nodeFile); - } catch (FileNotFoundException ex) + } catch (final FileNotFoundException ex) { throw new EnvironmentFailureException("Couldn't open input stream for file " + nodeFile.getAbsolutePath()); @@ -79,6 +79,11 @@ final class File extends AbstractNode implements IFile return FileUtilities.loadToString(nodeFile); } + public final String getExactStringContent() + { + return FileUtilities.loadExactToString(nodeFile); + } + public final List<String> getStringContentList() { return FileUtilities.loadToStringList(nodeFile); @@ -90,7 +95,7 @@ final class File extends AbstractNode implements IFile try { FileUtils.copyFileToDirectory(nodeFile, directory); - } catch (IOException ex) + } catch (final IOException ex) { throw EnvironmentFailureException.fromTemplate(ex, "Couldn't not copy file '%s' to directory '%s'.", nodeFile.getAbsolutePath(), diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/check/AbstractCheckerTest.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/check/AbstractCheckerTest.java new file mode 100644 index 00000000000..6a5c4481ccb --- /dev/null +++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/check/AbstractCheckerTest.java @@ -0,0 +1,98 @@ +/* + * Copyright 2008 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.bds.check; + +import java.io.File; + +import org.testng.Assert; +import org.testng.annotations.Test; + +import ch.systemsx.cisd.bds.storage.IDirectory; +import ch.systemsx.cisd.bds.storage.filesystem.NodeFactory; +import ch.systemsx.cisd.common.utilities.OSUtilities; + +/** + * @author Izabela Adamczyk + */ +public class AbstractCheckerTest +{ + + protected final String errorFoundNotTrimmed(final String path, final String file, + final String dir) + { + return String.format("ERROR: Found not trimmed value in file '%s' (directory '%s%s')." + + OSUtilities.LINE_SEPARATOR, file, path, dir); + } + + @Test + public final void testCheckTrimmedOk() + { + final File dir = new File("testdata/trimming"); + final IDirectory containerNode = NodeFactory.createDirectoryNode(dir); + final ProblemReport problemReport = new ProblemReport(); + AbstractChecker.checkTrimmed(problemReport, containerNode, "ok"); + Assert.assertEquals(problemReport.toString(), ""); + } + + @Test + public final void testCheckTrimmedNewLineBeginning() + { + final File dir = new File("testdata/trimming"); + final IDirectory containerNode = NodeFactory.createDirectoryNode(dir); + final ProblemReport problemReport = new ProblemReport(); + final String fileName = "new_line_beginning"; + AbstractChecker.checkTrimmed(problemReport, containerNode, fileName); + Assert.assertEquals(problemReport.toString(), errorFoundNotTrimmed(dir.getAbsolutePath(), + fileName, "")); + } + + @Test + public final void testCheckTrimmedNewLineEnd() + { + final File dir = new File("testdata/trimming"); + final IDirectory containerNode = NodeFactory.createDirectoryNode(dir); + final ProblemReport problemReport = new ProblemReport(); + final String fileName = "new_line_end"; + AbstractChecker.checkTrimmed(problemReport, containerNode, fileName); + Assert.assertEquals(problemReport.toString(), errorFoundNotTrimmed(dir.getAbsolutePath(), + fileName, "")); + } + + @Test + public final void testCheckTrimmedSpaceBeginning() + { + final File dir = new File("testdata/trimming"); + final IDirectory containerNode = NodeFactory.createDirectoryNode(dir); + final ProblemReport problemReport = new ProblemReport(); + final String fileName = "space_beginning"; + AbstractChecker.checkTrimmed(problemReport, containerNode, fileName); + Assert.assertEquals(problemReport.toString(), errorFoundNotTrimmed(dir.getAbsolutePath(), + fileName, "")); + } + + @Test + public final void testCheckTrimmedSpaceEnd() + { + final File dir = new File("testdata/trimming"); + final IDirectory containerNode = NodeFactory.createDirectoryNode(dir); + final ProblemReport problemReport = new ProblemReport(); + final String fileName = "space_end"; + AbstractChecker.checkTrimmed(problemReport, containerNode, fileName); + Assert.assertEquals(problemReport.toString(), errorFoundNotTrimmed(dir.getAbsolutePath(), + fileName, "")); + } +} diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/check/HCSImageCheckerTest.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/check/HCSImageCheckerTest.java index a5351e063ff..f97a5b55eb9 100644 --- a/bds/sourceTest/java/ch/systemsx/cisd/bds/check/HCSImageCheckerTest.java +++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/check/HCSImageCheckerTest.java @@ -22,7 +22,7 @@ import java.io.IOException; import org.testng.Assert; import org.testng.annotations.Test; -public class HCSImageCheckerTest +public class HCSImageCheckerTest extends AbstractCheckerTest { private final boolean verbose = false; @@ -76,4 +76,27 @@ public class HCSImageCheckerTest new File("testdata/bds_hcs_mapping_error")).numberOfProblems(), 2); } + + @Test + public final void testNotTrimmedKeyValuePairFiles() throws IOException + { + + final File dir = new File("testdata/bds_new_lines"); + final String path = dir.getAbsolutePath(); + + Assert.assertEquals(new HCSImageChecker(verbose).getHCSImageConsistencyReport(dir) + .toString(), errorFoundNotTrimmed(path, "metadata/data_set/observable_type", "") + + errorFoundNotTrimmed(path, "metadata/format/code", "") + + errorFoundNotTrimmed(path, "major", "/metadata/format/version") + + errorFoundNotTrimmed(path, "minor", "/metadata/format/version") + + errorFoundNotTrimmed(path, "metadata/parameters/plate_geometry/rows", "") + + errorFoundNotTrimmed(path, "metadata/parameters/plate_geometry/columns", "") + + errorFoundNotTrimmed(path, "metadata/parameters/well_geometry/rows", "") + + errorFoundNotTrimmed(path, "metadata/parameters/well_geometry/columns", "") + + errorFoundNotTrimmed(path, "metadata/parameters/number_of_channels", "") + + errorFoundNotTrimmed(path, "wavelength", "/annotations/channel1") + + errorFoundNotTrimmed(path, "wavelength", "/annotations/channel2") + + errorFoundNotTrimmed(path, "metadata/parameters/contains_original_data", "")); + + } } diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/check/StructureCheckerTest.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/check/StructureCheckerTest.java index df60fb8f208..a51348036bb 100644 --- a/bds/sourceTest/java/ch/systemsx/cisd/bds/check/StructureCheckerTest.java +++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/check/StructureCheckerTest.java @@ -22,7 +22,7 @@ import java.io.IOException; import org.testng.Assert; import org.testng.annotations.Test; -public class StructureCheckerTest +public class StructureCheckerTest extends AbstractCheckerTest { private final boolean verbose = false; @@ -30,8 +30,11 @@ public class StructureCheckerTest public final void testCorrectContainer() throws IOException { - Assert.assertEquals(new StructureChecker(verbose).getStructureConsistencyReport( - new File("testdata/bds_ok")).noProblemsFound(), true); + final ProblemReport structureConsistencyReport = + new StructureChecker(verbose).getStructureConsistencyReport(new File( + "testdata/bds_ok")); + Assert.assertEquals(structureConsistencyReport.toString(), ""); + Assert.assertEquals(structureConsistencyReport.noProblemsFound(), true); } @@ -76,7 +79,40 @@ public class StructureCheckerTest @Test public final void testWrongFileFormat() { - Assert.assertEquals(new StructureChecker(verbose).getStructureConsistencyReport( - new File("testdata/bds_wrong_values")).numberOfProblems(), 7); + final ProblemReport structureConsistencyReport = + new StructureChecker(verbose).getStructureConsistencyReport(new File( + "testdata/bds_wrong_values")); + Assert.assertEquals(structureConsistencyReport.numberOfProblems(), 7); + } + + @Test + public final void testNewLinesPresentInKeyValuePairFiles() + { + final File dir = new File("testdata/bds_new_lines"); + final String path = dir.getAbsolutePath(); + + Assert.assertEquals(new StructureChecker(verbose).getStructureConsistencyReport(dir) + .toString(), errorFoundNotTrimmed(path, "major", "/version") + + errorFoundNotTrimmed(path, "minor", "/version") + + errorFoundNotTrimmed(path, "code", "/metadata/data_set") + + errorFoundNotTrimmed(path, "production_timestamp", "/metadata/data_set") + + errorFoundNotTrimmed(path, "producer_code", "/metadata/data_set") + + errorFoundNotTrimmed(path, "observable_type", "/metadata/data_set") + + errorFoundNotTrimmed(path, "is_measured", "/metadata/data_set") + + errorFoundNotTrimmed(path, "is_complete", "/metadata/data_set") + + errorFoundNotTrimmed(path, "major", "/metadata/format/version") + + errorFoundNotTrimmed(path, "minor", "/metadata/format/version") + + errorFoundNotTrimmed(path, "code", "/metadata/format") + + errorFoundNotTrimmed(path, "instance_code", "/metadata/experiment_identifier") + + errorFoundNotTrimmed(path, "group_code", "/metadata/experiment_identifier") + + errorFoundNotTrimmed(path, "project_code", "/metadata/experiment_identifier") + + errorFoundNotTrimmed(path, "experiment_code", "/metadata/experiment_identifier") + + errorFoundNotTrimmed(path, "experiment_registration_timestamp", "/metadata") + + errorFoundNotTrimmed(path, "first_name", "/metadata/experiment_registrator") + + errorFoundNotTrimmed(path, "last_name", "/metadata/experiment_registrator") + + errorFoundNotTrimmed(path, "email", "/metadata/experiment_registrator") + + errorFoundNotTrimmed(path, "type_description", "/metadata/sample") + + errorFoundNotTrimmed(path, "type_code", "/metadata/sample") + + errorFoundNotTrimmed(path, "code", "/metadata/sample")); } } diff --git a/bds/testdata/bds_new_lines/annotations/channel1/wavelength b/bds/testdata/bds_new_lines/annotations/channel1/wavelength new file mode 100644 index 00000000000..e499fafe436 --- /dev/null +++ b/bds/testdata/bds_new_lines/annotations/channel1/wavelength @@ -0,0 +1,2 @@ + +460 diff --git a/bds/testdata/bds_new_lines/annotations/channel2/wavelength b/bds/testdata/bds_new_lines/annotations/channel2/wavelength new file mode 100644 index 00000000000..06326736925 --- /dev/null +++ b/bds/testdata/bds_new_lines/annotations/channel2/wavelength @@ -0,0 +1,2 @@ + +530 diff --git a/bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/TIFF/blabla_3VCP1_K13_8_w460.tif b/bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/TIFF/blabla_3VCP1_K13_8_w460.tif new file mode 100644 index 00000000000..34cccbea616 --- /dev/null +++ b/bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/TIFF/blabla_3VCP1_K13_8_w460.tif @@ -0,0 +1 @@ +image for well k13 diff --git a/bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/TIFF/blabla_3VCP1_M03_2_w530.tif b/bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/TIFF/blabla_3VCP1_M03_2_w530.tif new file mode 100644 index 00000000000..e41cffbf842 --- /dev/null +++ b/bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/TIFF/blabla_3VCP1_M03_2_w530.tif @@ -0,0 +1 @@ +image for well m03 diff --git a/bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/TIFF/readme-not.txt b/bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/TIFF/readme-not.txt new file mode 100644 index 00000000000..32a43271f6c --- /dev/null +++ b/bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/TIFF/readme-not.txt @@ -0,0 +1 @@ +nothing to read. diff --git a/bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/log.txt b/bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/log.txt new file mode 100644 index 00000000000..f3419f4ea13 --- /dev/null +++ b/bds/testdata/bds_new_lines/data/original/microX_200801011213_3VCP1/log.txt @@ -0,0 +1 @@ +some log data diff --git a/bds/testdata/bds_new_lines/data/standard/channel1/row11/column13/row3_column2.tiff b/bds/testdata/bds_new_lines/data/standard/channel1/row11/column13/row3_column2.tiff new file mode 100644 index 00000000000..34cccbea616 --- /dev/null +++ b/bds/testdata/bds_new_lines/data/standard/channel1/row11/column13/row3_column2.tiff @@ -0,0 +1 @@ +image for well k13 diff --git a/bds/testdata/bds_new_lines/data/standard/channel2/row13/column3/row1_column2.tiff b/bds/testdata/bds_new_lines/data/standard/channel2/row13/column3/row1_column2.tiff new file mode 100644 index 00000000000..e41cffbf842 --- /dev/null +++ b/bds/testdata/bds_new_lines/data/standard/channel2/row13/column3/row1_column2.tiff @@ -0,0 +1 @@ +image for well m03 diff --git a/bds/testdata/bds_new_lines/metadata/data_set/code b/bds/testdata/bds_new_lines/metadata/data_set/code new file mode 100644 index 00000000000..5522f919e75 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/data_set/code @@ -0,0 +1,2 @@ + +microX-3VCP1 diff --git a/bds/testdata/bds_new_lines/metadata/data_set/is_complete b/bds/testdata/bds_new_lines/metadata/data_set/is_complete new file mode 100644 index 00000000000..323c54009f5 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/data_set/is_complete @@ -0,0 +1,2 @@ + +FALSE diff --git a/bds/testdata/bds_new_lines/metadata/data_set/is_measured b/bds/testdata/bds_new_lines/metadata/data_set/is_measured new file mode 100644 index 00000000000..dd5ebb5dac7 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/data_set/is_measured @@ -0,0 +1,2 @@ + +TRUE diff --git a/bds/testdata/bds_new_lines/metadata/data_set/observable_type b/bds/testdata/bds_new_lines/metadata/data_set/observable_type new file mode 100644 index 00000000000..beb696f3dea --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/data_set/observable_type @@ -0,0 +1,2 @@ + +HCS_IMAGE diff --git a/bds/testdata/bds_new_lines/metadata/data_set/parent_codes b/bds/testdata/bds_new_lines/metadata/data_set/parent_codes new file mode 100644 index 00000000000..e69de29bb2d diff --git a/bds/testdata/bds_new_lines/metadata/data_set/producer_code b/bds/testdata/bds_new_lines/metadata/data_set/producer_code new file mode 100644 index 00000000000..92bc789eb3b --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/data_set/producer_code @@ -0,0 +1,2 @@ + +microX diff --git a/bds/testdata/bds_new_lines/metadata/data_set/production_timestamp b/bds/testdata/bds_new_lines/metadata/data_set/production_timestamp new file mode 100644 index 00000000000..5b5dda60d47 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/data_set/production_timestamp @@ -0,0 +1,2 @@ + +2008-01-01 12:13:00 +0100 diff --git a/bds/testdata/bds_new_lines/metadata/experiment_identifier/experiment_code b/bds/testdata/bds_new_lines/metadata/experiment_identifier/experiment_code new file mode 100644 index 00000000000..53dd0799809 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/experiment_identifier/experiment_code @@ -0,0 +1,2 @@ + +EXP1 diff --git a/bds/testdata/bds_new_lines/metadata/experiment_identifier/group_code b/bds/testdata/bds_new_lines/metadata/experiment_identifier/group_code new file mode 100644 index 00000000000..7ed5d0f714c --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/experiment_identifier/group_code @@ -0,0 +1,2 @@ + +CISD diff --git a/bds/testdata/bds_new_lines/metadata/experiment_identifier/instance_code b/bds/testdata/bds_new_lines/metadata/experiment_identifier/instance_code new file mode 100644 index 00000000000..76905f1c43e --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/experiment_identifier/instance_code @@ -0,0 +1,2 @@ + +integration-test diff --git a/bds/testdata/bds_new_lines/metadata/experiment_identifier/project_code b/bds/testdata/bds_new_lines/metadata/experiment_identifier/project_code new file mode 100644 index 00000000000..c41fff88cff --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/experiment_identifier/project_code @@ -0,0 +1,2 @@ + +NEMO diff --git a/bds/testdata/bds_new_lines/metadata/experiment_registration_timestamp b/bds/testdata/bds_new_lines/metadata/experiment_registration_timestamp new file mode 100644 index 00000000000..2f61160bfa0 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/experiment_registration_timestamp @@ -0,0 +1,2 @@ + +2008-05-05 21:18:55 +0200 diff --git a/bds/testdata/bds_new_lines/metadata/experiment_registrator/email b/bds/testdata/bds_new_lines/metadata/experiment_registrator/email new file mode 100644 index 00000000000..97e3a9dd3ff --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/experiment_registrator/email @@ -0,0 +1,2 @@ + +franz-josef.elmer@systemsx.ch diff --git a/bds/testdata/bds_new_lines/metadata/experiment_registrator/first_name b/bds/testdata/bds_new_lines/metadata/experiment_registrator/first_name new file mode 100644 index 00000000000..9daf273c2aa --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/experiment_registrator/first_name @@ -0,0 +1,2 @@ + +John diff --git a/bds/testdata/bds_new_lines/metadata/experiment_registrator/last_name b/bds/testdata/bds_new_lines/metadata/experiment_registrator/last_name new file mode 100644 index 00000000000..4b7a02e2198 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/experiment_registrator/last_name @@ -0,0 +1,2 @@ + +Doe diff --git a/bds/testdata/bds_new_lines/metadata/format/code b/bds/testdata/bds_new_lines/metadata/format/code new file mode 100644 index 00000000000..beb696f3dea --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/format/code @@ -0,0 +1,2 @@ + +HCS_IMAGE diff --git a/bds/testdata/bds_new_lines/metadata/format/version/major b/bds/testdata/bds_new_lines/metadata/format/version/major new file mode 100644 index 00000000000..a464d9da742 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/format/version/major @@ -0,0 +1,2 @@ + +1 diff --git a/bds/testdata/bds_new_lines/metadata/format/version/minor b/bds/testdata/bds_new_lines/metadata/format/version/minor new file mode 100644 index 00000000000..d9cf16b9d2a --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/format/version/minor @@ -0,0 +1,2 @@ + +0 diff --git a/bds/testdata/bds_new_lines/metadata/md5sum/original b/bds/testdata/bds_new_lines/metadata/md5sum/original new file mode 100644 index 00000000000..50ec1ec2cf8 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/md5sum/original @@ -0,0 +1,4 @@ +eb2a9d06f9be93939469f67f2ff80114 microX_200801011213_3VCP1/log.txt +9e63f091de2de8cba08042988440778a microX_200801011213_3VCP1/TIFF/blabla_3VCP1_K13_8_w460.tif +a1a60fc84bf8f6ac7e482fe6503a340e microX_200801011213_3VCP1/TIFF/blabla_3VCP1_M03_2_w530.tif +3b7d2bde004984617606337a475f7ab3 microX_200801011213_3VCP1/TIFF/readme-not.txt diff --git a/bds/testdata/bds_new_lines/metadata/parameters/contains_original_data b/bds/testdata/bds_new_lines/metadata/parameters/contains_original_data new file mode 100644 index 00000000000..dd5ebb5dac7 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/parameters/contains_original_data @@ -0,0 +1,2 @@ + +TRUE diff --git a/bds/testdata/bds_new_lines/metadata/parameters/number_of_channels b/bds/testdata/bds_new_lines/metadata/parameters/number_of_channels new file mode 100644 index 00000000000..1f8c977ecc6 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/parameters/number_of_channels @@ -0,0 +1,2 @@ + +2 diff --git a/bds/testdata/bds_new_lines/metadata/parameters/plate_geometry/columns b/bds/testdata/bds_new_lines/metadata/parameters/plate_geometry/columns new file mode 100644 index 00000000000..a451d8b531c --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/parameters/plate_geometry/columns @@ -0,0 +1,2 @@ + +24 diff --git a/bds/testdata/bds_new_lines/metadata/parameters/plate_geometry/rows b/bds/testdata/bds_new_lines/metadata/parameters/plate_geometry/rows new file mode 100644 index 00000000000..adc366f3910 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/parameters/plate_geometry/rows @@ -0,0 +1,2 @@ + +16 diff --git a/bds/testdata/bds_new_lines/metadata/parameters/well_geometry/columns b/bds/testdata/bds_new_lines/metadata/parameters/well_geometry/columns new file mode 100644 index 00000000000..c184de169a2 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/parameters/well_geometry/columns @@ -0,0 +1,2 @@ + +3 diff --git a/bds/testdata/bds_new_lines/metadata/parameters/well_geometry/rows b/bds/testdata/bds_new_lines/metadata/parameters/well_geometry/rows new file mode 100644 index 00000000000..c184de169a2 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/parameters/well_geometry/rows @@ -0,0 +1,2 @@ + +3 diff --git a/bds/testdata/bds_new_lines/metadata/sample/code b/bds/testdata/bds_new_lines/metadata/sample/code new file mode 100644 index 00000000000..df2eecf1f87 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/sample/code @@ -0,0 +1,2 @@ + +3VCP1 diff --git a/bds/testdata/bds_new_lines/metadata/sample/type_code b/bds/testdata/bds_new_lines/metadata/sample/type_code new file mode 100644 index 00000000000..93763ab9a18 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/sample/type_code @@ -0,0 +1,2 @@ + +CELL_PLATE diff --git a/bds/testdata/bds_new_lines/metadata/sample/type_description b/bds/testdata/bds_new_lines/metadata/sample/type_description new file mode 100644 index 00000000000..a06b6468d7a --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/sample/type_description @@ -0,0 +1,2 @@ + +Screening Plate diff --git a/bds/testdata/bds_new_lines/metadata/standard_original_mapping b/bds/testdata/bds_new_lines/metadata/standard_original_mapping new file mode 100644 index 00000000000..33261f111a8 --- /dev/null +++ b/bds/testdata/bds_new_lines/metadata/standard_original_mapping @@ -0,0 +1,2 @@ +channel2/row13/column3/row1_column2.tiff I microX_200801011213_3VCP1/TIFF/blabla_3VCP1_M03_2_w530.tif +channel1/row11/column13/row3_column2.tiff I microX_200801011213_3VCP1/TIFF/blabla_3VCP1_K13_8_w460.tif diff --git a/bds/testdata/bds_new_lines/version/major b/bds/testdata/bds_new_lines/version/major new file mode 100644 index 00000000000..a464d9da742 --- /dev/null +++ b/bds/testdata/bds_new_lines/version/major @@ -0,0 +1,2 @@ + +1 diff --git a/bds/testdata/bds_new_lines/version/minor b/bds/testdata/bds_new_lines/version/minor new file mode 100644 index 00000000000..d9cf16b9d2a --- /dev/null +++ b/bds/testdata/bds_new_lines/version/minor @@ -0,0 +1,2 @@ + +0 diff --git a/bds/testdata/trimming/new_line_beginning b/bds/testdata/trimming/new_line_beginning new file mode 100644 index 00000000000..058f8b4a965 --- /dev/null +++ b/bds/testdata/trimming/new_line_beginning @@ -0,0 +1,2 @@ + +new line \ No newline at end of file diff --git a/bds/testdata/trimming/new_line_end b/bds/testdata/trimming/new_line_end new file mode 100644 index 00000000000..86ba82a2e61 --- /dev/null +++ b/bds/testdata/trimming/new_line_end @@ -0,0 +1 @@ +new line diff --git a/bds/testdata/trimming/ok b/bds/testdata/trimming/ok new file mode 100644 index 00000000000..b5754e20373 --- /dev/null +++ b/bds/testdata/trimming/ok @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/bds/testdata/trimming/space_beginning b/bds/testdata/trimming/space_beginning new file mode 100644 index 00000000000..4241ba278ae --- /dev/null +++ b/bds/testdata/trimming/space_beginning @@ -0,0 +1 @@ + new line \ No newline at end of file diff --git a/bds/testdata/trimming/space_end b/bds/testdata/trimming/space_end new file mode 100644 index 00000000000..785e0f51f19 --- /dev/null +++ b/bds/testdata/trimming/space_end @@ -0,0 +1 @@ +new line \ No newline at end of file diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java b/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java index 708adfee728..5e0f4e2f5c2 100644 --- a/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java +++ b/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java @@ -154,6 +154,34 @@ public final class FileUtilities } } + /** + * Loads a text file to a {@link String}. Doesn't append new line at the end. + * + * @param file the file that should be loaded. This method asserts that given <code>File</code> + * is not <code>null</code>. + * @return The content of the file. All newline characters are '\n' (Unix convention). Never + * returns <code>null</code>. + * @throws CheckedExceptionTunnel for wrapping an {@link IOException}, e.g. if the file does + * not exist. + */ + public static String loadExactToString(final File file) throws CheckedExceptionTunnel + { + assert file != null; + + FileReader fileReader = null; + try + { + fileReader = new FileReader(file); + return readExactString(new BufferedReader(fileReader)); + } catch (final IOException ex) + { + throw new CheckedExceptionTunnel(ex); + } finally + { + IOUtils.closeQuietly(fileReader); + } + } + /** * Writes the specified string to the specified file. * @@ -341,6 +369,19 @@ public final class FileUtilities return builder.toString(); } + private static String readExactString(final BufferedReader reader) throws IOException + { + assert reader != null : "Unspecified BufferedReader."; + final StringBuilder builder = new StringBuilder(); + int numRead = 0; + while ((numRead = reader.read()) != -1) + { + builder.append(String.copyValueOf(Character.toChars(numRead))); + } + reader.close(); + return builder.toString(); + } + private final static List<String> readStringList(final BufferedReader reader, final ILineFilter lineFilterOrNull) throws IOException { @@ -413,8 +454,8 @@ public final class FileUtilities final String msg = checkPathAccessible(directory, kindOfDirectory, "directory", false); if (msg == null && directory.isDirectory() == false) { - return String.format("Path '%s' is supposed to be a %s directory but isn't.", - directory.getPath(), kindOfDirectory); + return String.format("Path '%s' is supposed to be a %s directory but isn't.", directory + .getPath(), kindOfDirectory); } return msg; } @@ -435,8 +476,8 @@ public final class FileUtilities final String msg = checkPathAccessible(directory, kindOfDirectory, "directory", true); if (msg == null && directory.isDirectory() == false) { - return String.format("Path '%s' is supposed to be a %s directory but isn't.", - directory.getPath(), kindOfDirectory); + return String.format("Path '%s' is supposed to be a %s directory but isn't.", directory + .getPath(), kindOfDirectory); } return msg; } @@ -484,7 +525,7 @@ public final class FileUtilities } private static String checkPathAccessible(final File path, final String kindOfPath, - final String directoryOrFile, boolean readAndWrite) + final String directoryOrFile, final boolean readAndWrite) { assert path != null; assert kindOfPath != null; @@ -604,7 +645,7 @@ public final class FileUtilities private static final class LastChangedWorker { - private boolean subDirectoriesOnly; + private final boolean subDirectoriesOnly; private final long reference; -- GitLab