diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/SampleModelFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/SampleModelFactory.java index aaeecf9ed435d8bcaee4e75fb77d5a95ca7d0b18..6c631de947cf63da2d31b0d83252d57924aa68c4 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/SampleModelFactory.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/SampleModelFactory.java @@ -108,18 +108,18 @@ public final class SampleModelFactory if (sampleTypeOrNull.isShowParents()) { String headerText = tryGetMessage(msgProviderOrNull, Dict.PARENTS); - list.add(new ParentGeneratedFromSampleColDef(1, headerText)); + list.add(new ParentGeneratedFromSampleColDef(headerText)); } if (sampleTypeOrNull.isShowContainer()) { String headerText = tryGetMessage(msgProviderOrNull, Dict.PART_OF); - list.add(new ParentContainerSampleColDef(1, headerText)); + list.add(new ParentContainerSampleColDef(headerText)); } } return list; } - private static ArrayList<AbstractParentSampleColDef> createColDefList() + private static List<AbstractParentSampleColDef> createColDefList() { return new ArrayList<AbstractParentSampleColDef>(); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java index be6416de3427ed097298b0d4d7345ce392bb7f48..a9192fe0d9fa52b6b28b4a85781a8cdc3460df96 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java @@ -26,22 +26,17 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; public abstract class AbstractParentSampleColDef extends AbstractColumnDefinition<Sample> implements IsSerializable { - abstract protected Sample tryGetParent(Sample sample); + abstract public Sample tryGetParent(Sample sample); - abstract protected String getIdentifierPrefix(); - - private int/* the level which should be shown */level; - - AbstractParentSampleColDef(int level, String headerText) + AbstractParentSampleColDef(String headerText) { super(headerText, AbstractColumnDefinitionKind.DEFAULT_COLUMN_WIDTH, false, false); - this.level = level; } @Override protected String tryGetValue(Sample sample) { - Sample parent = tryGetParentSample(sample); + Sample parent = tryGetParent(sample); if (parent != null) { return parent.getIdentifier(); @@ -54,24 +49,6 @@ public abstract class AbstractParentSampleColDef extends AbstractColumnDefinitio @Override public String tryGetLink(Sample sample) { - return LinkExtractor.tryExtract(tryGetParentSample(sample)); - } - - public String getIdentifier() - { - return getIdentifierPrefix() + level; + return LinkExtractor.tryExtract(tryGetParent(sample)); } - - public final Sample tryGetParentSample(final Sample sample) - { - Sample parent = sample; - int depth = level; - while (depth > 0 && parent != null) - { - parent = tryGetParent(parent); - depth--; - } - return parent; - } - } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentContainerSampleColDef.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentContainerSampleColDef.java index 226197069e2fe5eea0d2d0727269449ca1551060..e10873e432a0283642afab1b243882ad16bd881b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentContainerSampleColDef.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentContainerSampleColDef.java @@ -23,27 +23,26 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; */ public class ParentContainerSampleColDef extends AbstractParentSampleColDef { - private static final String PARENT_PREFIX = "containerParent"; + private static final String IDENTIFIER = "containerParent"; // GWT only public ParentContainerSampleColDef() { - super(0, null); + this(null); } - public ParentContainerSampleColDef(int level, String headerText) + public ParentContainerSampleColDef(String headerText) { - super(level, headerText); + super(headerText); } - @Override - protected String getIdentifierPrefix() + public String getIdentifier() { - return PARENT_PREFIX; + return IDENTIFIER; } @Override - protected Sample tryGetParent(Sample sample) + public Sample tryGetParent(Sample sample) { return sample.getContainer(); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java index 9eda659f85459579cd8c57abeb84ebf8a22e66d3..51f305068e7d96de2aeb4e6be90a49cbb9a870d5 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java @@ -20,28 +20,50 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; public class ParentGeneratedFromSampleColDef extends AbstractParentSampleColDef { - private static final String PARENT_PREFIX = "generatedFromParent"; + private static final String IDENTIFIER = "generatedFromParent"; // GWT only public ParentGeneratedFromSampleColDef() { - super(0, null); + this(null); } - public ParentGeneratedFromSampleColDef(int level, String headerText) + public ParentGeneratedFromSampleColDef(String headerText) { - super(level, headerText); + super(headerText); + } + + public String getIdentifier() + { + return IDENTIFIER; } @Override - protected String getIdentifierPrefix() + public Sample tryGetParent(Sample sample) { - return PARENT_PREFIX; + if (sample.getParents().size() == 1) + { + return sample.getGeneratedFrom(); + } else + { + return null; + } } @Override - protected Sample tryGetParent(Sample sample) + protected String tryGetValue(Sample sample) { - return sample.getGeneratedFrom(); + int parentsSize = sample.getParents().size(); + if (parentsSize == 0) + { + return null; + } else if (parentsSize == 1) + { + return super.tryGetValue(sample); + } else + { + return parentsSize + ""; + } } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java index ba367e06366bda560aa2fa52986dc9b30bb10144..d88d29e1d9624a1f27e6cf4290bf8d59fe20a4c4 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java @@ -612,7 +612,7 @@ public class SampleBrowserGrid extends @Override protected IEntityInformationHolder getEntity(Sample rowItem) { - return parentColDef.tryGetParentSample(rowItem); + return parentColDef.tryGetParent(rowItem); } }); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleGenericBusinessRules.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleGenericBusinessRules.java index 4ffbc1654c7e8cd447cc5adef5786bd478f6674b..320ea8608978cb2b1ff0d21b9e0170152c7dddfe 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleGenericBusinessRules.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleGenericBusinessRules.java @@ -85,6 +85,7 @@ public class SampleGenericBusinessRules if (sample == null) return; assertValidParentRelation(sample.getContainer(), sample, "contained in"); + // FIXME 2010-08-05, Piotr Buczek: use parents - not generatedFrom assertValidParentRelation(sample.getGeneratedFrom(), sample, "child of"); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleHierarchyFiller.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleHierarchyFiller.java index 79dd18274162d3f9649e365bd1d2e6028b27fe05..a72ebe14e84ea56dbb267e1caf0094438b9bdd29 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleHierarchyFiller.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleHierarchyFiller.java @@ -42,35 +42,18 @@ public final class SampleHierarchyFiller private final static void enrichContainerHierarchy(final SamplePE sample) { - SamplePE container = sample; - final Integer integer = sample.getSampleType().getContainerHierarchyDepth(); - assert integer != null : "'partOf' hierarchy depth not specified."; - int containerHierarchyDepth = getPositiveIntegerValue(integer); - while (containerHierarchyDepth-- > 0 && container != null) - { - container = container.getContainer(); - initialize(container); - } + final SamplePE container = sample.getContainer(); + initialize(container); } private final static void enrichParentHierarchy(final SamplePE sample) { - SamplePE generatedFrom = sample; - final Integer integer = sample.getSampleType().getGeneratedFromHierarchyDepth(); - assert integer != null : "'generatedFrom' hierarchy depth not specified."; - int generatedFromHierarchyDepth = getPositiveIntegerValue(integer); - while (generatedFromHierarchyDepth-- > 0 && generatedFrom != null) + for (SamplePE parent : sample.getParents()) { - generatedFrom = generatedFrom.getGeneratedFrom(); - initialize(generatedFrom); + initialize(parent); } } - public final static int getPositiveIntegerValue(int integer) - { - return integer == 0 ? 1 : integer; - } - private final static void initialize(final SamplePE sample) { if (sample != null) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java index 2f92e392d8e7bb169f66e309ba2497f2a3d8c7f0..e9a1968868e6adc270d4339394a8df1a074987ee 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java @@ -697,7 +697,7 @@ final class SampleListingWorker { final RelatedSampleRecord record = e.getValue(); final Sample parent = sampleMap.get(record.relatedSampleId); - record.sample.setGeneratedFrom(parent); + record.sample.addParent(parent); } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Sample.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Sample.java index 7cb5b9ba4946b5edcf2860033b41f7d6b6a39e6e..2fbb11ffd5a3cadbe0bfdc1e2e42ad9cd4009370 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Sample.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Sample.java @@ -52,7 +52,7 @@ public final class Sample extends CodeWithRegistration<Sample> implements IInval private Sample container; - private Sample generatedFrom; + private List<Sample> parents = new ArrayList<Sample>(); private List<IEntityProperty> properties; @@ -156,14 +156,40 @@ public final class Sample extends CodeWithRegistration<Sample> implements IInval this.container = container; } + public List<Sample> getParents() + { + return parents; + } + + public void setParents(List<Sample> parents) + { + this.parents = parents; + } + + public void addParent(final Sample parent) + { + parents.add(parent); + } + public Sample getGeneratedFrom() { - return generatedFrom; + if (parents.size() == 0) + { + return null; + } + if (parents.size() > 1) + { + throw new IllegalStateException("Sample " + getIdentifier() + + " has more than one parent"); + } + return parents.get(0); } + // used only for testing public void setGeneratedFrom(final Sample generatedFrom) { - this.generatedFrom = generatedFrom; + parents = new ArrayList<Sample>(); + parents.add(generatedFrom); } public List<IEntityProperty> getProperties() diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ServiceVersionHolder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ServiceVersionHolder.java index a29e32b5a17ad3d8c437d8c8fd70f6b35ad60dc6..6e7d1afb39b931b768fc1d3bb43b650c5aa2117c 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ServiceVersionHolder.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ServiceVersionHolder.java @@ -24,5 +24,5 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto; public final class ServiceVersionHolder { - public static final int VERSION = 16; // for S86 + public static final int VERSION = 17; // for S87 } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java index f21755fe120c6bd927cb09bec16e3fc1d49d31a8..cf1418b40afb7b9f83f38c610880946aae9de09a 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java @@ -415,17 +415,34 @@ public class SamplePE extends AttachmentHolderPE implements IIdAndCodeHolder, Co @Transient public SamplePE getGeneratedFrom() { - Set<SampleRelationshipPE> relationships = getParentRelationships(); + final List<SamplePE> parents = getParents(); + if (parents.size() == 0) + { + return null; + } + if (parents.size() > 1) + { + throw new IllegalStateException("Sample " + getIdentifier() + + " has more than one parent"); + } + return parents.get(0); + } + + @Transient + public List<SamplePE> getParents() + { + final Set<SampleRelationshipPE> relationships = getParentRelationships(); + final List<SamplePE> parents = new ArrayList<SamplePE>(); for (SampleRelationshipPE r : relationships) { assert r.getChildSample().equals(this); if (r.getRelationship().getCode().equals( BasicConstant.PARENT_CHILD_INTERNAL_RELATIONSHIP)) { - return r.getParentSample(); + parents.add(r.getParentSample()); } } - return null; + return parents; } public void setExperiment(final ExperimentPE experiment) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java index 58c9979a13f92c6d6d714ea529495507d0afd597..ea028f697d187f34fb3939e6ec3a8450d2715665 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java @@ -126,12 +126,15 @@ public final class SampleTranslator baseIndexURL, containerDep - 1, 0, false)); } } - if (generatedFromDep > 0 && samplePE.getGeneratedFrom() != null) + if (generatedFromDep > 0 && samplePE.getParentRelationships() != null) { - if (HibernateUtils.isInitialized(samplePE.getGeneratedFrom())) + if (HibernateUtils.isInitialized(samplePE.getParentRelationships())) { - result.setGeneratedFrom(SampleTranslator.translate(samplePE.getGeneratedFrom(), - baseIndexURL, 0, generatedFromDep - 1, false)); + for (SamplePE parent : samplePE.getParents()) + { + result.addParent(SampleTranslator.translate(parent, baseIndexURL, 0, + generatedFromDep - 1, false)); + } } } result.setInvalidation(InvalidationTranslator.translate(samplePE.getInvalidation())); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java index 7ca4263647b3405521e8f9997b89405c07d46ef5..422758df6f96377a24bcf9001b9d3c5c2f8883b9 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java @@ -152,7 +152,8 @@ public final class GenericSampleEditForm extends AbstractGenericSampleRegisterEd private void initializeGeneratedFromParent() { - Sample parentSample = originalSample.getGeneratedFrom(); + // FIXME 2010-08-05, Piotr Buczek: use parents - not generatedFrom + Sample parentSample = originalSample.getGeneratedFrom(); if (parentSample != null) { parent.updateValue(parentSample.getIdentifier()); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java index c93ecb472937612f2dbf48e5edbe554c7d63bb21..118883e09af1a2033a8cf293c356e1b0eee2ff4d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java @@ -283,10 +283,14 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme { properties.put(messageProvider.getMessage(Dict.DERIVED_SAMPLE) + "s", generated.length); } - Sample generatedFrom = sample.getGeneratedFrom(); - if (generatedFrom != null) + final List<Sample> parents = sample.getParents(); + final int parentsSize = parents.size(); + if (parentsSize == 1) { - properties.put(messageProvider.getMessage(Dict.PARENT), generatedFrom); + properties.put(messageProvider.getMessage(Dict.PARENT), parents.get(0)); + } else if (parentsSize > 1) + { + properties.put(messageProvider.getMessage(Dict.PARENTS), parentsSize); } Sample partOf = sample.getContainer(); if (partOf != null) diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/SampleRow.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/SampleRow.java index e71c10722161364fc1e6ce50eebbf8129d9bbf7a..28191328af83a9e31c94fef5bad76a81b00e332a 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/SampleRow.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/SampleRow.java @@ -126,26 +126,23 @@ public class SampleRow extends RowWithProperties public SampleRow derivedFromAncestors(final String... ancestorCodes) { - int level = 1; for (String ancestorCode : ancestorCodes) { - derivedFromAncestor(ancestorCode, level); - level++; + derivedFromAncestor(ancestorCode); } return this; } - private SampleRow derivedFromAncestor(final String ancestorCode, final int level) + private SampleRow derivedFromAncestor(final String ancestorCode) { - final String identifier = - new ParentGeneratedFromSampleColDef(level, "dummy").getIdentifier(); + final String identifier = new ParentGeneratedFromSampleColDef("dummy").getIdentifier(); withCell(identifier, ancestorCode); return this; } public SampleRow partOfContainer(final String containerCode) { - final String identifier = new ParentContainerSampleColDef(1, "dummy").getIdentifier(); + final String identifier = new ParentContainerSampleColDef("dummy").getIdentifier(); withCell(identifier, containerCode); return this; } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java index 17a045707bd5ddc289670b59afb24345c99ebf06..5590b9218f5262c9043684107cfedf2e9743619d 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java @@ -507,8 +507,9 @@ public final class SampleBOTest extends AbstractBOTest new SampleUpdatesDTO(SAMPLE_TECH_ID, null, null, Collections .<NewAttachment> emptyList(), now, null, parent.getSampleIdentifier() .toString(), null)); - assertNotNull(sample.getGeneratedFrom()); - assertEquals(parent, sample.getGeneratedFrom()); + SamplePE newParent = sample.getGeneratedFrom(); + assertNotNull(newParent); + assertEquals(parent, newParent); context.assertIsSatisfied(); }