diff --git a/bds/source/java/ch/systemsx/cisd/bds/Utilities.java b/bds/source/java/ch/systemsx/cisd/bds/Utilities.java index 305fc25175bcf63787c79ee15c064b25ad33db75..f99601db8498287d7f91e7b6ea9b6edcaeabd886 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 7fdd5ec75b814b99322b0d866681534ef4c973ec..b0f8178aa5d11544aaf0523ca0c7cafecb918895 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 a41d122f94a04477c365793b12a947098dc7988c..4517a277925febc9ee97eb5487df6ca38bfc501a 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 3874a6670c11125966f529db7811515597b76bd5..0ab1eac47c3871a2ee4f2662966ec5fb0ba8faa0 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 0f28c6016d314805beab951f3fba9a430b468e71..afe652e1e9967f3b502ae3bfc6efbf57fbf66193 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 8bde99e3f57c5650fe703a7d928a773dd37c338a..ef9251442cf83d7895092b467c796f996f058cb9 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 0000000000000000000000000000000000000000..6a5c4481ccbd23047ee62e0607114ac6285b9a37 --- /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 a5351e063ffa995659bb93bb7fc62b1f02d4a631..f97a5b55eb9eb22016046f67c1ab954c086cc5ce 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 df60fb8f20866ae89bb5036f7726678f02cc7137..a51348036bbf3bfc1cc3136bfda84685b1646590 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 0000000000000000000000000000000000000000..e499fafe4364256503b63c18c7110255702a68e8 --- /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 0000000000000000000000000000000000000000..0632673692517a55defd83639786cce8267e2473 --- /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 0000000000000000000000000000000000000000..34cccbea61632d310b9b323e11fa07516f5bb525 --- /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 0000000000000000000000000000000000000000..e41cffbf8429f9bdf9a63bab84298ef4d9d2d6a5 --- /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 0000000000000000000000000000000000000000..32a43271f6c7b5fcf8674a0601909ed62283eb20 --- /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 0000000000000000000000000000000000000000..f3419f4ea13f0ec637383051cd3667eaf8766ede --- /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 0000000000000000000000000000000000000000..34cccbea61632d310b9b323e11fa07516f5bb525 --- /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 0000000000000000000000000000000000000000..e41cffbf8429f9bdf9a63bab84298ef4d9d2d6a5 --- /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 0000000000000000000000000000000000000000..5522f919e759becee18d2afa7b63af21f7b0c6ea --- /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 0000000000000000000000000000000000000000..323c54009f5f468205919af477b92dc45b8f8950 --- /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 0000000000000000000000000000000000000000..dd5ebb5dac7eed4e01129733790d8b861b4cfe04 --- /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 0000000000000000000000000000000000000000..beb696f3dea7e5acf9a5003e62f0d46fbede6c58 --- /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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 0000000000000000000000000000000000000000..92bc789eb3b9db500d1ba7de2498c6ada8a04a07 --- /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 0000000000000000000000000000000000000000..5b5dda60d473fa5203735a9091f78fefed571902 --- /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 0000000000000000000000000000000000000000..53dd07998093f1d03fa57e0fa23a773bad6b0cb1 --- /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 0000000000000000000000000000000000000000..7ed5d0f714c2e8280a2cbc1a2f76bc2dcd8b8923 --- /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 0000000000000000000000000000000000000000..76905f1c43e74741ab07d669dae3c8e824525e99 --- /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 0000000000000000000000000000000000000000..c41fff88cffdf61eea7ab040a5fa3e660338ee58 --- /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 0000000000000000000000000000000000000000..2f61160bfa00ef45a1ac8751d63768f1fd28064c --- /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 0000000000000000000000000000000000000000..97e3a9dd3ff53d6b0830dd72587abc740cef01ab --- /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 0000000000000000000000000000000000000000..9daf273c2aac33ded80079f96abc88fd8c65148c --- /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 0000000000000000000000000000000000000000..4b7a02e2198bebf91b915871f0d5fe210a8848d1 --- /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 0000000000000000000000000000000000000000..beb696f3dea7e5acf9a5003e62f0d46fbede6c58 --- /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 0000000000000000000000000000000000000000..a464d9da742a631e9d8c104a45f2e44f1629a9a1 --- /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 0000000000000000000000000000000000000000..d9cf16b9d2ab4ea90edc9f640db7382804fd8def --- /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 0000000000000000000000000000000000000000..50ec1ec2cf84265dde7b365744a07cfdc612161c --- /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 0000000000000000000000000000000000000000..dd5ebb5dac7eed4e01129733790d8b861b4cfe04 --- /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 0000000000000000000000000000000000000000..1f8c977ecc6b64e087f8e7a8c8f87978949aefd2 --- /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 0000000000000000000000000000000000000000..a451d8b531c2ec847ff0029c8818ee7ac70d1772 --- /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 0000000000000000000000000000000000000000..adc366f3910bb9693b79be203ca4038a9b6697ee --- /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 0000000000000000000000000000000000000000..c184de169a2ee81cfe0cc7db049646f4c73409d7 --- /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 0000000000000000000000000000000000000000..c184de169a2ee81cfe0cc7db049646f4c73409d7 --- /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 0000000000000000000000000000000000000000..df2eecf1f87a6e653d9687a0c6248ef1341e57a4 --- /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 0000000000000000000000000000000000000000..93763ab9a1809c6eb7c130dc415b797cf0fed6ac --- /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 0000000000000000000000000000000000000000..a06b6468d7a56a1cb060d59d0f274db2c50a5b2e --- /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 0000000000000000000000000000000000000000..33261f111a8f715c92b0615f53792a10ce55e9f2 --- /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 0000000000000000000000000000000000000000..a464d9da742a631e9d8c104a45f2e44f1629a9a1 --- /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 0000000000000000000000000000000000000000..d9cf16b9d2ab4ea90edc9f640db7382804fd8def --- /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 0000000000000000000000000000000000000000..058f8b4a9654471cdcdca24c5287d7c7d8bf59a1 --- /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 0000000000000000000000000000000000000000..86ba82a2e61b677ebd18b7186426a43fb3c81fc4 --- /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 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /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 0000000000000000000000000000000000000000..4241ba278ae58b10aa064aa478ba4a22cb425dd5 --- /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 0000000000000000000000000000000000000000..785e0f51f19eace6b402da2540638e37c5127216 --- /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 708adfee72897580b56ab28230181bb30ec2e377..5e0f4e2f5c2d2275a0d38b6b5c8dd8aefd489684 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;