diff --git a/common/source/java/ch/systemsx/cisd/common/parser/IndexOutOfBoundsException.java b/common/source/java/ch/systemsx/cisd/common/parser/IndexOutOfBoundsException.java index 5f615b245a461991be80044ed5afe7383b7b35b5..ea0c295e7e451e4c5be8c352f42069c2ff746d5c 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/IndexOutOfBoundsException.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/IndexOutOfBoundsException.java @@ -32,16 +32,17 @@ public final class IndexOutOfBoundsException extends ParserException private final String[] lineTokens; - IndexOutOfBoundsException(final int column, final String[] lineTokens) + public IndexOutOfBoundsException(final int index, final String[] lineTokens) { - super(createMessage(column, lineTokens)); - this.column = column; + super(createMessage(index, lineTokens)); + this.column = index; this.lineTokens = lineTokens; } private final static String createMessage(final int index, final String[] lineTokens) { assert lineTokens != null : "Line tokens can not be null."; + assert index >= lineTokens.length : "Index must be out of range (otherwise no reason to call this exception)."; return String.format(MESSAGE_FORMAT, index, lineTokens.length); } diff --git a/common/source/java/ch/systemsx/cisd/common/parser/MandatoryPropertyMissingException.java b/common/source/java/ch/systemsx/cisd/common/parser/MandatoryPropertyMissingException.java index 0b132316592f588b9f06af2b60e6f3fe3b5cb16a..c9042342c27ee4ae38681d3c8b3146f37a8fb5ba 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/MandatoryPropertyMissingException.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/MandatoryPropertyMissingException.java @@ -40,9 +40,11 @@ public final class MandatoryPropertyMissingException extends ParserException /** The fields that are mandatory. */ private final Set<String> mandatoryFields; - MandatoryPropertyMissingException(final Set<String> mandatoryFields, final Set<String> missingMandatoryProperties) + public MandatoryPropertyMissingException(final Set<String> mandatoryFields, + final Set<String> missingMandatoryProperties) { super(createMessage(missingMandatoryProperties)); + assert mandatoryFields != null && mandatoryFields.size() > 0 : "Unspecified mandatory fields."; this.mandatoryFields = mandatoryFields; this.missingMandatoryProperties = missingMandatoryProperties; } @@ -50,6 +52,7 @@ public final class MandatoryPropertyMissingException extends ParserException private final static String createMessage(final Set<String> missingMandatoryProperties) { assert missingMandatoryProperties != null : "Missing mandatory properties can not be null."; + assert missingMandatoryProperties.size() > 0 : "No reason to throw this exception."; return String.format(MESSAGE_FORMAT, toString(missingMandatoryProperties)); } @@ -60,7 +63,7 @@ public final class MandatoryPropertyMissingException extends ParserException public final Set<String> getMissingMandatoryProperties() { - return missingMandatoryProperties; + return Collections.unmodifiableSet(missingMandatoryProperties); } public final Set<String> getMandatoryFields() diff --git a/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java b/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java index e0d24ba110664a8fabcd0a9791d931b1e6c11774..6670c82c7424585efc9bcc928bd7a6a090269708 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java @@ -110,7 +110,7 @@ public class TabFileLoader<T> } } - List<T> load(final Reader reader) + final List<T> load(final Reader reader) { final List<T> result = new ArrayList<T>(); final Iterator<Line> lineIterator = createLineIterator(reader); diff --git a/common/source/java/ch/systemsx/cisd/common/parser/UnmatchedPropertiesException.java b/common/source/java/ch/systemsx/cisd/common/parser/UnmatchedPropertiesException.java index 9281902d4949ea564c439f7164527c6f468b3cee..dbd09511271b8a266de7e1dd8589eac345b71e20 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/UnmatchedPropertiesException.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/UnmatchedPropertiesException.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.common.parser; +import java.util.Collections; import java.util.Set; /** @@ -48,7 +49,7 @@ public final class UnmatchedPropertiesException extends ParserException */ private final Set<String> propertyNames; - UnmatchedPropertiesException(final Class<?> beanClass, final Set<String> allPropertyNames, + public UnmatchedPropertiesException(final Class<?> beanClass, final Set<String> allPropertyNames, final Set<String> mandatoryNames, final Set<String> optionalNames, final Set<String> propertyNames) { super(createMessage(beanClass, propertyNames)); @@ -78,22 +79,22 @@ public final class UnmatchedPropertiesException extends ParserException public final Set<String> getAllPropertyNames() { - return allPropertyNames; + return Collections.unmodifiableSet(allPropertyNames); } public final Set<String> getPropertyNames() { - return propertyNames; + return Collections.unmodifiableSet(propertyNames); } public final Set<String> getMandatoryNames() { - return mandatoryNames; + return Collections.unmodifiableSet(mandatoryNames); } public final Set<String> getOptionalNames() { - return optionalNames; + return Collections.unmodifiableSet(optionalNames); } } diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java index c34239fdcd8aa5aed527a4fbf3ae71c8487aabe6..3b29c1c185780f90afded53428318fcba80199b6 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java @@ -68,7 +68,7 @@ public final class AbstractParserObjectFactoryTest fail("Following properties '[isnotin]' are not part of 'Bean'."); } catch (UnmatchedPropertiesException ex) { - assertEquals(String.format(UnmatchedPropertiesException.MESSAGE_FORMAT, "Bean", "IsNotIn"), ex.getMessage()); + assertEquals("Following header columns are not part of 'Bean': IsNotIn", ex.getMessage()); } } diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/parser/TabFileLoaderTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/parser/TabFileLoaderTest.java index 43cbcaa28720d97b4bc760c1a820a1c9a98992e1..0e8cdd13512da22e0438860c8db87e2a9dd0ac64 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/parser/TabFileLoaderTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/parser/TabFileLoaderTest.java @@ -24,56 +24,80 @@ import java.util.List; import org.testng.annotations.Test; /** + * Test cases for corresponding {@link TabFileLoader} class. * - * * @author Franz-Josef Elmer */ -public class TabFileLoaderTest +public final class TabFileLoaderTest { public static final class ABC { private String a; + private String b; + private String c; + public final String getA() { return a; } + public final void setA(String a) { this.a = a; } + public final String getB() { return b; } + public final void setB(String b) { this.b = b; } + public final String getC() { return c; } + public final void setC(String c) { this.c = c; } + + // + // Object + // + @Override public String toString() { return a + b + c; } - + } - - private static final class ABCFactoryFactory implements IParserObjectFactoryFactory<ABC> + + public static final class ABCFactoryFactory implements IParserObjectFactoryFactory<ABC> { - public IParserObjectFactory<ABC> createFactory(IAliasPropertyMapper propertyMapper) throws ParserException + + // + // IParserObjectFactoryFactory + // + + public final IParserObjectFactory<ABC> createFactory(final IAliasPropertyMapper propertyMapper) + throws ParserException { return new IParserObjectFactory<ABC>() { - public ABC createObject(String[] lineTokens) throws ParserException + + // + // IParserObjectFactory + // + + public final ABC createObject(final String[] lineTokens) throws ParserException { ABC abc = new ABC(); abc.setA(lineTokens[0]); @@ -84,22 +108,22 @@ public class TabFileLoaderTest }; } } - + @Test public void testEmptyInput() { TabFileLoader<ABC> loader = new TabFileLoader<ABC>(new ABCFactoryFactory()); List<ABC> list = loader.load(new StringReader("")); - + assertEquals(0, list.size()); } - + @Test public void testFirstLineHasHeadersWithoutHashSymbolButNoRows() { TabFileLoader<ABC> loader = new TabFileLoader<ABC>(new ABCFactoryFactory()); List<ABC> list = loader.load(new StringReader("A\tB\tC\n")); - + assertEquals(list.toString(), 0, list.size()); } @@ -108,39 +132,39 @@ public class TabFileLoaderTest { loadAndCheck(""); } - + @Test public void testFirstLineWithHashSymbol() { loadAndCheck("#\n"); } - + @Test public void testFirstLineWithHashSymbolAndSomething() { loadAndCheck("#blabla\n"); } - + @Test public void testFirstLineHasMarkerAndSecondLineHasHeadersWithHashSymbol() { loadAndCheck("#\n#"); } - + @Test public void testFirstTwoLinesWithHashAndSomething() { loadAndCheck("#blabla\n" + "#blubub\n"); } - + private void loadAndCheck(String preamble) { TabFileLoader<ABC> loader = new TabFileLoader<ABC>(new ABCFactoryFactory()); List<ABC> list = loader.load(new StringReader(preamble + "A\tB\tC\n" + "a1\tb1\tc1\n" + "a2\tb2\tc2\n")); - + assertEquals(list.toString(), 2, list.size()); assertEquals("a1b1c1", list.get(0).toString()); assertEquals("a2b2c2", list.get(1).toString()); } - + }