From 9761e618ffca8928793211554f34392e3078d9d3 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 19 Feb 2013 12:58:04 +0000
Subject: [PATCH] SP-523 Recent bug fix improved and tested.

SVN: 28393
---
 .../server/EntityExistenceChecker.java        | 18 +++++--
 .../server/EntityExistenceCheckerTest.java    | 51 +++++++++++++++++++
 2 files changed, 64 insertions(+), 5 deletions(-)

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 0301841573a..beb664c7fca 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,12 +357,20 @@ class EntityExistenceChecker
             {
                 String value = property.getValue();
                 MaterialTypePE materialType = propertyTypePE.getMaterialType();
-                if (materialType != null) // if material type is null, it means, the property is of
-                                          // "any material type", so we don't need to check if it
-                                          // exist
+                MaterialIdentifier materialIdentifier;
+                if (materialType != null)
+                {
+                    materialIdentifier = new MaterialIdentifier(value, materialType.getCode());
+                } else
+                {
+                    materialIdentifier = MaterialIdentifier.tryParseIdentifier(value);
+                }
+                if (materialIdentifier == null)
+                {
+                    errors.add("Material identifier not in the form '<material code> (<material type code>)': "
+                            + value);
+                } else
                 {
-                    MaterialIdentifier materialIdentifier =
-                            new MaterialIdentifier(value, materialType.getCode());
                     materialExistenceManager.exists(materialIdentifier);
                 }
             }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/EntityExistenceCheckerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/EntityExistenceCheckerTest.java
index 6ddaa805600..d4e8b2869cd 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/EntityExistenceCheckerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/EntityExistenceCheckerTest.java
@@ -448,6 +448,57 @@ public class EntityExistenceCheckerTest extends AssertJUnit
                 sample("/S1/A3", null, null, "material:B")))));
 
         assertThat(checker.getErrors(), containsExactly(new String[0]));
+        context.assertIsSatisfied();
+    }
+
+    @Test
+    public void testCheckNewSamplesWithMaterialPropertOfAnyType()
+    {
+        MaterialType type = new MaterialType();
+        type.setCode("M1");
+        MaterialTypePE materialType = materialType(type, "ALPHA");
+        prepareForAssertMaterialTypeExists(type.getCode(), materialType);
+        SampleType sampleType = new SampleType();
+        sampleType.setCode("S1");
+        prepareForAssertSampleTypeExists(sampleType.getCode(),
+                sampleType((MaterialTypePE) null, "MATERIAL"));
+        context.checking(new Expectations()
+            {
+                {
+                    one(materialDAO).tryFindMaterial(new MaterialIdentifier("B", "M1"));
+                    will(returnValue(new MaterialPE()));
+                }
+            });
+
+        checker.checkNewMaterials(Arrays.asList(new NewMaterialsWithTypes(type, Arrays
+                .asList(material("A", "alpha:12")))));
+        checker.checkNewSamples(Arrays.asList(new NewSamplesWithTypes(sampleType, Arrays.asList(
+                sample("/S1/A1", null, null, "material:A (M1)"),
+                sample("/S1/A2", null, null, "material:B (M1)"),
+                sample("/S1/A3", null, null, "material:B (M1)")))));
+
+        assertThat(checker.getErrors(), containsExactly(new String[0]));
+        context.assertIsSatisfied();
+    }
+
+    @Test
+    public void testCheckNewSamplesWithMaterialPropertyOfAnyTypeWithInvalidMaterialIdentifier()
+    {
+        SampleType sampleType = new SampleType();
+        sampleType.setCode("S1");
+        prepareForAssertSampleTypeExists(sampleType.getCode(),
+                sampleType((MaterialTypePE) null, "MATERIAL"));
+
+        checker.checkNewSamples(Arrays.asList(new NewSamplesWithTypes(sampleType, Arrays.asList(
+                sample("/S1/A1", null, null, "material:A"),
+                sample("/S1/A2", null, null, "material:B"),
+                sample("/S1/A3", null, null, "material:B")))));
+
+        assertEquals("[Material identifier not in the form "
+                + "'<material code> (<material type code>)': A, "
+                + "Material identifier not in the form '<material code> "
+                + "(<material type code>)': B]", checker.getErrors().toString());
+        context.assertIsSatisfied();
     }
 
     @Test
-- 
GitLab