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 c46c4ba9a46476f373e4e32a94d0a6589577b41a..1e3fc1ba614dfa7935c9723ee6d8b5e3f1508758 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 @@ -191,6 +191,9 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE @JsonProperty private Date accessDate; + @JsonProperty + private Map<String, String> metaData; + // Method automatically generated with DtoGenerator @JsonIgnore public DataSetFetchOptions getFetchOptions() @@ -1164,6 +1167,17 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE setProperty(propertyName, propertyValue); } + @JsonIgnore + public Map<String, String> getMetaData() + { + return metaData; + } + + public void setMetaData(Map<String, String> metaData) + { + this.metaData = metaData; + } + // Method automatically generated with DtoGenerator @Override public String toString() diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSetType.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSetType.java index 7e0442b7e04b9b8b9b9e4c443f82b1f6ead98c95..1f12bbb646a39bc04d2a6a74ac46862bce6f8a56 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSetType.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSetType.java @@ -32,6 +32,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.io.Serializable; import java.util.Date; import java.util.List; +import java.util.Map; /* * Class automatically generated with DtoGenerator @@ -71,6 +72,9 @@ public class DataSetType implements Serializable, ICodeHolder, IDescriptionHolde @JsonProperty private Plugin validationPlugin; + @JsonProperty + private Map<String, String> metaData; + // Method automatically generated with DtoGenerator @JsonIgnore public DataSetTypeFetchOptions getFetchOptions() @@ -218,6 +222,17 @@ public class DataSetType implements Serializable, ICodeHolder, IDescriptionHolde this.validationPlugin = validationPlugin; } + @JsonIgnore + public Map<String, String> getMetaData() + { + return metaData; + } + + public void setMetaData(Map<String, String> metaData) + { + this.metaData = metaData; + } + // Method automatically generated with DtoGenerator @Override public String toString() 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 50c9fcddd0745dc23113117243cb84570411f63f..99894d689de90064e27897b2d21924f1a83d5a12 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 @@ -81,6 +81,8 @@ public class DataSetCreation implements ICreation, ICreationIdHolder, IObjectCre private boolean autoGeneratedCode; + private Map<String, String> metaData; + public IEntityTypeId getTypeId() { return typeId; @@ -241,6 +243,16 @@ public class DataSetCreation implements ICreation, ICreationIdHolder, IObjectCre this.childIds = childIds; } + public Map<String, String> getMetaData() + { + return metaData; + } + + public void setMetaData(Map<String, String> metaData) + { + this.metaData = metaData; + } + @Override public void setProperty(String propertyName, String propertyValue) { diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetTypeCreation.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetTypeCreation.java index a954271daf87887a05760652f85b9bff1b1cf47a..3b53a7650785b6ea114a8ada6435898c6b28c3cd 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetTypeCreation.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetTypeCreation.java @@ -16,6 +16,7 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create; import java.util.List; +import java.util.Map; import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.ObjectToString; import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.create.IEntityTypeCreation; @@ -46,6 +47,8 @@ public class DataSetTypeCreation implements IEntityTypeCreation private List<PropertyAssignmentCreation> propertyAssignments; + private Map<String, String> metaData; + @Override public String getCode() { @@ -124,6 +127,17 @@ public class DataSetTypeCreation implements IEntityTypeCreation this.propertyAssignments = propertyAssignments; } + public Map<String, String> getMetaData() + { + return metaData; + } + + public void setMetaData(Map<String, String> metaData) + { + this.metaData = metaData; + } + + @Override public String toString() { diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetTypeUpdate.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetTypeUpdate.java index 37a6901b2c1e6d7047e0cdf963d9f1b89b4c1261..0f616c8c65e0a5e5386ebc1955bd426e911a585d 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetTypeUpdate.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetTypeUpdate.java @@ -17,6 +17,7 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.update; import java.util.List; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateMapValues; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; @@ -58,6 +59,9 @@ public class DataSetTypeUpdate implements IEntityTypeUpdate @JsonProperty private PropertyAssignmentListUpdateValue propertyAssignments = new PropertyAssignmentListUpdateValue(); + @JsonProperty + private ListUpdateMapValues metaData = new ListUpdateMapValues(); + @Override @JsonIgnore public IEntityTypeId getObjectId() @@ -157,6 +161,18 @@ public class DataSetTypeUpdate implements IEntityTypeUpdate propertyAssignments.setActions(actions); } + @JsonIgnore + public ListUpdateMapValues getMetaData() + { + return metaData; + } + + @JsonIgnore + public void setMetaDataActions(List<ListUpdateAction<Object>> actions) + { + metaData.setActions(actions); + } + @Override public String toString() { 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 9671f970b68b1d86ae900998c86e5a108e0224af..6a9fa9351c7bab3b0a6acaf97674059b5463a6c4 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 @@ -19,16 +19,13 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.*; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.*; import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.ObjectToString; import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IObjectUpdate; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IdListUpdateValue; import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue.ListUpdateAction; import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.IDataSetId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.IExperimentId; @@ -92,6 +89,9 @@ public class DataSetUpdate implements IUpdate, IObjectUpdate<IDataSetId>, IPrope @JsonProperty private IdListUpdateValue<IDataSetId> childIds = new IdListUpdateValue<IDataSetId>(); + @JsonProperty + private ListUpdateMapValues metaData = new ListUpdateMapValues(); + @Override @JsonIgnore public IDataSetId getObjectId() @@ -501,6 +501,18 @@ public class DataSetUpdate implements IUpdate, IObjectUpdate<IDataSetId>, IPrope setProperty(propertyName, propertyValue); } + @JsonIgnore + public ListUpdateMapValues getMetaData() + { + return metaData; + } + + @JsonIgnore + public void setMetaDataActions(List<ListUpdateAction<Object>> actions) + { + metaData.setActions(actions); + } + @Override public String toString() { diff --git a/api-openbis-javascript/src/v3/as/dto/dataset/DataSet.js b/api-openbis-javascript/src/v3/as/dto/dataset/DataSet.js index 532f7d576d97f04dec4356824d10bca0db0c6813..9c02e60514ad019a42a2370c313c47d830118687 100644 --- a/api-openbis-javascript/src/v3/as/dto/dataset/DataSet.js +++ b/api-openbis-javascript/src/v3/as/dto/dataset/DataSet.js @@ -50,6 +50,7 @@ define([ "stjs", "util/Exceptions" ], function(stjs, exceptions) { prototype.sampleProperties = null; prototype.dataProducer = null; prototype.dataProductionDate = null; + prototype.metaData = null; prototype.getFetchOptions = function() { return this.fetchOptions; @@ -527,6 +528,12 @@ define([ "stjs", "util/Exceptions" ], function(stjs, exceptions) { prototype.setDataProductionDate = function(dataProductionDate) { this.dataProductionDate = dataProductionDate; }; + prototype.getMetaData = function() { + return this.metaData; + }; + prototype.setMetaData = function(metaData) { + this.metaData = metaData; + }; }, { fetchOptions : "DataSetFetchOptions", permId : "DataSetPermId", @@ -614,7 +621,11 @@ define([ "stjs", "util/Exceptions" ], function(stjs, exceptions) { name : "Map", arguments : [ "String", "Sample" ] }, - dataProductionDate : "Date" + dataProductionDate : "Date", + metaData: { + name: "Map", + arguments: ["String", "String"] + } }); return DataSet; }) \ No newline at end of file diff --git a/api-openbis-javascript/src/v3/as/dto/dataset/DataSetType.js b/api-openbis-javascript/src/v3/as/dto/dataset/DataSetType.js index 64d64cf4c25525ce062b191a336dad9f7788b067..88a4176a16d9b405739a33dabeb20a6f8aa3f9af 100644 --- a/api-openbis-javascript/src/v3/as/dto/dataset/DataSetType.js +++ b/api-openbis-javascript/src/v3/as/dto/dataset/DataSetType.js @@ -21,6 +21,8 @@ define(['stjs'], function (stjs) { prototype.modificationDate = null prototype.propertyAssignments = null prototype.validationPlugin = null + prototype.metaData = null; + prototype.getPropertyAssignments = function () { if ( this.getFetchOptions() && @@ -99,6 +101,12 @@ define(['stjs'], function (stjs) { prototype.setModificationDate = function (modificationDate) { this.modificationDate = modificationDate } + prototype.getMetaData = function() { + return this.metaData; + } + prototype.setMetaData = function(metaData) { + this.metaData = metaData; + }; prototype.toString = function () { return this.getCode() } @@ -111,7 +119,11 @@ define(['stjs'], function (stjs) { name: 'List', arguments: ['PropertyAssignment'] }, - validationPlugin: 'Plugin' + validationPlugin: 'Plugin', + metaData: { + name: "Map", + arguments: ["String", "String"] + } } ) return DataSetType diff --git a/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetCreation.js b/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetCreation.js index 032716b1d8cc3e3333280b0e651d005935ed0878..d3cc1b251a084057dedc761a0a7caa3d73039393 100644 --- a/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetCreation.js +++ b/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetCreation.js @@ -23,6 +23,7 @@ define([ "stjs" ], function(stjs) { prototype.childIds = null; prototype.creationId = null; prototype.autoGeneratedCode = null; + prototype.metaData = null; prototype.getTypeId = function() { return this.typeId; @@ -228,6 +229,12 @@ define([ "stjs" ], function(stjs) { prototype.setAutoGeneratedCode = function(autoGeneratedCode) { this.autoGeneratedCode = autoGeneratedCode; }; + prototype.getMetaData = function() { + return this.metaData; + }; + prototype.setMetaData = function(metaData) { + this.metaData = metaData; + }; }, { typeId : "IEntityTypeId", dataSetKind : "DataSetKind", @@ -260,7 +267,11 @@ define([ "stjs" ], function(stjs) { name : "List", arguments : [ "Object" ] }, - creationId : "CreationId" + creationId : "CreationId", + metaData: { + name: "Map", + arguments: ["String", "String"] + } }); return DataSetCreation; }) \ No newline at end of file diff --git a/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetTypeCreation.js b/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetTypeCreation.js index 63cedbf59ed1e4802d70e088590d65c3b697328f..52379e316ebbf26d3cd28c20735854477540806e 100644 --- a/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetTypeCreation.js +++ b/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetTypeCreation.js @@ -14,6 +14,7 @@ define([ "stjs" ], function(stjs) { prototype.disallowDeletion = false; prototype.validationPluginId = null; prototype.propertyAssignments = null; + prototype.metaData = null; prototype.getCode = function() { return this.code; @@ -57,13 +58,23 @@ define([ "stjs" ], function(stjs) { prototype.setPropertyAssignments = function(propertyAssignments) { this.propertyAssignments = propertyAssignments; }; + prototype.getMetaData = function() { + return this.metaData; + }; + prototype.setMetaData = function(metaData) { + this.metaData = metaData; + }; }, { validationPluginId : "IPluginId", propertyAssignments : { name : "List", arguments : [ "PropertyAssignmentCreation" ] - } + }, + metaData: { + name: "Map", + arguments: ["String", "String"] + } }); return DataSetTypeCreation; }) \ No newline at end of file diff --git a/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetTypeUpdate.js b/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetTypeUpdate.js index c29a77474ce3b7cd43423eaa3d17164c325bd7ce..c55a95eb1c168b744082b621b5e215dbd535102c 100644 --- a/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetTypeUpdate.js +++ b/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetTypeUpdate.js @@ -1,5 +1,6 @@ -define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/entitytype/update/PropertyAssignmentListUpdateValue" ], function(stjs, FieldUpdateValue, - PropertyAssignmentListUpdateValue) { +define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/entitytype/update/PropertyAssignmentListUpdateValue", + "as/dto/common/update/ListUpdateMapValues"], function(stjs, FieldUpdateValue, + PropertyAssignmentListUpdateValue, ListUpdateMapValues) { var DataSetTypeUpdate = function() { this.description = new FieldUpdateValue(); this.mainDataSetPattern = new FieldUpdateValue(); @@ -7,6 +8,7 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/entitytype/upd this.disallowDeletion = new FieldUpdateValue(); this.validationPluginId = new FieldUpdateValue(); this.propertyAssignments = new PropertyAssignmentListUpdateValue(); + this.metaData = new ListUpdateMapValues(); }; stjs.extend(DataSetTypeUpdate, null, [], function(constructor, prototype) { prototype['@type'] = 'as.dto.dataset.update.DataSetTypeUpdate'; @@ -18,6 +20,7 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/entitytype/upd prototype.disallowDeletion = null; prototype.validationPluginId = null; prototype.propertyAssignments = null; + prototype.metaData = null; prototype.getObjectId = function() { return this.getTypeId(); @@ -64,6 +67,12 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/entitytype/upd prototype.setPropertyAssignmentActions = function(actions) { this.propertyAssignments.setActions(actions); }; + prototype.getMetaData = function() { + return this.metaData; + }; + prototype.setMetaDataActions = function(actions) { + this.metaData.setActions(actions); + }; }, { typeId : "IEntityTypeId", description : { @@ -86,7 +95,8 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/entitytype/upd name : "FieldUpdateValue", arguments : [ "IPluginId" ] }, - propertyAssignments : "PropertyAssignmentListUpdateValue" + propertyAssignments : "PropertyAssignmentListUpdateValue", + metaData : "ListUpdateMapValues" }); return DataSetTypeUpdate; }) \ No newline at end of file diff --git a/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetUpdate.js b/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetUpdate.js index bfd89ec147ee7e890e5f478197445f5c6406e5c5..407cb565d4f9ab9679d2e91c68d0db952680a36a 100644 --- a/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetUpdate.js +++ b/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetUpdate.js @@ -1,7 +1,9 @@ /** * @author pkupczyk */ -define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/common/update/IdListUpdateValue" ], function(stjs, FieldUpdateValue, IdListUpdateValue) { +define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/common/update/IdListUpdateValue", + "as/dto/common/update/ListUpdateMapValues"], + function(stjs, FieldUpdateValue, IdListUpdateValue, ListUpdateMapValues) { var DataSetUpdate = function() { this.experimentId = new FieldUpdateValue(); this.sampleId = new FieldUpdateValue(); @@ -13,6 +15,7 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/common/update/ this.componentIds = new IdListUpdateValue(); this.parentIds = new IdListUpdateValue(); this.childIds = new IdListUpdateValue(); + this.metaData = new ListUpdateMapValues(); }; stjs.extend(DataSetUpdate, null, [], function(constructor, prototype) { prototype['@type'] = 'as.dto.dataset.update.DataSetUpdate'; @@ -33,6 +36,7 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/common/update/ prototype.componentIds = null; prototype.parentIds = null; prototype.childIds = null; + prototype.metaData = null; prototype.getObjectId = function() { return this.getDataSetId(); @@ -233,6 +237,12 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/common/update/ prototype.setChildActions = function(actions) { this.childIds.setActions(actions); }; + prototype.getMetaData = function() { + return this.metaData; + }; + prototype.setMetaDataActions = function(actions) { + this.metaData.setActions(actions); + }; }, { dataSetId : "IDataSetId", experimentId : { @@ -274,7 +284,8 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/common/update/ childIds : { name : "IdListUpdateValue", arguments : [ "IDataSetId" ] - } + }, + metaData : "ListUpdateMapValues" }); return DataSetUpdate; }) \ No newline at end of file diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetExecutor.java index 393143ced889d4cb7933f54b2ad06845f2864168..6c787bc13d2b6a6555918076d51a2dbb9a37a539 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetExecutor.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetExecutor.java @@ -152,6 +152,7 @@ public class CreateDataSetExecutor extends AbstractCreateEntityExecutor<DataSetC dataSet.setDerived(false == creation.isMeasured()); dataSet.setDataProducerCode(creation.getDataProducer()); dataSet.setProductionDate(creation.getDataProductionDate()); + dataSet.setMetaData(creation.getMetaData()); PersonPE person = context.getSession().tryGetPerson(); dataSet.setRegistrator(person); diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetTypesExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetTypesExecutor.java index c4ed4ce65ddacc7757ddfcecfa50395b0ff5d718..2d163fca390f88267e1aa33f5e7f0ba02a0508d1 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetTypesExecutor.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetTypesExecutor.java @@ -76,6 +76,7 @@ public class CreateDataSetTypesExecutor extends AbstractCreateEntityTypeExecutor type.setMainDataSetPattern(creation.getMainDataSetPattern()); type.setMainDataSetPath(creation.getMainDataSetPath()); type.setDeletionDisallow(creation.isDisallowDeletion()); + type.setMetaData(creation.getMetaData()); } @Override diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetExecutor.java index da5f2a314746e99c02d8eba0c658606b277ab0f2..85f3fce4bb7774c11617c9657918c3de086c21aa 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetExecutor.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetExecutor.java @@ -15,13 +15,11 @@ */ package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.dataset; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; +import java.util.concurrent.atomic.AtomicBoolean; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Component; @@ -125,6 +123,7 @@ public class UpdateDataSetExecutor extends AbstractUpdateEntityExecutor<DataSetU updateDataSetSampleExecutor.update(context, batch); updateDataSetPropertyExecutor.update(context, batch); updateTags(context, batch); + updateMetaData(context, batch); PersonPE person = context.getSession().tryGetPerson(); Date timeStamp = daoFactory.getTransactionTimestamp(); @@ -201,6 +200,69 @@ public class UpdateDataSetExecutor extends AbstractUpdateEntityExecutor<DataSetU }; } + private void updateMetaData(final IOperationContext context, final MapBatch<DataSetUpdate, DataPE> batch) + { + new MapBatchProcessor<DataSetUpdate, DataPE>(context, batch) + { + @Override + public void process(DataSetUpdate update, DataPE entity) + { + Map<String, String> metaData = new HashMap<>(); + if(entity.getMetaData() != null) { + metaData.putAll(entity.getMetaData()); + } + ListUpdateValue.ListUpdateActionSet<?> lastSetAction = null; + AtomicBoolean metaDataChanged = new AtomicBoolean(false); + for (ListUpdateValue.ListUpdateAction<Object> action : update.getMetaData().getActions()) + { + if (action instanceof ListUpdateValue.ListUpdateActionAdd<?>) + { + addTo(metaData, action, metaDataChanged); + } else if (action instanceof ListUpdateValue.ListUpdateActionRemove<?>) + { + for (String key : (Collection<String>) action.getItems()) + { + metaDataChanged.set(true); + metaData.remove(key); + } + } else if (action instanceof ListUpdateValue.ListUpdateActionSet<?>) + { + lastSetAction = (ListUpdateValue.ListUpdateActionSet<?>) action; + } + } + if (lastSetAction != null) + { + metaData.clear(); + addTo(metaData, lastSetAction, metaDataChanged); + } + if (metaDataChanged.get()) + { + entity.setMetaData(metaData.isEmpty() ? null : metaData); + } + } + + @Override + public IProgress createProgress(DataSetUpdate key, DataPE value, int objectIndex, int totalObjectCount) + { + return new UpdateRelationProgress(key, value, "dataset-metadata", objectIndex, totalObjectCount); + } + + @SuppressWarnings("unchecked") + private void addTo(Map<String, String> metaData, ListUpdateValue.ListUpdateAction<?> lastSetAction, AtomicBoolean metaDataChanged) + { + Collection<Map<String, String>> maps = (Collection<Map<String, String>>) lastSetAction.getItems(); + for (Map<String, String> map : maps) + { + if (!map.isEmpty()) + { + metaDataChanged.set(true); + metaData.putAll(map); + } + } + } + }; + } + @Override protected void updateAll(IOperationContext context, MapBatch<DataSetUpdate, DataPE> batch) { diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetTypeExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetTypeExecutor.java index 32c7a891cf9371dafedfeb25080de038e5f495a9..1847ba7440a9970d08398e7a25c75ac4aac9f040 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetTypeExecutor.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetTypeExecutor.java @@ -15,6 +15,7 @@ */ package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.dataset; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -26,6 +27,11 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.IUpdateEntity import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + /** * @author Franz-Josef Elmer */ @@ -57,6 +63,7 @@ public class UpdateDataSetTypeExecutor type.setMainDataSetPattern(getNewValue(update.getMainDataSetPattern(), type.getMainDataSetPattern())); type.setMainDataSetPath(getNewValue(update.getMainDataSetPath(), type.getMainDataSetPath())); type.setDeletionDisallow(getNewValue(update.isDisallowDeletion(), type.isDeletionDisallow())); + updateMetaData(type, update); } @Override @@ -71,4 +78,53 @@ public class UpdateDataSetTypeExecutor authorizationExecutor.canUpdate(context); } + private void updateMetaData(DataSetTypePE type, DataSetTypeUpdate update) + { + Map<String, String> metaData = new HashMap<>(); + if(type.getMetaData() != null) { + metaData.putAll(type.getMetaData()); + } + ListUpdateValue.ListUpdateActionSet<?> lastSetAction = null; + AtomicBoolean metaDataChanged = new AtomicBoolean(false); + for (ListUpdateValue.ListUpdateAction<Object> action : update.getMetaData().getActions()) + { + if (action instanceof ListUpdateValue.ListUpdateActionAdd<?>) + { + addTo(metaData, action, metaDataChanged); + } else if (action instanceof ListUpdateValue.ListUpdateActionRemove<?>) + { + for (String key : (Collection<String>) action.getItems()) + { + metaDataChanged.set(true); + metaData.remove(key); + } + } else if (action instanceof ListUpdateValue.ListUpdateActionSet<?>) + { + lastSetAction = (ListUpdateValue.ListUpdateActionSet<?>) action; + } + } + if (lastSetAction != null) + { + metaData.clear(); + addTo(metaData, lastSetAction, metaDataChanged); + } + if (metaDataChanged.get()) + { + type.setMetaData(metaData.isEmpty() ? null : metaData); + } + } + + private void addTo(Map<String, String> metaData, ListUpdateValue.ListUpdateAction<?> lastSetAction, AtomicBoolean metaDataChanged) + { + Collection<Map<String, String>> maps = (Collection<Map<String, String>>) lastSetAction.getItems(); + for (Map<String, String> map : maps) + { + if (!map.isEmpty()) + { + metaDataChanged.set(true); + metaData.putAll(map); + } + } + } + } diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentExecutor.java index af3397f4c99e829072871d20d14ac2d0aaca4931..cbb46df8247974df8ba475c38234a048d8f6a42b 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentExecutor.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentExecutor.java @@ -199,7 +199,7 @@ public class UpdateExperimentExecutor extends AbstractUpdateEntityExecutor<Exper @Override public IProgress createProgress(ExperimentUpdate update, ExperimentPE entity, int objectIndex, int totalObjectCount) { - return new UpdateRelationProgress(update, entity, "experiment-tag", objectIndex, totalObjectCount); + return new UpdateRelationProgress(update, entity, "experiment-metadata", objectIndex, totalObjectCount); } @SuppressWarnings("unchecked") diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/Generator.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/Generator.java index ba929dd1517b4205c178545aa0df67a6ebfb59bf..0e3199685d15b4f4d8fecfe0368cbb97da32fb60 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/Generator.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/Generator.java @@ -391,6 +391,7 @@ public class Generator extends AbstractGenerator addExperiment(gen); addSample(gen); addProperties(gen); + addMetaData(gen); gen.addPluralFetchedField("List<DataSet>", List.class.getName(), "parents", "Parents", DataSetFetchOptions.class) .withInterfaceReflexive(IParentChildrenHolder.class); @@ -448,6 +449,7 @@ public class Generator extends AbstractGenerator gen.addStringField("mainDataSetPath"); gen.addBooleanField("disallowDeletion"); addModificationDate(gen); + addMetaData(gen); gen.setToStringMethod("\"DataSetType \" + code"); addPropertyAssignments(gen); diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetBaseRecord.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetBaseRecord.java index 1fe8d1ae2a5367e881213a1bf4bc82442a85a2b6..c6fd9caceaa904b1255d71ff57fbedfd705e7c91 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetBaseRecord.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetBaseRecord.java @@ -50,4 +50,6 @@ public class DataSetBaseRecord extends ObjectBaseRecord public boolean frozenForComponents; public boolean frozenForContainers; + + public String metaData; } diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java index c5075af93378afc6459535564b27e5c200788844..2a03c904b0139f183ef9490680bd2464555f9bec 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java @@ -43,7 +43,7 @@ public interface DataSetQuery extends ObjectQuery + "d.modification_timestamp as modificationDate, d.registration_timestamp as registrationDate, " + "d.data_set_kind as dataSetKind, d.frozen as frozen, d.frozen_for_children as frozenForChildren, " + "d.frozen_for_parents as frozenForParents, d.frozen_for_comps as frozenForComponents, " - + "d.frozen_for_conts as frozenForContainers " + + "d.frozen_for_conts as frozenForContainers, d.meta_data as metaData " + "from data d where d.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE) public List<DataSetBaseRecord> getDataSets(LongSet dataSetIds); @@ -93,7 +93,7 @@ public interface DataSetQuery extends ObjectQuery public List<ObjectRelationRecord> getTypeIds(LongSet dataSetIds); @Select(sql = "select dt.id, dt.code, dt.description, dt.main_ds_pattern as mainDataSetPattern, dt.main_ds_path as mainDataSetPath, " - + "dt.deletion_disallow as disallowDeletion, dt.modification_timestamp as modificationDate from data_set_types dt where dt.id = any(?{1})", parameterBindings = { + + "dt.deletion_disallow as disallowDeletion, dt.modification_timestamp as modificationDate, dt.meta_data as metaData from data_set_types dt where dt.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE) public List<DataSetTypeBaseRecord> getTypes(LongSet dataSetTypeIds); diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTranslator.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTranslator.java index 0b445c9863daa5ec1fe710b3b8b854123cf1ce53..e84509df81bf8e85d4634cf0a92d834e70050c74 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTranslator.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTranslator.java @@ -19,6 +19,7 @@ import java.util.Collection; import java.util.List; import java.util.Set; +import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.CommonUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -315,6 +316,7 @@ public class DataSetTranslator extends AbstractCachingTranslator<Long, DataSet, result.setFrozenForParents(baseRecord.frozenForParents); result.setFrozenForComponents(baseRecord.frozenForComponents); result.setFrozenForContainers(baseRecord.frozenForContainers); + result.setMetaData(CommonUtils.asMap(baseRecord.metaData)); if (fetchOptions.hasType()) { diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeBaseRecord.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeBaseRecord.java index 963194c71d95bdddcd9beb9a5dca797613f86465..663796881bbf9c3fb6379bdad93602804b0a1c5f 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeBaseRecord.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeBaseRecord.java @@ -37,4 +37,6 @@ public class DataSetTypeBaseRecord extends ObjectBaseRecord public Date modificationDate; + public String metaData; + } diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeTranslator.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeTranslator.java index 49d07c7cdaa2c1b96921d7ad1af0d8b2aac370cb..7661e8ca66f076565191e180f596ae86f561041d 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeTranslator.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeTranslator.java @@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.generic.server.asapi.v3.translator.dataset; import java.util.Collection; import java.util.List; +import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.CommonUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -89,6 +90,7 @@ public class DataSetTypeTranslator extends AbstractCachingTranslator<Long, DataS result.setDisallowDeletion(baseRecord.disallowDeletion); result.setDescription(baseRecord.description); result.setModificationDate(baseRecord.modificationDate); + result.setMetaData(CommonUtils.asMap(baseRecord.metaData)); if (fetchOptions.hasPropertyAssignments()) { diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java index 6384050bff4f16893fd1ff4d36749ece46fbe2a6..dada1aac933be41cbad8844c67c44a9bec50f4f3 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java @@ -123,6 +123,8 @@ public abstract class AbstractExternalData extends private Date accessTimestamp; + private Map<String, String> metaData; + public AbstractExternalData(boolean isStub) { this.isStub = isStub; @@ -519,6 +521,16 @@ public abstract class AbstractExternalData extends return null; } + public Map<String, String> getMetaData() + { + return metaData; + } + + public void setMetaData(Map<String, String> metaData) + { + this.metaData = metaData; + } + /** * {@link Comparator} for data sets contained in a (virtual) container which uses ascending order in container. */ diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetType.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetType.java index ddf555f56bb62dc6bdf720b738bb7f71b21d1efd..dc08ef2a2b6955bf417ea13b2d3465c72acc597c 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetType.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetType.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto; import java.util.List; +import java.util.Map; /** * The <i>GWT</i> equivalent to DataSetTypePE. @@ -34,6 +35,8 @@ public class DataSetType extends EntityType private boolean deletionDisallow; + private Map<String, String> metaData; + public void setMainDataSetPattern(String mainDataSetPattern) { this.mainDataSetPattern = mainDataSetPattern; @@ -95,4 +98,14 @@ public class DataSetType extends EntityType { return EntityKind.DATA_SET; } + + public Map<String, String> getMetaData() + { + return metaData; + } + + public void setMetaData(Map<String, String> metaData) + { + this.metaData = metaData; + } } diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java index 2e876d2da1a01d563315194c931b10756c1bc1fa..5ad52f1501e8c6060b3c8f73a3934a598829ed21 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java @@ -15,15 +15,7 @@ */ package ch.systemsx.cisd.openbis.generic.shared.dto; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; -import java.util.SortedMap; -import java.util.TreeMap; +import java.util.*; import javax.persistence.CascadeType; import javax.persistence.Column; @@ -45,14 +37,8 @@ import javax.persistence.Version; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; -import org.hibernate.annotations.BatchSize; -import org.hibernate.annotations.Cache; -import org.hibernate.annotations.CacheConcurrencyStrategy; -import org.hibernate.annotations.Fetch; -import org.hibernate.annotations.FetchMode; -import org.hibernate.annotations.Generated; -import org.hibernate.annotations.GenerationTime; -import org.hibernate.annotations.OptimisticLock; +import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.JsonMapUserType; +import org.hibernate.annotations.*; import org.hibernate.validator.constraints.Length; import ch.systemsx.cisd.common.collection.UnmodifiableSetDecorator; @@ -73,6 +59,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils; */ @Entity @Table(name = TableNames.DATA_VIEW, uniqueConstraints = @UniqueConstraint(columnNames = ColumnNames.CODE_COLUMN)) +@TypeDefs({ @TypeDef(name = "JsonMap", typeClass = JsonMapUserType.class) }) @Inheritance(strategy = InheritanceType.JOINED) public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements IEntityInformationWithPropertiesHolder, IMatchingEntity, IIdentifierHolder, IDeletablePE, @@ -155,6 +142,8 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements private Set<DataSetRelationshipPE> childRelationships = new LinkedHashSet<DataSetRelationshipPE>(); + private Map<String, String> metaData; + @OptimisticLock(excluded = true) @OneToMany(fetch = FetchType.LAZY, mappedBy = "parentDataSet") @Fetch(FetchMode.SUBSELECT) @@ -1050,4 +1039,16 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements this.postRegistration = postRegistration; } + @Column(name = "meta_data") + @Type(type = "JsonMap") + public Map<String, String> getMetaData() + { + return metaData; + } + + public void setMetaData(Map<String, String> metaData) + { + this.metaData = metaData; + } + } \ No newline at end of file diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetTypePE.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetTypePE.java index 67f3b188293a580ac2958b9226113adbf479acef..80ccb8de14b0efcc49884c22ec82c1598d937ca7 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetTypePE.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetTypePE.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.shared.dto; import java.util.Collection; import java.util.HashSet; +import java.util.Map; import java.util.Set; import javax.persistence.CascadeType; @@ -32,6 +33,10 @@ import javax.persistence.Table; import javax.persistence.Transient; import javax.persistence.UniqueConstraint; +import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.JsonMapUserType; +import org.hibernate.annotations.Type; +import org.hibernate.annotations.TypeDef; +import org.hibernate.annotations.TypeDefs; import org.hibernate.validator.constraints.Length; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; @@ -45,6 +50,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; */ @Entity @Table(name = TableNames.DATA_SET_TYPES_TABLE, uniqueConstraints = { @UniqueConstraint(columnNames = { ColumnNames.CODE_COLUMN }) }) +@TypeDefs({ @TypeDef(name = "JsonMap", typeClass = JsonMapUserType.class) }) public class DataSetTypePE extends EntityTypePE { private static final long serialVersionUID = IServer.VERSION; @@ -58,6 +64,8 @@ public class DataSetTypePE extends EntityTypePE private boolean deletionDisallow; + private Map<String, String> metaData; + @Override @SequenceGenerator(name = SequenceNames.DATA_SET_TYPE_SEQUENCE, sequenceName = SequenceNames.DATA_SET_TYPE_SEQUENCE, allocationSize = 1) @Id @@ -163,4 +171,17 @@ public class DataSetTypePE extends EntityTypePE this.deletionDisallow = deletionDisallow; } + @Column(name = "meta_data") + @Type(type = "JsonMap") + public Map<String, String> getMetaData() + { + return metaData; + } + + public void setMetaData(Map<String, String> metaData) + { + this.metaData = metaData; + } + + } diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java index 35186d452f5c4a2133d122f9fe9f5cfb18dbfc9c..fa1f662a2a477e7a6660ef846df243c7dc0311f3 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java @@ -295,6 +295,7 @@ public class DataSetTranslator externalData.setMetaprojects(metaprojects); } externalData.setDeletion(DeletionTranslator.translate(dataPE.getDeletion())); + externalData.setMetaData(dataPE.getMetaData()); return externalData; } @@ -401,6 +402,7 @@ public class DataSetTranslator dataSet.setH5Folders(externalDataPE.isH5Folders()); dataSet.setH5arFolders(externalDataPE.isH5arFolders()); dataSet.setArchivingRequested(externalDataPE.isArchivingRequested()); + dataSet.setMetaData(externalDataPE.getMetaData()); return dataSet; } @@ -436,6 +438,7 @@ public class DataSetTranslator sample.setSpace(SpaceTranslator.translate(samplePE.getSpace())); sample.setProject(ProjectTranslator.translate(samplePE.getProject())); sample.setExperiment(experiment); + sample.setMetaData(samplePE.getMetaData()); if (loadSampleProperties) { sample.setProperties(EntityPropertyTranslator.translate(samplePE.getProperties(), diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTypeTranslator.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTypeTranslator.java index 8c1afbcc0ee0d63e145311d1c9081a4394bb45ff..b01a3e0a98aa838369891f7df49ceb8474be2996 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTypeTranslator.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTypeTranslator.java @@ -61,6 +61,7 @@ public class DataSetTypeTranslator result.setModificationDate(entityTypeOrNull.getModificationDate()); result.setValidationScript(ScriptTranslator.translate(entityTypeOrNull .getValidationScript())); + result.setMetaData(entityTypeOrNull.getMetaData()); return result; } diff --git a/server-application-server/source/sql/generic/192/schema-192.sql b/server-application-server/source/sql/generic/192/schema-192.sql index a36235c47cf8fd5c3e03bec2193a5f60e944dac7..0b60665ebf8179d79eaa2180c9a4a9d2d6b42e77 100644 --- a/server-application-server/source/sql/generic/192/schema-192.sql +++ b/server-application-server/source/sql/generic/192/schema-192.sql @@ -2,7 +2,7 @@ CREATE TABLE CONTROLLED_VOCABULARIES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F', MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_CHOSEN_FROM_LIST BOOLEAN_CHAR NOT NULL DEFAULT TRUE, SOURCE_URI CHARACTER VARYING(250)); CREATE TABLE CONTROLLED_VOCABULARY_TERMS (ID TECH_ID NOT NULL,CODE OBJECT_NAME NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,COVO_ID TECH_ID NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL,LABEL COLUMN_LABEL, DESCRIPTION DESCRIPTION_2000, ORDINAL ORDINAL_INT NOT NULL, IS_OFFICIAL BOOLEAN_CHAR NOT NULL DEFAULT 'T'); -CREATE TABLE DATA_ALL (ID TECH_ID NOT NULL,CODE CODE,DATA_SET_KIND DATA_SET_KIND DEFAULT 'PHYSICAL' NOT NULL,DSTY_ID TECH_ID NOT NULL,DAST_ID TECH_ID NOT NULL,EXPE_ID TECH_ID,DATA_PRODUCER_CODE CODE,PRODUCTION_TIMESTAMP TIME_STAMP,SAMP_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID,IS_VALID BOOLEAN_CHAR DEFAULT 'T', MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, ACCESS_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, IS_DERIVED BOOLEAN_CHAR NOT NULL, DEL_ID TECH_ID, ORIG_DEL TECH_ID, PERS_ID_MODIFIER TECH_ID, VERSION INTEGER DEFAULT 0, FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_CHILDREN BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_PARENTS BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_COMPS BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_CONTS BOOLEAN_CHAR NOT NULL DEFAULT 'F', EXPE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', SAMP_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', TSVECTOR_DOCUMENT TSVECTOR NOT NULL); +CREATE TABLE DATA_ALL (ID TECH_ID NOT NULL,CODE CODE,DATA_SET_KIND DATA_SET_KIND DEFAULT 'PHYSICAL' NOT NULL,DSTY_ID TECH_ID NOT NULL,DAST_ID TECH_ID NOT NULL,EXPE_ID TECH_ID,DATA_PRODUCER_CODE CODE,PRODUCTION_TIMESTAMP TIME_STAMP,SAMP_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID,IS_VALID BOOLEAN_CHAR DEFAULT 'T', MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, ACCESS_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, IS_DERIVED BOOLEAN_CHAR NOT NULL, DEL_ID TECH_ID, ORIG_DEL TECH_ID, PERS_ID_MODIFIER TECH_ID, VERSION INTEGER DEFAULT 0, FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_CHILDREN BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_PARENTS BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_COMPS BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_CONTS BOOLEAN_CHAR NOT NULL DEFAULT 'F', EXPE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', SAMP_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', TSVECTOR_DOCUMENT TSVECTOR NOT NULL, META_DATA JSONB); CREATE TABLE DATA_SET_RELATIONSHIPS_ALL (DATA_ID_PARENT TECH_ID NOT NULL,DATA_ID_CHILD TECH_ID NOT NULL, RELATIONSHIP_ID TECH_ID NOT NULL, ORDINAL INTEGER, DEL_ID TECH_ID, PERS_ID_AUTHOR TECH_ID, REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, PARENT_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', CHILD_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', COMP_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', CONT_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F'); CREATE TABLE DATA_STORES (ID TECH_ID NOT NULL,UUID CODE NOT NULL,CODE CODE NOT NULL,DOWNLOAD_URL VARCHAR(1024) NOT NULL,REMOTE_URL VARCHAR(250) NOT NULL,SESSION_TOKEN VARCHAR(50) NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_ARCHIVER_CONFIGURED BOOLEAN_CHAR NOT NULL DEFAULT 'F', DATA_SOURCE_DEFINITIONS TEXT_VALUE); CREATE TABLE DATA_STORE_SERVICES (ID TECH_ID NOT NULL, KEY VARCHAR(256) NOT NULL, LABEL VARCHAR(256) NOT NULL, KIND DATA_STORE_SERVICE_KIND NOT NULL, DATA_STORE_ID TECH_ID NOT NULL, REPORTING_PLUGIN_TYPE DATA_STORE_SERVICE_REPORTING_PLUGIN_TYPE); @@ -28,7 +28,7 @@ CREATE TABLE MATERIAL_PROPERTIES (ID TECH_ID NOT NULL,MATE_ID TECH_ID NOT NULL,M CREATE TABLE MATERIAL_PROPERTIES_HISTORY (ID TECH_ID NOT NULL, MATE_ID TECH_ID NOT NULL, MTPT_ID TECH_ID NOT NULL, VALUE TEXT_VALUE, VOCABULARY_TERM IDENTIFIER, MATERIAL IDENTIFIER, PERS_ID_AUTHOR TECH_ID NOT NULL, VALID_FROM_TIMESTAMP TIME_STAMP NOT NULL, VALID_UNTIL_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, INTEGER_ARRAY_VALUE LONG_VALUE[], REAL_ARRAY_VALUE DOUBLE_VALUE[], STRING_ARRAY_VALUE TEXT_VALUE[], TIMESTAMP_ARRAY_VALUE TIME_STAMP[], JSON_VALUE JSONB); CREATE TABLE MATERIAL_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, VALIDATION_SCRIPT_ID TECH_ID); CREATE TABLE MATERIAL_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,MATY_ID TECH_ID NOT NULL,PRTY_ID TECH_ID NOT NULL,IS_MANDATORY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL, ORDINAL ORDINAL_INT NOT NULL, SECTION DESCRIPTION_2000,SCRIPT_ID TECH_ID,IS_SHOWN_EDIT BOOLEAN_CHAR NOT NULL DEFAULT 'T',SHOW_RAW_VALUE BOOLEAN_CHAR NOT NULL DEFAULT 'F', IS_UNIQUE BOOLEAN_CHAR NOT NULL DEFAULT 'F'); -CREATE TABLE DATA_SET_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, MAIN_DS_PATTERN VARCHAR(300), MAIN_DS_PATH VARCHAR(1000), DELETION_DISALLOW BOOLEAN_CHAR DEFAULT 'F', VALIDATION_SCRIPT_ID TECH_ID); +CREATE TABLE DATA_SET_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, MAIN_DS_PATTERN VARCHAR(300), MAIN_DS_PATH VARCHAR(1000), DELETION_DISALLOW BOOLEAN_CHAR DEFAULT 'F', VALIDATION_SCRIPT_ID TECH_ID, META_DATA JSONB); CREATE TABLE PERSONS (ID TECH_ID NOT NULL,FIRST_NAME VARCHAR(30),LAST_NAME VARCHAR(30),USER_ID USER_ID NOT NULL,EMAIL OBJECT_NAME,SPACE_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID, DISPLAY_SETTINGS FILE, IS_ACTIVE BOOLEAN DEFAULT TRUE); CREATE TABLE PROJECTS (ID TECH_ID NOT NULL,PERM_ID CODE NOT NULL,CODE CODE NOT NULL,SPACE_ID TECH_ID NOT NULL,PERS_ID_LEADER TECH_ID,DESCRIPTION TEXT_VALUE,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, PERS_ID_MODIFIER TECH_ID, VERSION INTEGER DEFAULT 0, FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_EXP BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_SAMP BOOLEAN_CHAR NOT NULL DEFAULT 'F', SPACE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F'); CREATE TABLE PROPERTY_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000 NOT NULL,LABEL COLUMN_LABEL NOT NULL,DATY_ID TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,COVO_ID TECH_ID,IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F', MATY_PROP_ID TECH_ID, SATY_PROP_ID TECH_ID, SCHEMA TEXT_VALUE, TRANSFORMATION TEXT_VALUE, META_DATA JSONB); @@ -131,7 +131,7 @@ CREATE VIEW data AS SELECT id, code, dsty_id, dast_id, expe_id, expe_frozen, data_producer_code, production_timestamp, samp_id, samp_frozen, registration_timestamp, access_timestamp, pers_id_registerer, pers_id_modifier, is_valid, modification_timestamp, is_derived, del_id, orig_del, version, data_set_kind, - frozen, frozen_for_children, frozen_for_parents, frozen_for_comps, frozen_for_conts, tsvector_document + frozen, frozen_for_children, frozen_for_parents, frozen_for_comps, frozen_for_conts, tsvector_document, meta_data FROM data_all WHERE del_id IS NULL; diff --git a/server-application-server/source/sql/postgresql/192/function-192.sql b/server-application-server/source/sql/postgresql/192/function-192.sql index 4245d2128177b4bcc83de68ca78d562873cb5dd5..329fe70b2405f79871050a369d1c36bb74a4120d 100644 --- a/server-application-server/source/sql/postgresql/192/function-192.sql +++ b/server-application-server/source/sql/postgresql/192/function-192.sql @@ -811,7 +811,8 @@ CREATE OR REPLACE RULE data_insert AS samp_id, samp_frozen, version, - data_set_kind + data_set_kind, + meta_data ) VALUES ( NEW.id, NEW.frozen, @@ -838,7 +839,8 @@ CREATE OR REPLACE RULE data_insert AS NEW.samp_id, NEW.samp_frozen, NEW.version, - NEW.data_set_kind + NEW.data_set_kind, + NEW.meta_data ); CREATE OR REPLACE RULE data_update AS @@ -868,7 +870,8 @@ CREATE OR REPLACE RULE data_update AS samp_id = NEW.samp_id, samp_frozen = NEW.samp_frozen, version = NEW.version, - data_set_kind = NEW.data_set_kind + data_set_kind = NEW.data_set_kind, + meta_data = NEW.meta_data WHERE id = NEW.id; CREATE OR REPLACE RULE data_all AS diff --git a/server-application-server/source/sql/postgresql/migration/migration-191-192.sql b/server-application-server/source/sql/postgresql/migration/migration-191-192.sql index e3d5e405e95a7d1ef35b705f39d21dfdb4055983..48999d1968d8135d557bf68efa7b04c8b557344a 100644 --- a/server-application-server/source/sql/postgresql/migration/migration-191-192.sql +++ b/server-application-server/source/sql/postgresql/migration/migration-191-192.sql @@ -29,6 +29,21 @@ CREATE OR REPLACE VIEW experiments AS WHERE del_id IS NULL; +ALTER TABLE IF EXISTS DATA_ALL + ADD COLUMN META_DATA jsonb; + +ALTER TABLE IF EXISTS DATA_SET_TYPES + ADD COLUMN META_DATA jsonb; + +CREATE OR REPLACE VIEW data AS + SELECT id, code, dsty_id, dast_id, expe_id, expe_frozen, data_producer_code, production_timestamp, samp_id, samp_frozen, + registration_timestamp, access_timestamp, pers_id_registerer, pers_id_modifier, is_valid, modification_timestamp, + is_derived, del_id, orig_del, version, data_set_kind, + frozen, frozen_for_children, frozen_for_parents, frozen_for_comps, frozen_for_conts, tsvector_document, meta_data + FROM data_all + WHERE del_id IS NULL; + + -- function CREATE OR REPLACE RULE sample_insert AS @@ -180,3 +195,95 @@ CREATE OR REPLACE RULE experiment_update AS version = NEW.version, meta_data = NEW.meta_data WHERE id = NEW.id; + + +CREATE OR REPLACE RULE data_insert AS + ON INSERT TO data DO INSTEAD + INSERT INTO data_all ( + id, + frozen, + frozen_for_children, + frozen_for_parents, + frozen_for_comps, + frozen_for_conts, + code, + del_id, + orig_del, + expe_id, + expe_frozen, + dast_id, + data_producer_code, + dsty_id, + is_derived, + is_valid, + modification_timestamp, + access_timestamp, + pers_id_registerer, + pers_id_modifier, + production_timestamp, + registration_timestamp, + samp_id, + samp_frozen, + version, + data_set_kind, + meta_data + ) VALUES ( + NEW.id, + NEW.frozen, + NEW.frozen_for_children, + NEW.frozen_for_parents, + NEW.frozen_for_comps, + NEW.frozen_for_conts, + NEW.code, + NEW.del_id, + NEW.orig_del, + NEW.expe_id, + NEW.expe_frozen, + NEW.dast_id, + NEW.data_producer_code, + NEW.dsty_id, + NEW.is_derived, + NEW.is_valid, + NEW.modification_timestamp, + NEW.access_timestamp, + NEW.pers_id_registerer, + NEW.pers_id_modifier, + NEW.production_timestamp, + NEW.registration_timestamp, + NEW.samp_id, + NEW.samp_frozen, + NEW.version, + NEW.data_set_kind, + NEW.meta_data + ); + +CREATE OR REPLACE RULE data_update AS + ON UPDATE TO data DO INSTEAD + UPDATE data_all + SET code = NEW.code, + frozen = NEW.frozen, + frozen_for_children = NEW.frozen_for_children, + frozen_for_parents = NEW.frozen_for_parents, + frozen_for_comps = NEW.frozen_for_comps, + frozen_for_conts = NEW.frozen_for_conts, + del_id = NEW.del_id, + orig_del = NEW.orig_del, + expe_id = NEW.expe_id, + expe_frozen = NEW.expe_frozen, + dast_id = NEW.dast_id, + data_producer_code = NEW.data_producer_code, + dsty_id = NEW.dsty_id, + is_derived = NEW.is_derived, + is_valid = NEW.is_valid, + modification_timestamp = NEW.modification_timestamp, + access_timestamp = NEW.access_timestamp, + pers_id_registerer = NEW.pers_id_registerer, + pers_id_modifier = NEW.pers_id_modifier, + production_timestamp = NEW.production_timestamp, + registration_timestamp = NEW.registration_timestamp, + samp_id = NEW.samp_id, + samp_frozen = NEW.samp_frozen, + version = NEW.version, + data_set_kind = NEW.data_set_kind, + meta_data = NEW.meta_data + WHERE id = NEW.id; \ No newline at end of file