diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSet.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSet.java index 30cd204e6ce91e174d84f8bfb7449f44fa45e191..c46c4ba9a46476f373e4e32a94d0a6589577b41a 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSet.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSet.java @@ -1138,7 +1138,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE String propertyValue = getProperty(propertyName); return propertyValue == null ? null : Arrays.stream(propertyValue.split(",")) .map(String::trim) - .map(ZonedDateTime::parse) + .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X"))) .toArray(ZonedDateTime[]::new); } diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetCreation.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetCreation.java index 5474de75cd41fe01cf740bb1b5983cb13da56782..50c9fcddd0745dc23113117243cb84570411f63f 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetCreation.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetCreation.java @@ -457,7 +457,7 @@ public class DataSetCreation implements ICreation, ICreationIdHolder, IObjectCre String propertyValue = getProperty(propertyName); return propertyValue == null ? null : Arrays.stream(propertyValue.split(",")) .map(String::trim) - .map(ZonedDateTime::parse) + .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X"))) .toArray(ZonedDateTime[]::new); } diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetUpdate.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetUpdate.java index 81b69d88e0878b8c62b753c3eedca96defdd1817..9671f970b68b1d86ae900998c86e5a108e0224af 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetUpdate.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetUpdate.java @@ -475,7 +475,7 @@ public class DataSetUpdate implements IUpdate, IObjectUpdate<IDataSetId>, IPrope String propertyValue = getProperty(propertyName); return propertyValue == null ? null : Arrays.stream(propertyValue.split(",")) .map(String::trim) - .map(ZonedDateTime::parse) + .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X"))) .toArray(ZonedDateTime[]::new); } diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/Experiment.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/Experiment.java index c5d48c8628e3e0b610db85427a43e01fcb7082ac..c40e3996f469121effc449e0a67708478be48aa2 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/Experiment.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/Experiment.java @@ -822,7 +822,7 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder String propertyValue = getProperty(propertyName); return propertyValue == null ? null : Arrays.stream(propertyValue.split(",")) .map(String::trim) - .map(ZonedDateTime::parse) + .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X"))) .toArray(ZonedDateTime[]::new); } diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/create/ExperimentCreation.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/create/ExperimentCreation.java index a3537b93f47f9a60cc36448312c1fc17c92858c2..6097d4802ad6dadfb530d53a1f4b97f3a6cea792 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/create/ExperimentCreation.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/create/ExperimentCreation.java @@ -310,7 +310,7 @@ public class ExperimentCreation implements ICreation, IObjectCreation, ICreation String propertyValue = getProperty(propertyName); return propertyValue == null ? null : Arrays.stream(propertyValue.split(",")) .map(String::trim) - .map(ZonedDateTime::parse) + .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X"))) .toArray(ZonedDateTime[]::new); } diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/update/ExperimentUpdate.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/update/ExperimentUpdate.java index eb09ed062d50a2d95069ae643f167b2524940b53..c577701b7abad353bf982cae9da78ca3c637dfcc 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/update/ExperimentUpdate.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/update/ExperimentUpdate.java @@ -352,7 +352,7 @@ public class ExperimentUpdate implements IUpdate, IObjectUpdate<IExperimentId>, String propertyValue = getProperty(propertyName); return propertyValue == null ? null : Arrays.stream(propertyValue.split(",")) .map(String::trim) - .map(ZonedDateTime::parse) + .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X"))) .toArray(ZonedDateTime[]::new); } diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/Material.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/Material.java index 00bc64275af06e693ddd603ac125fa9c118f6c4f..05af8f4f37848d9bceb842cbbfd55a49b2d92a4f 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/Material.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/Material.java @@ -488,7 +488,7 @@ public class Material implements Serializable, ICodeHolder, IEntityTypeHolder, I String propertyValue = getProperty(propertyName); return propertyValue == null ? null : Arrays.stream(propertyValue.split(",")) .map(String::trim) - .map(ZonedDateTime::parse) + .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X"))) .toArray(ZonedDateTime[]::new); } diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/create/MaterialCreation.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/create/MaterialCreation.java index eab2d2336d75017fb77a3130335190262bbf978b..b09ac0ad5cdef044c56a1a7bb4a0a091996b253a 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/create/MaterialCreation.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/create/MaterialCreation.java @@ -296,7 +296,7 @@ public class MaterialCreation implements ICreation, IObjectCreation, ICreationId String propertyValue = getProperty(propertyName); return propertyValue == null ? null : Arrays.stream(propertyValue.split(",")) .map(String::trim) - .map(ZonedDateTime::parse) + .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X"))) .toArray(ZonedDateTime[]::new); } diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/update/MaterialUpdate.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/update/MaterialUpdate.java index 56735bf8ad34e3246bb33f6d6a427bf346fd47b3..d1cfe873086c796d6af3600fb00d0c413c137cbb 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/update/MaterialUpdate.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/update/MaterialUpdate.java @@ -280,7 +280,7 @@ public class MaterialUpdate implements IUpdate, IObjectUpdate<IMaterialId>, IPro String propertyValue = getProperty(propertyName); return propertyValue == null ? null : Arrays.stream(propertyValue.split(",")) .map(String::trim) - .map(ZonedDateTime::parse) + .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X"))) .toArray(ZonedDateTime[]::new); } diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/Sample.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/Sample.java index 8cd3bbe21fb71415bfade76f3a29f5aa28b20aa3..590c678864c7abf95e2bc4572c6b6f3cb74f5a31 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/Sample.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/Sample.java @@ -1137,7 +1137,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID String propertyValue = getProperty(propertyName); return propertyValue == null ? null : Arrays.stream(propertyValue.split(",")) .map(String::trim) - .map(ZonedDateTime::parse) + .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X"))) .toArray(ZonedDateTime[]::new); } diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/create/SampleCreation.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/create/SampleCreation.java index 3000bb1ce985c4f3f630eeb0cf707be2574ca9d3..6710ffe9a35d28b803b913b9ce63fe9cf0e4d218 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/create/SampleCreation.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/create/SampleCreation.java @@ -440,7 +440,7 @@ public class SampleCreation implements ICreation, ICreationIdHolder, IProperties String propertyValue = getProperty(propertyName); return propertyValue == null ? null : Arrays.stream(propertyValue.split(",")) .map(String::trim) - .map(ZonedDateTime::parse) + .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X"))) .toArray(ZonedDateTime[]::new); } diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/update/SampleUpdate.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/update/SampleUpdate.java index 5b4203cef3d5c95940dc5df8d98881e3586ae05d..cdb005fe94b25b50489acc207eec6916b894546e 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/update/SampleUpdate.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/update/SampleUpdate.java @@ -508,7 +508,7 @@ public class SampleUpdate implements IUpdate, IPropertiesHolder, IObjectUpdate<I String propertyValue = getProperty(propertyName); return propertyValue == null ? null : Arrays.stream(propertyValue.split(",")) .map(String::trim) - .map(ZonedDateTime::parse) + .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X"))) .toArray(ZonedDateTime[]::new); } diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/AbstractGenerator.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/AbstractGenerator.java index ee783ed39f6b687e32c7e12b02b52bdf70ec4b59..ba44d76975a94a6204575a84f7297fca82c6e60b 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/AbstractGenerator.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/AbstractGenerator.java @@ -326,7 +326,7 @@ public class AbstractGenerator + " String propertyValue = getProperty(propertyName);\n" + " return propertyValue == null ? null : Arrays.stream(propertyValue.split(\",\"))\n" + " .map(String::trim)\n" - + " .map(ZonedDateTime::parse)\n" + + " .map(dateTime -> ZonedDateTime.parse(dateTime, DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss X\")))\n" + " .toArray(ZonedDateTime[]::new);\n" + " }"); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateDataSetTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateDataSetTest.java index 4ee18d3434f143a53e7a8c69b6718e1206d7f6d0..6af8e3b63c71d960b98adc26aa235cab86ddde84 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateDataSetTest.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateDataSetTest.java @@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.systemtest.asapi.v3; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; +import java.time.ZonedDateTime; import java.util.Arrays; import java.util.Collections; import java.util.Date; @@ -2102,6 +2103,143 @@ public class CreateDataSetTest extends AbstractDataSetTest assertEquals(dataSet.getProperties().size(), 2); } + @Test + public void testCreateWithPropertyOfTypeJson() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.JSON); + EntityTypePermId dataSetType = createADataSetType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + DataSetCreation creation = physicalDataSetCreation(); + creation.setTypeId(dataSetType); + creation.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + creation.setJsonProperty(propertyType.getPermId(), "{\"key\": \"value\", \"array\":[1,2,3]}"); + + // When + List<DataSetPermId> dataSetIds = v3api.createDataSets(sessionToken, Arrays.asList(creation)); + + // Then + assertEquals(dataSetIds.size(), 1); + DataSetFetchOptions fetchOptions = new DataSetFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + DataSet dataSet = v3api.getDataSets(sessionToken, dataSetIds, fetchOptions).get(dataSetIds.get(0)); + assertEquals(dataSet.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(dataSet.getJsonProperty(propertyType.getPermId()), "{\"key\": \"value\", \"array\": [1, 2, 3]}"); + assertEquals(dataSet.getProperties().size(), 2); + } + + @Test + public void testCreateWithPropertyOfTypeArrayInteger() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.ARRAY_INTEGER); + EntityTypePermId dataSetType = createADataSetType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + DataSetCreation creation = physicalDataSetCreation(); + creation.setTypeId(dataSetType); + creation.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + creation.setIntegerArrayProperty(propertyType.getPermId(), new Long[]{1L, 2L, 3L}); + + // When + List<DataSetPermId> dataSetIds = v3api.createDataSets(sessionToken, Arrays.asList(creation)); + + // Then + assertEquals(dataSetIds.size(), 1); + DataSetFetchOptions fetchOptions = new DataSetFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + DataSet dataSet = v3api.getDataSets(sessionToken, dataSetIds, fetchOptions).get(dataSetIds.get(0)); + assertEquals(dataSet.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(dataSet.getIntegerArrayProperty(propertyType.getPermId()), new Long[]{1L, 2L, 3L}); + assertEquals(dataSet.getProperties().size(), 2); + } + + @Test + public void testCreateWithPropertyOfTypeArrayReal() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.ARRAY_REAL); + EntityTypePermId dataSetType = createADataSetType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + DataSetCreation creation = physicalDataSetCreation(); + creation.setTypeId(dataSetType); + creation.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + creation.setRealArrayProperty(propertyType.getPermId(), new Double[]{1.0, 2.0, 3.0}); + + // When + List<DataSetPermId> dataSetIds = v3api.createDataSets(sessionToken, Arrays.asList(creation)); + + // Then + assertEquals(dataSetIds.size(), 1); + DataSetFetchOptions fetchOptions = new DataSetFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + DataSet dataSet = v3api.getDataSets(sessionToken, dataSetIds, fetchOptions).get(dataSetIds.get(0)); + assertEquals(dataSet.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(dataSet.getRealArrayProperty(propertyType.getPermId()), new Double[]{1.0, 2.0, 3.0}); + assertEquals(dataSet.getProperties().size(), 2); + } + + @Test + public void testCreateWithPropertyOfTypeArrayString() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.ARRAY_STRING); + EntityTypePermId dataSetType = createADataSetType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + DataSetCreation creation = physicalDataSetCreation(); + creation.setTypeId(dataSetType); + creation.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + creation.setStringArrayProperty(propertyType.getPermId(), new String[]{"a", "b", "c"}); + + // When + List<DataSetPermId> dataSetIds = v3api.createDataSets(sessionToken, Arrays.asList(creation)); + + // Then + assertEquals(dataSetIds.size(), 1); + DataSetFetchOptions fetchOptions = new DataSetFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + DataSet dataSet = v3api.getDataSets(sessionToken, dataSetIds, fetchOptions).get(dataSetIds.get(0)); + assertEquals(dataSet.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(dataSet.getStringArrayProperty(propertyType.getPermId()), new String[]{"a", "b", "c"}); + assertEquals(dataSet.getProperties().size(), 2); + } + + @Test + public void testCreateWithPropertyOfTypeArrayTimestamp() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.ARRAY_TIMESTAMP); + EntityTypePermId dataSetType = createADataSetType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + DataSetCreation creation = physicalDataSetCreation(); + creation.setTypeId(dataSetType); + creation.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + ZonedDateTime time1 = ZonedDateTime.parse("2023-05-16T11:22:33+02"); + ZonedDateTime time2 = ZonedDateTime.parse("2023-05-18T11:17:03+02"); + creation.setTimestampArrayProperty(propertyType.getPermId(), new ZonedDateTime[]{time1, time2}); + + // When + List<DataSetPermId> dataSetIds = v3api.createDataSets(sessionToken, Arrays.asList(creation)); + + // Then + assertEquals(dataSetIds.size(), 1); + DataSetFetchOptions fetchOptions = new DataSetFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + DataSet dataSet = v3api.getDataSets(sessionToken, dataSetIds, fetchOptions).get(dataSetIds.get(0)); + assertEquals(dataSet.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(dataSet.getTimestampArrayProperty(propertyType.getPermId()), new ZonedDateTime[]{time1, time2}); + assertEquals(dataSet.getProperties().size(), 2); + } + private DataSetCreation containerDataSetCreation() { String code = UUID.randomUUID().toString(); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateExperimentTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateExperimentTest.java index 52e6f3f36e6471c5a5b22c901aaf4f2994300813..f4441dbd80690239743e8ec753bfdfeb8fee5f17 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateExperimentTest.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateExperimentTest.java @@ -19,6 +19,7 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -860,4 +861,151 @@ public class CreateExperimentTest extends AbstractExperimentTest assertEquals(experiment2.getProperties().size(), 2); } + @Test + public void testCreateWithPropertyOfTypeJson() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.JSON); + EntityTypePermId experimentType = createAnExperimentType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + ExperimentCreation creation = new ExperimentCreation(); + creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY"); + creation.setTypeId(experimentType); + creation.setProjectId(new ProjectIdentifier("/CISD/NEMO")); + creation.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + creation.setJsonProperty(propertyType.getPermId(), "{\"key\": \"value\", \"array\":[1,2,3]}"); + + // When + List<ExperimentPermId> experimentIds = v3api.createExperiments(sessionToken, Arrays.asList(creation)); + + // Then + assertEquals(experimentIds.size(), 1); + ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + Experiment experiment2 = v3api.getExperiments(sessionToken, experimentIds, fetchOptions).get(experimentIds.get(0)); + assertEquals(experiment2.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(experiment2.getJsonProperty(propertyType.getPermId()), "{\"key\": \"value\", \"array\": [1, 2, 3]}"); + assertEquals(experiment2.getProperties().size(), 2); + } + + @Test + public void testCreateWithPropertyOfTypeArrayInteger() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.ARRAY_INTEGER); + EntityTypePermId experimentType = createAnExperimentType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + ExperimentCreation creation = new ExperimentCreation(); + creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY"); + creation.setTypeId(experimentType); + creation.setProjectId(new ProjectIdentifier("/CISD/NEMO")); + creation.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + creation.setIntegerArrayProperty(propertyType.getPermId(), new Long[]{1L, 2L, 3L}); + + // When + List<ExperimentPermId> experimentIds = v3api.createExperiments(sessionToken, Arrays.asList(creation)); + + // Then + assertEquals(experimentIds.size(), 1); + ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + Experiment experiment2 = v3api.getExperiments(sessionToken, experimentIds, fetchOptions).get(experimentIds.get(0)); + assertEquals(experiment2.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(experiment2.getIntegerArrayProperty(propertyType.getPermId()), new Long[]{1L, 2L, 3L}); + assertEquals(experiment2.getProperties().size(), 2); + } + + @Test + public void testCreateWithPropertyOfTypeArrayReal() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.ARRAY_REAL); + EntityTypePermId experimentType = createAnExperimentType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + ExperimentCreation creation = new ExperimentCreation(); + creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY"); + creation.setTypeId(experimentType); + creation.setProjectId(new ProjectIdentifier("/CISD/NEMO")); + creation.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + creation.setRealArrayProperty(propertyType.getPermId(), new Double[]{1.0, 2.0, 3.0}); + + // When + List<ExperimentPermId> experimentIds = v3api.createExperiments(sessionToken, Arrays.asList(creation)); + + // Then + assertEquals(experimentIds.size(), 1); + ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + Experiment experiment2 = v3api.getExperiments(sessionToken, experimentIds, fetchOptions).get(experimentIds.get(0)); + assertEquals(experiment2.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(experiment2.getRealArrayProperty(propertyType.getPermId()), new Double[]{1.0, 2.0, 3.0}); + assertEquals(experiment2.getProperties().size(), 2); + } + + @Test + public void testCreateWithPropertyOfTypeArrayString() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.ARRAY_STRING); + EntityTypePermId experimentType = createAnExperimentType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + ExperimentCreation creation = new ExperimentCreation(); + creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY"); + creation.setTypeId(experimentType); + creation.setProjectId(new ProjectIdentifier("/CISD/NEMO")); + creation.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + creation.setStringArrayProperty(propertyType.getPermId(), new String[]{"a", "b", "c"}); + + // When + List<ExperimentPermId> experimentIds = v3api.createExperiments(sessionToken, Arrays.asList(creation)); + + // Then + assertEquals(experimentIds.size(), 1); + ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + Experiment experiment2 = v3api.getExperiments(sessionToken, experimentIds, fetchOptions).get(experimentIds.get(0)); + assertEquals(experiment2.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(experiment2.getStringArrayProperty(propertyType.getPermId()), new String[]{"a", "b", "c"}); + assertEquals(experiment2.getProperties().size(), 2); + } + + @Test + public void testCreateWithPropertyOfTypeArrayTimestamp() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.ARRAY_TIMESTAMP); + EntityTypePermId experimentType = createAnExperimentType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + ExperimentCreation creation = new ExperimentCreation(); + creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY"); + creation.setTypeId(experimentType); + creation.setProjectId(new ProjectIdentifier("/CISD/NEMO")); + creation.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + ZonedDateTime time1 = ZonedDateTime.parse("2023-05-16T11:22:33+02"); + ZonedDateTime time2 = ZonedDateTime.parse("2023-05-18T11:17:03+02"); + creation.setTimestampArrayProperty(propertyType.getPermId(), new ZonedDateTime[]{time1, time2}); + + // When + List<ExperimentPermId> experimentIds = v3api.createExperiments(sessionToken, Arrays.asList(creation)); + + // Then + assertEquals(experimentIds.size(), 1); + ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + Experiment experiment2 = v3api.getExperiments(sessionToken, experimentIds, fetchOptions).get(experimentIds.get(0)); + assertEquals(experiment2.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(experiment2.getTimestampArrayProperty(propertyType.getPermId()), new ZonedDateTime[]{time1, time2}); + assertEquals(experiment2.getProperties().size(), 2); + } + } diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java index 0f2da44c41c0d21f5e3aa3cecc285402a55be20f..bd9981986ce5c2bb9f871dfe9d6ebd9903379798 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java @@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.systemtest.asapi.v3; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -1535,6 +1536,153 @@ public class CreateSampleTest extends AbstractSampleTest assertEquals(sample2.getProperties().size(), 2); } + @Test + public void testCreateWithPropertyOfTypeJson() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.JSON); + EntityTypePermId sampleType = createASampleType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + SampleCreation sample = new SampleCreation(); + sample.setCode("SAMPLE_WITH_SAMPLE_PROPERTY"); + sample.setTypeId(sampleType); + sample.setSpaceId(new SpacePermId("CISD")); + sample.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + sample.setJsonProperty(propertyType.getPermId(), "{\"key\": \"value\", \"array\":[1,2,3]}"); + + // When + List<SamplePermId> sampleIds = v3api.createSamples(sessionToken, Arrays.asList(sample)); + + // Then + assertEquals(sampleIds.size(), 1); + SampleFetchOptions fetchOptions = new SampleFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + Sample sample2 = v3api.getSamples(sessionToken, sampleIds, fetchOptions).get(sampleIds.get(0)); + assertEquals(sample2.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(sample2.getJsonProperty(propertyType.getPermId()), "{\"key\": \"value\", \"array\": [1, 2, 3]}"); + assertEquals(sample2.getProperties().size(), 2); + } + + @Test + public void testCreateWithPropertyOfTypeArrayInteger() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.ARRAY_INTEGER); + EntityTypePermId sampleType = createASampleType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + SampleCreation sample = new SampleCreation(); + sample.setCode("SAMPLE_WITH_SAMPLE_PROPERTY"); + sample.setTypeId(sampleType); + sample.setSpaceId(new SpacePermId("CISD")); + sample.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + sample.setIntegerArrayProperty(propertyType.getPermId(), new Long[]{1L, 2L, 3L}); + + // When + List<SamplePermId> sampleIds = v3api.createSamples(sessionToken, Arrays.asList(sample)); + + // Then + assertEquals(sampleIds.size(), 1); + SampleFetchOptions fetchOptions = new SampleFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + Sample sample2 = v3api.getSamples(sessionToken, sampleIds, fetchOptions).get(sampleIds.get(0)); + assertEquals(sample2.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(sample2.getIntegerArrayProperty(propertyType.getPermId()), new Long[]{1L, 2L, 3L}); + assertEquals(sample2.getProperties().size(), 2); + } + + @Test + public void testCreateWithPropertyOfTypeArrayReal() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.ARRAY_REAL); + EntityTypePermId sampleType = createASampleType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + SampleCreation sample = new SampleCreation(); + sample.setCode("SAMPLE_WITH_SAMPLE_PROPERTY"); + sample.setTypeId(sampleType); + sample.setSpaceId(new SpacePermId("CISD")); + sample.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + sample.setRealArrayProperty(propertyType.getPermId(), new Double[]{1.0, 2.0, 3.0}); + + // When + List<SamplePermId> sampleIds = v3api.createSamples(sessionToken, Arrays.asList(sample)); + + // Then + assertEquals(sampleIds.size(), 1); + SampleFetchOptions fetchOptions = new SampleFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + Sample sample2 = v3api.getSamples(sessionToken, sampleIds, fetchOptions).get(sampleIds.get(0)); + assertEquals(sample2.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(sample2.getRealArrayProperty(propertyType.getPermId()), new Double[]{1.0, 2.0, 3.0}); + assertEquals(sample2.getProperties().size(), 2); + } + + @Test + public void testCreateWithPropertyOfTypeArrayString() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.ARRAY_STRING); + EntityTypePermId sampleType = createASampleType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + SampleCreation sample = new SampleCreation(); + sample.setCode("SAMPLE_WITH_SAMPLE_PROPERTY"); + sample.setTypeId(sampleType); + sample.setSpaceId(new SpacePermId("CISD")); + sample.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + sample.setStringArrayProperty(propertyType.getPermId(), new String[]{"a", "b", "c"}); + + // When + List<SamplePermId> sampleIds = v3api.createSamples(sessionToken, Arrays.asList(sample)); + + // Then + assertEquals(sampleIds.size(), 1); + SampleFetchOptions fetchOptions = new SampleFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + Sample sample2 = v3api.getSamples(sessionToken, sampleIds, fetchOptions).get(sampleIds.get(0)); + assertEquals(sample2.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(sample2.getStringArrayProperty(propertyType.getPermId()), new String[]{"a", "b", "c"}); + assertEquals(sample2.getProperties().size(), 2); + } + + @Test + public void testCreateWithPropertyOfTypeArrayTimestamp() + { + // Given + String sessionToken = v3api.login(TEST_USER, PASSWORD); + PropertyTypePermId propertyType = createAPropertyType(sessionToken, DataType.ARRAY_TIMESTAMP); + EntityTypePermId sampleType = createASampleType(sessionToken, true, propertyType, PLATE_GEOMETRY); + + SampleCreation sample = new SampleCreation(); + sample.setCode("SAMPLE_WITH_SAMPLE_PROPERTY"); + sample.setTypeId(sampleType); + sample.setSpaceId(new SpacePermId("CISD")); + sample.setProperty(PLATE_GEOMETRY.getPermId(), "384_WELLS_16X24"); + ZonedDateTime time1 = ZonedDateTime.parse("2023-05-16T11:22:33+02"); + ZonedDateTime time2 = ZonedDateTime.parse("2023-05-18T11:17:03+02"); + sample.setTimestampArrayProperty(propertyType.getPermId(), new ZonedDateTime[]{time1, time2}); + + // When + List<SamplePermId> sampleIds = v3api.createSamples(sessionToken, Arrays.asList(sample)); + + // Then + assertEquals(sampleIds.size(), 1); + SampleFetchOptions fetchOptions = new SampleFetchOptions(); + fetchOptions.withProperties(); + fetchOptions.withSampleProperties(); + Sample sample2 = v3api.getSamples(sessionToken, sampleIds, fetchOptions).get(sampleIds.get(0)); + assertEquals(sample2.getProperties().get(PLATE_GEOMETRY.getPermId()), "384_WELLS_16X24"); + assertEquals(sample2.getTimestampArrayProperty(propertyType.getPermId()), new ZonedDateTime[]{time1, time2}); + assertEquals(sample2.getProperties().size(), 2); + } + @Test public void testCreateWithMultipleSamples() {