diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java index 38040bb3a361be5e95265abefd2ca0884132da0f..45f38d244fc5027ed56a676989608942927fc33b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java @@ -226,18 +226,25 @@ public class EntityTypePropertyTypeBO extends AbstractBusinessObject implements assignment.setMandatory(assignmentUpdates.isMandatory()); if (assignmentUpdates.isDynamic() != assignment.isDynamic()) { - throw new UserFailureException( - String.format( - "Changing assignment from '%s' to '%s' is not allowed. Please create a new assignment.", - describeDynamic(assignment.isDynamic()), - describeDynamic(assignmentUpdates.isDynamic()))); + throw new UserFailureException(String.format( + "Changing assignment from '%s' to '%s' is not allowed. " + + "Please create a new assignment.", + describeDynamic(assignment.isDynamic()), + describeDynamic(assignmentUpdates.isDynamic()))); } - if (assignment.isDynamic()) + boolean scriptChanged = false; + if (assignment.isDynamic() + && assignment.getScript().getName().equals(assignmentUpdates.getScriptName()) == false) { + scriptChanged = true; ScriptPE script = getScriptDAO().tryFindByName(assignmentUpdates.getScriptName()); assignment.setScript(script); } validateAndSave(); + if (scriptChanged) + { + getEntityPropertyTypeDAO(entityKind).scheduleDynamicPropertiesEvaluation(assignment); + } } private static String describeDynamic(boolean dynamic) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ScriptBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ScriptBO.java index 2d77b80e383501e2734d77c5839f10645ea4fa97..e05eaa95623e87b6687f8d9fd573acfdff99396b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ScriptBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ScriptBO.java @@ -24,6 +24,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IScriptUpdates; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script; +import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.ScriptPE; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; @@ -94,7 +95,21 @@ public final class ScriptBO extends AbstractBusinessObject implements IScriptBO loadDataByTechId(TechId.create(updates)); script.setName(updates.getName()); script.setDescription(updates.getDescription()); - script.setScript(updates.getScript()); + boolean scriptChanged = false; + if (script.getScript().equals(updates.getScript()) == false) + { + scriptChanged = true; + script.setScript(updates.getScript()); + } getScriptDAO().createOrUpdate(script); + if (scriptChanged) + { + for (EntityTypePropertyTypePE assignment : script.getPropertyAssignments()) + { + getEntityPropertyTypeDAO(assignment.getEntityType().getEntityKind()) + .scheduleDynamicPropertiesEvaluation(assignment); + } + } } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IEntityPropertyTypeDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IEntityPropertyTypeDAO.java index fec87ebf619c5e9edb494503784b165aba02c912..f0d5eff7e7086b19a3b1266bee184a1ed01bd53b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IEntityPropertyTypeDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IEntityPropertyTypeDAO.java @@ -79,6 +79,10 @@ public interface IEntityPropertyTypeDAO public List<Long> listIdsOfEntitiesWithoutPropertyValue( final EntityTypePropertyTypePE assignment) throws DataAccessException; + /** Schedules evaluation of dynamic properties */ + public void scheduleDynamicPropertiesEvaluation(final EntityTypePropertyTypePE assignment) + throws DataAccessException; + /** * Fills term usage statistics for the entity kind represented by this class. * diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java index ab23558ca4f1a5892fc654c058d12f53bf93db95..bc5006527effd75fd481ade647f48d77551287d3 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java @@ -174,6 +174,17 @@ final class EntityPropertyTypeDAO extends AbstractDAO implements IEntityProperty return list; } + public void scheduleDynamicPropertiesEvaluation(final EntityTypePropertyTypePE assignment) + throws DataAccessException + { + assert assignment != null : "Unspecified assignment."; + if (assignment.isDynamic()) // sanity check + { + List<Long> entityIds = listEntityIds(assignment); + scheduleDynamicPropertiesEvaluation(entityIds); + } + } + private List<Long> listEntityIds(final EntityTypePropertyTypePE assignment) throws DataAccessException { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java index b3a853c6e22116b5bc725b13d5b154b5ece03c4d..84376c950464ee692f170764c60146ed5d1d941d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java @@ -120,13 +120,13 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator listEntitiesWithRestrictedId(hibernateSession, clazz, minId, maxId); evaluateProperties(hibernateSession, results, clazz); index = nextIndex; - operationLog.info(String.format("%d/%d %ss have been updated...", index, maxIndex, - clazz.getSimpleName())); + operationLog.info(String.format("%d/%d %ss have been updated...", index + 1, + maxIndex + 1, clazz.getSimpleName())); } transaction.commit(); operationLog.info(String.format( "Evaluation of dynamic properties for '%s' is complete. " - + "%d entities have been updated.", clazz.getSimpleName(), index)); + + "%d entities have been updated.", clazz.getSimpleName(), index + 1)); return ids; } catch (Exception e) { @@ -166,13 +166,13 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator listEntitiesWithRestrictedId(hibernateSession, clazz, subList); evaluateProperties(hibernateSession, results, clazz); index = nextIndex; - operationLog.info(String.format("%d/%d %ss have been updated...", index + 1, - maxIndex + 1, clazz.getSimpleName())); + operationLog.info(String.format("%d/%d %ss have been updated...", index, maxIndex, + clazz.getSimpleName())); } transaction.commit(); operationLog.info(String.format( "Evaluation of dynamic properties for '%s' is complete. " - + "%d entities have been updated.", clazz.getSimpleName(), index + 1)); + + "%d entities have been updated.", clazz.getSimpleName(), index)); return dynamicIds; } catch (Exception e) { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetTypePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetTypePE.java index 7dadbaa66039cc2301da63095d760be791054634..58893a6134fc0951db48f1f21e11c9ede68113f6 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetTypePE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetTypePE.java @@ -37,6 +37,7 @@ import org.hibernate.validator.Length; import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants; import ch.systemsx.cisd.openbis.generic.shared.IServer; +import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; /** * Persistence Entity representing data set type. @@ -131,4 +132,11 @@ public class DataSetTypePE extends EntityTypePE { this.mainDataSetPattern = mainDataSetPattern; } + + @Override + @Transient + public EntityKind getEntityKind() + { + return EntityKind.DATA_SET; + } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityTypePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityTypePE.java index 1ee963a6296f19fc3d7e8652b48ec680ce40ae28..e7eb52ee292a6c9e3abca9ec44d129a879de2697 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityTypePE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityTypePE.java @@ -20,6 +20,7 @@ import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.MappedSuperclass; +import javax.persistence.Transient; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; @@ -37,7 +38,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.EqualsHashUtils; * Entity is one of: material, sample, experiment * </p> * - * @author Franz-Josef Elmer + * @author Franz-Josef Elmer * @author Izabela Adamczyk */ @MappedSuperclass @@ -45,6 +46,9 @@ public abstract class EntityTypePE extends AbstractTypePE { private static final long serialVersionUID = IServer.VERSION; + @Transient + public abstract EntityKind getEntityKind(); + private DatabaseInstancePE databaseInstance; @ManyToOne(fetch = FetchType.EAGER) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityTypePropertyTypePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityTypePropertyTypePE.java index fe6f461df57e17c27fbe73040c4172860e6b5742..f1662adf65bb7fec77ada0e8a4f4e35cc332aca0 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityTypePropertyTypePE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityTypePropertyTypePE.java @@ -125,7 +125,7 @@ public abstract class EntityTypePropertyTypePE extends HibernateAbstractRegistra } @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = ColumnNames.SCRIPT_ID_COLUMN) + @JoinColumn(name = ColumnNames.SCRIPT_ID_COLUMN, updatable = true) public ScriptPE getScript() { return script; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentTypePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentTypePE.java index e29dff09bc0281a6c5beaf22a83272d89456955f..7ebe91a2b67dc3d5267eb810854a3f9da1a2ae58 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentTypePE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentTypePE.java @@ -34,6 +34,7 @@ import javax.persistence.UniqueConstraint; import org.hibernate.annotations.Cascade; import ch.systemsx.cisd.openbis.generic.shared.IServer; +import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; /** * Persistence entity representing type of experiment. @@ -102,4 +103,10 @@ public final class ExperimentTypePE extends EntityTypePE getExperimentTypePropertyTypesInternal().add(child); } + @Override + @Transient + public EntityKind getEntityKind() + { + return EntityKind.EXPERIMENT; + } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialTypePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialTypePE.java index d7771c6574c57994bcc855bc15708b40c96b3fa7..6b58cea993566cf563ab9772b18a96744d52935c 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialTypePE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialTypePE.java @@ -34,6 +34,7 @@ import javax.persistence.UniqueConstraint; import org.hibernate.annotations.Cascade; import ch.systemsx.cisd.openbis.generic.shared.IServer; +import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; /** * Persistence entity representing type of material. @@ -105,4 +106,11 @@ public final class MaterialTypePE extends EntityTypePE child.setEntityTypeInternal(this); getMaterialTypePropertyTypesInternal().add(child); } + + @Override + @Transient + public EntityKind getEntityKind() + { + return EntityKind.MATERIAL; + } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePE.java index 502c47f14f474b04f111aa665b969ed7f9605fe9..08245e1c842c3fa4e84efb5c008f5ce0cf520ea0 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePE.java @@ -39,6 +39,7 @@ import org.hibernate.validator.NotNull; import org.hibernate.validator.Pattern; import ch.systemsx.cisd.openbis.generic.shared.IServer; +import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; /** * Persistence Entity representing 'sample type'. @@ -206,4 +207,11 @@ public final class SampleTypePE extends EntityTypePE return builder; } + @Override + @Transient + public EntityKind getEntityKind() + { + return EntityKind.SAMPLE; + } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ScriptPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ScriptPE.java index 273cdae27a0cb45cbccd2df80b001adc05363a62..e7d27a20cade096c5e36cb297b4ab31a78d2b43d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ScriptPE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ScriptPE.java @@ -17,6 +17,8 @@ package ch.systemsx.cisd.openbis.generic.shared.dto; import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; @@ -26,14 +28,17 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; import javax.persistence.SequenceGenerator; import javax.persistence.Table; +import javax.persistence.Transient; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.hibernate.validator.Length; import org.hibernate.validator.NotNull; +import ch.systemsx.cisd.common.collections.UnmodifiableListDecorator; import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants; import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; @@ -61,6 +66,22 @@ public class ScriptPE extends HibernateAbstractRegistrationHolder implements IId private String script; + // + // assignments using the script - readonly + // + + private List<SampleTypePropertyTypePE> sampleAssignments = + new ArrayList<SampleTypePropertyTypePE>(); + + private List<ExperimentTypePropertyTypePE> experimentAssignments = + new ArrayList<ExperimentTypePropertyTypePE>(); + + private List<MaterialTypePropertyTypePE> materialAssignments = + new ArrayList<MaterialTypePropertyTypePE>(); + + private List<DataSetTypePropertyTypePE> dataSetAssignments = + new ArrayList<DataSetTypePropertyTypePE>(); + @Column(name = ColumnNames.DESCRIPTION_COLUMN) @Length(max = GenericConstants.DESCRIPTION_2000, message = ValidationMessages.DESCRIPTION_LENGTH_MESSAGE) public String getDescription() @@ -172,4 +193,68 @@ public class ScriptPE extends HibernateAbstractRegistrationHolder implements IId } return thisName.compareTo(thatName); } + + // + // assignments using the script - readonly + // + + @Transient + /** all dynamic property assignments using the script */ + public List<EntityTypePropertyTypePE> getPropertyAssignments() + { + List<EntityTypePropertyTypePE> assignments = new ArrayList<EntityTypePropertyTypePE>(); + assignments.addAll(getDataSetAssignments()); + assignments.addAll(getExperimentAssignments()); + assignments.addAll(getMaterialAssignments()); + assignments.addAll(getSampleAssignments()); + return new UnmodifiableListDecorator<EntityTypePropertyTypePE>(assignments); + } + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "script") + private List<SampleTypePropertyTypePE> getSampleAssignments() + { + return sampleAssignments; + } + + @SuppressWarnings("unused") + private void setSampleAssignments(List<SampleTypePropertyTypePE> sampleAssignments) + { + this.sampleAssignments = sampleAssignments; + } + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "script") + private List<ExperimentTypePropertyTypePE> getExperimentAssignments() + { + return experimentAssignments; + } + + @SuppressWarnings("unused") + private void setExperimentAssignments(List<ExperimentTypePropertyTypePE> experimentAssignments) + { + this.experimentAssignments = experimentAssignments; + } + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "script") + private List<MaterialTypePropertyTypePE> getMaterialAssignments() + { + return materialAssignments; + } + + @SuppressWarnings("unused") + private void setMaterialAssignments(List<MaterialTypePropertyTypePE> materialAssignments) + { + this.materialAssignments = materialAssignments; + } + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "script") + private List<DataSetTypePropertyTypePE> getDataSetAssignments() + { + return dataSetAssignments; + } + + @SuppressWarnings("unused") + private void setDataListAssignments(List<DataSetTypePropertyTypePE> dataSetAssignments) + { + this.dataSetAssignments = dataSetAssignments; + } }