diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MaterialIdentifier.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MaterialIdentifier.java index 74394898bc2fe52d31b46ba0d85aeec7264ab5f5..a480f85f132a4273b92f86a0faba879fbe72bb53 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MaterialIdentifier.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MaterialIdentifier.java @@ -93,29 +93,35 @@ public final class MaterialIdentifier implements Serializable * full identifier is specified. * * @return <code>null</code> if no full identifier specified and material type is unknown. + * @throw {@link IllegalArgumentException} if material type of full identifier doesn't match + * specified material type. */ public static MaterialIdentifier tryCreate(String codeOrIdentifierOrNull, ICodeHolder materialTypeCodeHolderOrNull) { MaterialIdentifier materialIdentifier = MaterialIdentifier.tryParseIdentifier(codeOrIdentifierOrNull); - if (materialIdentifier == null) + if (materialIdentifier != null) { - // if the material type of the property is fixed, then we accept when only material - // code is specified and its type is skipped (we know what the type should be) if (materialTypeCodeHolderOrNull != null - && StringUtils.isBlank(codeOrIdentifierOrNull) == false) + && materialIdentifier.getTypeCode().equals( + materialTypeCodeHolderOrNull.getCode()) == false) { - materialIdentifier = - new MaterialIdentifier(codeOrIdentifierOrNull, - materialTypeCodeHolderOrNull.getCode()); - } else - { - // identifier is invalid or null - return null; + throw new IllegalArgumentException("Material identified by '" + materialIdentifier + + "' has to be of type " + materialTypeCodeHolderOrNull.getCode() + "."); } + return materialIdentifier; + } + // if the material type of the property is fixed, then we accept when only material + // code is specified and its type is skipped (we know what the type should be) + if (materialTypeCodeHolderOrNull != null + && StringUtils.isBlank(codeOrIdentifierOrNull) == false) + { + return new MaterialIdentifier(codeOrIdentifierOrNull, + materialTypeCodeHolderOrNull.getCode()); } - return materialIdentifier; + // identifier is invalid or null + return null; } /** diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/EntityExistenceChecker.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/EntityExistenceChecker.java index 27d4e2130084714282afcf0551c6b0e3f71c4ab6..15cfe7f2537c1aff9b092cb40fd036914a4247d0 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/EntityExistenceChecker.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/EntityExistenceChecker.java @@ -357,15 +357,21 @@ class EntityExistenceChecker { String value = property.getValue(); MaterialTypePE materialType = propertyTypePE.getMaterialType(); - MaterialIdentifier materialIdentifier = - MaterialIdentifier.tryCreate(value, materialType); - if (materialIdentifier == null) + try { - errors.add("Material identifier not in the form '<material code> (<material type code>)': " - + value); - } else + MaterialIdentifier materialIdentifier = + MaterialIdentifier.tryCreate(value, materialType); + if (materialIdentifier == null) + { + errors.add("Material identifier not in the form '<material code> (<material type code>)': " + + value); + } else + { + materialExistenceManager.exists(materialIdentifier); + } + } catch (Exception ex) { - materialExistenceManager.exists(materialIdentifier); + errors.add(ex.getMessage()); } } } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MaterialIdentifierTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MaterialIdentifierTest.java index 3aa917f1316d9934fbf5e8e0e7348c98823bb732..6abce0277275758c5eff02c32e6f8d38bc75ad39 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MaterialIdentifierTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MaterialIdentifierTest.java @@ -53,11 +53,26 @@ public class MaterialIdentifierTest extends AssertJUnit @Test public void testTryCreateWithFullIdentifierAndType() { - MaterialType materialType = new MaterialTypeBuilder().code("MY_M").getMaterialType(); + MaterialType materialType = new MaterialTypeBuilder().code("MY_MATERIAL").getMaterialType(); assertEquals("ABC (MY_MATERIAL)", MaterialIdentifier.tryCreate("ABC (MY_MATERIAL)", materialType).toString()); } + @Test + public void testTryCreateWithFullIdentifierAndInconsistentType() + { + MaterialType materialType = new MaterialTypeBuilder().code("MY_M").getMaterialType(); + try + { + MaterialIdentifier.tryCreate("ABC (MY_MATERIAL)", materialType); + fail("IllegalArgumentException expected"); + } catch (IllegalArgumentException ex) + { + assertEquals("Material identified by 'ABC (MY_MATERIAL)' has to be of type MY_M.", + ex.getMessage()); + } + } + @Test public void testTryCreateWithCodeAndType() {