diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AttachmentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AttachmentBO.java index cf3c646b1e4aafa841ad7caeac80d1c1d0e992a9..16a75f31c59d0abbb877dcf7bbd39cc6028a4204 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AttachmentBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AttachmentBO.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; +import java.util.Collections; import java.util.List; import org.springframework.dao.DataAccessException; @@ -71,7 +72,7 @@ public final class AttachmentBO extends AbstractBusinessObject implements IAttac final String identifier = createDeletionIdentifier(holder, fileName); event.setEventType(EventType.DELETION); event.setEntityType(EntityType.ATTACHMENT); - event.setIdentifiers(identifier); + event.setIdentifiers(Collections.singletonList(identifier)); event.setDescription(identifier); event.setReason(reason); event.setRegistrator(registrator); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AuthorizationGroupBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AuthorizationGroupBO.java index 5aa49645863bcf7a56575f57f3f8351dca43ab88..e0cde1e641e5fe4c0827280d16655f3d064cac9e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AuthorizationGroupBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AuthorizationGroupBO.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.springframework.dao.DataAccessException; @@ -31,10 +32,10 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAuthorizationGroup; import ch.systemsx.cisd.openbis.generic.shared.dto.AuthorizationGroupPE; import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE; import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType; import ch.systemsx.cisd.openbis.generic.shared.dto.EventType; import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType; /** * {@link IAuthorizationGroupBO} implementation. @@ -147,7 +148,7 @@ public class AuthorizationGroupBO extends AbstractBusinessObject implements IAut EventPE event = new EventPE(); event.setEventType(EventType.DELETION); event.setEntityType(EntityType.AUTHORIZATION_GROUP); - event.setIdentifiers(groupCode); + event.setIdentifiers(Collections.singletonList(groupCode)); event.setDescription(groupCode); event.setReason(reason); event.setRegistrator(registrator); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java index b96fba63f71b329145f7d8c28884a7d3fc9345f8..f70a95900113e26858fd9c87a0241fefd805f434 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java @@ -303,7 +303,7 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements EventPE event = new EventPE(); event.setEventType(EventType.DELETION); event.setEntityType(EntityType.DATASET); - event.setIdentifiers(dataSet.getCode()); + event.setIdentifiers(Collections.singletonList(dataSet.getCode())); event.setDescription(getDeletionDescription(dataSet)); event.setReason(reason); event.setRegistrator(registrator); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java index e95986486149fd3013ae720f7ebb5de218086dc2..09e4bd08db2e0954df01ae3f65d2331d10e30c3b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -271,7 +272,7 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper EventPE event = new EventPE(); event.setEventType(EventType.DELETION); event.setEntityType(EntityType.EXPERIMENT); - event.setIdentifiers(experiment.getPermId()); + event.setIdentifiers(Collections.singletonList(experiment.getPermId())); event.setDescription(getDeletionDescription(experiment)); event.setReason(reason); event.setRegistrator(registrator); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GroupBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GroupBO.java index e11624b8f7a51220135d31bf119c3bd22414b6cc..f66641079eb832cc877f3fe01969379200c60e01 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GroupBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GroupBO.java @@ -16,6 +16,8 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; +import java.util.Collections; + import org.springframework.dao.DataAccessException; import org.springframework.dao.DataRetrievalFailureException; @@ -26,11 +28,11 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISpaceUpdates; import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE; import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType; import ch.systemsx.cisd.openbis.generic.shared.dto.EventType; -import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType; +import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.GroupIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper; @@ -145,7 +147,7 @@ public final class GroupBO extends AbstractBusinessObject implements IGroupBO EventPE event = new EventPE(); event.setEventType(EventType.DELETION); event.setEntityType(EntityType.SPACE); - event.setIdentifiers(group.getCode()); + event.setIdentifiers(Collections.singletonList(group.getCode())); event.setDescription(getDeletionDescription(group)); event.setReason(reason); event.setRegistrator(registrator); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java index 9c67d7003c6590c4d680f0656e990a77ebac93ef..80a328945b6ed1fd3fd7c32c3042f6ab357e680e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java @@ -142,7 +142,7 @@ public final class MaterialBO extends AbstractMaterialBusinessObject implements EventPE event = new EventPE(); event.setEventType(EventType.DELETION); event.setEntityType(EntityType.MATERIAL); - event.setIdentifiers(material.getCode()); + event.setIdentifiers(Collections.singletonList(material.getCode())); event.setDescription(material.getPermId()); event.setReason(reason); event.setRegistrator(registrator); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java index 98d9eccf339c78b3a4059c86b21b4ff23da0e0bc..1936584444ed47e0983b8ad32aca792b45caedb5 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Set; @@ -32,14 +33,14 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment; import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE; import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType; import ch.systemsx.cisd.openbis.generic.shared.dto.EventType; import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE; import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectUpdatesDTO; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType; +import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; import ch.systemsx.cisd.openbis.generic.shared.translator.AttachmentTranslator; import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils; @@ -278,7 +279,7 @@ public final class ProjectBO extends AbstractBusinessObject implements IProjectB EventPE event = new EventPE(); event.setEventType(EventType.DELETION); event.setEntityType(EntityType.PROJECT); - event.setIdentifiers(project.getIdentifier()); + event.setIdentifiers(Collections.singletonList(project.getIdentifier())); event.setDescription(getDeletionDescription(project)); event.setReason(reason); event.setRegistrator(registrator); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBO.java index e16c11e971bf31df61d403f262f51782e600c5d1..41332add6066360c95d6fc4614f93876c3859198 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBO.java @@ -16,6 +16,8 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; +import java.util.Collections; + import javax.xml.validation.Schema; import org.springframework.dao.DataAccessException; @@ -37,13 +39,13 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary; import ch.systemsx.cisd.openbis.generic.shared.dto.DataTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType; import ch.systemsx.cisd.openbis.generic.shared.dto.EventType; import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType; import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; import ch.systemsx.cisd.openbis.generic.shared.util.XmlUtils; @@ -231,7 +233,7 @@ public final class PropertyTypeBO extends VocabularyBO implements IPropertyTypeB EventPE event = new EventPE(); event.setEventType(EventType.DELETION); event.setEntityType(EntityType.PROPERTY_TYPE); - event.setIdentifiers(propertyTypePE.getCode()); + event.setIdentifiers(Collections.singletonList(propertyTypePE.getCode())); event.setDescription(getDeletionDescription(propertyTypePE)); event.setReason(reason); event.setRegistrator(registrator); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java index 0e24dfc4f07a05c177777e58b514f1f21a0614a0..8d2301eb4ef04f8eb2efaee47353dbb99cb9e126 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java @@ -386,7 +386,7 @@ public class VocabularyBO extends AbstractBusinessObject implements IVocabularyB EventPE event = new EventPE(); event.setEventType(EventType.DELETION); event.setEntityType(EntityType.VOCABULARY); - event.setIdentifiers(vocabularyPE.getCode()); + event.setIdentifiers(Collections.singletonList(vocabularyPE.getCode())); event.setDescription(getDeletionDescription(vocabularyPE)); event.setReason(reason); event.setRegistrator(registrator); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EventDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EventDAO.java index 5027fd273284a20dec40ed9dcbcb7f1e060f70fa..091e696ac18174aac4bd9adc4cb6ce37f76f15ba 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EventDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EventDAO.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.db; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.List; @@ -28,6 +29,7 @@ import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Restrictions; import org.springframework.jdbc.support.JdbcAccessor; +import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.common.utilities.MethodUtils; @@ -66,7 +68,7 @@ public class EventDAO extends AbstractGenericEntityDAO<EventPE> implements IEven assert eventType != null : "Unspecified eventType."; final Criteria criteria = getSession().createCriteria(EventPE.class); - criteria.add(Restrictions.like("identifiers", identifier, MatchMode.ANYWHERE)); + criteria.add(Restrictions.like("identifiersInternal", identifier, MatchMode.ANYWHERE)); criteria.add(Restrictions.eq("entityType", entityType)); criteria.add(Restrictions.eq("eventType", eventType)); final EventPE result = tryGetEntity(criteria.uniqueResult()); @@ -102,11 +104,29 @@ public class EventDAO extends AbstractGenericEntityDAO<EventPE> implements IEven "%s(%s): %d data set deletion events(s) have been found.", MethodUtils .getCurrentMethod().getName(), lastDesc, list.size())); } + ArrayList<DeletedDataSet> result = new ArrayList<DeletedDataSet>(); for (EventPE event : list) { - result.add(new DeletedDataSet(event.getIdentifiers(), event.getDescription(), event - .getId())); + List<String> identifiers = event.getIdentifiers(); + List<String> locations = + Arrays.asList(event.getDescription().split(EventPE.IDENTIFIER_SEPARATOR)); + if (identifiers.size() != locations.size()) + { + throw EnvironmentFailureException.fromTemplate( + "Number of deleted dataset codes %s does not match " + + "the number of deleted data set locations %s in eventId='%s'", + identifiers.size(), locations.size(), event.getId()); + } + int pos = 0; + for (pos = 0; pos < identifiers.size(); pos++) + { + String dataSetCode = identifiers.get(pos); + String dataSetLocation = locations.get(pos); + DeletedDataSet deletedDataSet = + new DeletedDataSet(dataSetCode, dataSetLocation, event.getId()); + result.add(deletedDataSet); + } } return result; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EventPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EventPE.java index e5d6285a1e6670cf0fa4cd0f879342c696e42cc5..ba847a98412cf051d75408ef8179ef11a74a6ba6 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EventPE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EventPE.java @@ -17,6 +17,8 @@ package ch.systemsx.cisd.openbis.generic.shared.dto; import java.io.Serializable; +import java.util.Arrays; +import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; @@ -27,6 +29,7 @@ import javax.persistence.GenerationType; import javax.persistence.Id; 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; @@ -35,6 +38,8 @@ import org.hibernate.validator.Length; import org.hibernate.validator.NotNull; import ch.rinn.restrictions.Friend; +import ch.systemsx.cisd.common.collections.CollectionStyle; +import ch.systemsx.cisd.common.collections.CollectionUtils; import ch.systemsx.cisd.common.utilities.ModifiedShortPrefixToStringStyle; import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants; import ch.systemsx.cisd.openbis.generic.shared.IServer; @@ -50,6 +55,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder; @Friend(toClasses = DataPE.class) public class EventPE extends HibernateAbstractRegistrationHolder implements IIdHolder, Serializable { + + public static final String IDENTIFIER_SEPARATOR = ", "; + private static final long serialVersionUID = IServer.VERSION; public enum EntityType @@ -64,7 +72,7 @@ public class EventPE extends HibernateAbstractRegistrationHolder implements IIdH private EntityType entityType; - private String identifiers; + private List<String> identifiers; private String description; @@ -109,16 +117,29 @@ public class EventPE extends HibernateAbstractRegistrationHolder implements IIdH this.entityType = entityType; } + @SuppressWarnings("unused") @NotNull(message = ValidationMessages.IDENTIFIER_NOT_NULL_MESSAGE) @Column(name = ColumnNames.IDENTIFIERS) - public String getIdentifiers() + private String getIdentifiersInternal() + { + return CollectionUtils.abbreviate(identifiers, -1, CollectionStyle.NO_BOUNDARY); + } + + @SuppressWarnings("unused") + private void setIdentifiersInternal(String identifier) + { + this.identifiers = Arrays.asList(identifier.split(IDENTIFIER_SEPARATOR)); + } + + @Transient + public List<String> getIdentifiers() { return identifiers; } - public void setIdentifiers(String identifier) + public void setIdentifiers(List<String> identifiers) { - this.identifiers = identifier; + this.identifiers = identifiers; } @Length(max = GenericConstants.DESCRIPTION_2000, message = ValidationMessages.DESCRIPTION_LENGTH_MESSAGE) diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAOTest.java index 9b06f0966619086252a890444dce37e62ffa4478..88d53e35b1adef218bf8f649cfd3cf88337517f3 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAOTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAOTest.java @@ -361,7 +361,10 @@ public final class SampleDAOTest extends AbstractDAOTest final EventPE event = tryGetDeletionEvent(sample); assertNotNull(event); assertEquals(reason, event.getReason()); - assertEquals(commaSeparatedIdentifiers, event.getIdentifiers()); + String persistedIdentifiers = + CollectionUtils.abbreviate(event.getIdentifiers(), -1, + CollectionStyle.NO_BOUNDARY); + assertEquals(commaSeparatedIdentifiers, persistedIdentifiers); assertEquals(registrator, event.getRegistrator()); } }