diff --git a/common/source/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactory.java b/common/source/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactory.java index f6f20d05c7eca80cab515050f61016fd77fe5a28..92a5e4e38b24346a8044abad621c267a06300ef2 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactory.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactory.java @@ -21,6 +21,8 @@ import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; +import org.apache.commons.lang.StringUtils; + import ch.systemsx.cisd.common.converter.Converter; import ch.systemsx.cisd.common.converter.ConverterPool; import ch.systemsx.cisd.common.utilities.ClassUtils; @@ -100,10 +102,10 @@ public abstract class AbstractParserObjectFactory<E> implements IParserObjectFac /** * Checks given <code>IPropertyMapper</code>. * <p> - * This method tries to find properties declared in given <code>IPropertyMapper</code> that - * are not in labels in annotated write methods (throws a - * <code>UnmatchedPropertiesException</code>) or mandatory fields that could not be found in - * the same annotated write methods (throws a <code>MandatoryPropertyMissingException</code>). + * This method tries to find properties declared in given <code>IPropertyMapper</code> that are + * not in labels in annotated write methods (throws a <code>UnmatchedPropertiesException</code>) + * or mandatory fields that could not be found in the same annotated write methods (throws a + * <code>MandatoryPropertyMissingException</code>). * </p> */ private final void checkPropertyMapper(final Class<E> clazz, final IPropertyMapper propMapper) @@ -145,7 +147,17 @@ public abstract class AbstractParserObjectFactory<E> implements IParserObjectFac { throw new IndexOutOfBoundsException(column, lineTokens); } - return lineTokens[column]; + String value = lineTokens[column]; + checkMandatory(value, propertyModel.getCode()); + return value; + } + + private void checkMandatory(String value, String code) + { + if (beanAnalyzer.isMandatory(code) && StringUtils.isBlank(value)) + { + throw new MandatoryPropertyMissingException(code); + } } /** 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 ac76b1177fcd3f9b6e9094211d77c23eb7c95753..a20260f77a16fdcab8138839f89246692f7e8ed7 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/MandatoryPropertyMissingException.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/MandatoryPropertyMissingException.java @@ -28,11 +28,19 @@ import ch.systemsx.cisd.common.collections.CollectionUtils; */ public final class MandatoryPropertyMissingException extends ParserException { - private static final String MESSAGE_FORMAT = + private static final String MISSING_PROPERTY_COLUMN = "Mandatory column(s) %s are missing (mandatory columns are %s)."; + private static final String MISSING_PROPERTY_VALUE = + "Missing value for the mandatory column '%s'."; + private static final long serialVersionUID = 1L; + public MandatoryPropertyMissingException(final String propertyField) + { + super(String.format(MISSING_PROPERTY_VALUE, propertyField)); + } + public MandatoryPropertyMissingException(final Set<String> mandatoryFields, final Set<String> missingMandatoryProperties) { @@ -44,7 +52,7 @@ public final class MandatoryPropertyMissingException extends ParserException { 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), + return String.format(MISSING_PROPERTY_COLUMN, toString(missingMandatoryProperties), toString(mandatoryFields)); } 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 2b4385431635c4ec2f94f614511a610c40801b18..459f89c37d2441b2f808c73021d90930dabe2082 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/parser/AbstractParserObjectFactoryTest.java @@ -108,6 +108,25 @@ public final class AbstractParserObjectFactoryTest } } + @Test + public final void testMandatoryFieldWithoutValue() + { + final IPropertyMapper propertyMapper = createPropertyMapper(false); + final BeanFactory beanFactory = new BeanFactory(Bean.class, propertyMapper); + final String[] lineTokens = new String[] + { "", "desc", "1" }; + String errMsg = "Missing value for the mandatory column 'name'."; + try + { + beanFactory.createObject(lineTokens); + } catch (MandatoryPropertyMissingException e) + { + assertEquals(errMsg, e.getMessage()); + return; + } + fail("Error expected: " + errMsg); + } + @Test public final void testTooManyDataColumns() {