diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java index 300965e156bd5979c71f3373a68574d9f3a3ade0..334edcd09d001e744875d27082228129afa76f98 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java @@ -419,6 +419,8 @@ public abstract class Dict public static final String DERIVED_SAMPLES_HEADING = "derived_samples_heading"; + public static final String PARENT_SAMPLES_HEADING = "parent_samples_heading"; + public static final String DERIVED_SAMPLE = "derived_sample"; public static final String EXTERNAL_DATA_HEADING = "external_data_heading"; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplayTypeIDGenerator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplayTypeIDGenerator.java index 72fd93fac9bc644d4da385686a97d60437ea7c9c..62160308b22dfd6e6ec41432e56ad387ba814136 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplayTypeIDGenerator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplayTypeIDGenerator.java @@ -77,6 +77,8 @@ public enum DisplayTypeIDGenerator implements IDisplayTypeIDGenerator DERIVED_SAMPLES_SECTION("derived-samples-section"), + PARENT_SAMPLES_SECTION("parent-samples-section"), + DATA_SET_SECTION("data-set-section"), DATA_SET_PARENTS_SECTION("data-set-parents-section"), 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 d88d29e1d9624a1f27e6cf4290bf8d59fe20a4c4..a1789e6d6bf614556c00bfed9915c9db872a5c73 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 @@ -151,14 +151,7 @@ public class SampleBrowserGrid extends { final ListSampleDisplayCriteria criteria = ListSampleDisplayCriteria.createForContainer(containerSampleId); - final String entityTypeCode = sampleType.getCode(); - - final SampleBrowserGrid browserGrid = - createGridAsComponent(viewContext, browserId, criteria, entityTypeCode, - DisplayTypeIDGenerator.SAMPLE_DETAILS_GRID); - browserGrid.updateCriteriaProviderAndRefresh(); - browserGrid.extendBottomToolbar(); - return browserGrid.asDisposableWithoutToolbar(); + return createGridForRelatedSamples(viewContext, criteria, browserId, sampleType); } public static IDisposableComponent createGridForDerivedSamples( @@ -167,8 +160,24 @@ public class SampleBrowserGrid extends { final ListSampleDisplayCriteria criteria = ListSampleDisplayCriteria.createForParent(parentSampleId); - final String entityTypeCode = sampleType.getCode(); + return createGridForRelatedSamples(viewContext, criteria, browserId, sampleType); + } + public static IDisposableComponent createGridForParentSamples( + final IViewContext<ICommonClientServiceAsync> viewContext, final TechId childSampleId, + final String browserId, final SampleType sampleType) + { + final ListSampleDisplayCriteria criteria = + ListSampleDisplayCriteria.createForChild(childSampleId); + return createGridForRelatedSamples(viewContext, criteria, browserId, sampleType); + } + + private static IDisposableComponent createGridForRelatedSamples( + final IViewContext<ICommonClientServiceAsync> viewContext, + final ListSampleDisplayCriteria criteria, final String browserId, + final SampleType sampleType) + { + final String entityTypeCode = sampleType.getCode(); final SampleBrowserGrid browserGrid = createGridAsComponent(viewContext, browserId, criteria, entityTypeCode, DisplayTypeIDGenerator.SAMPLE_DETAILS_GRID); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListSampleDisplayCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListSampleDisplayCriteria.java index c592d169933cf4b0fce5a38877e79f93058abca4..849cb3b9485266cc56fb922609f17d25ab634e0f 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListSampleDisplayCriteria.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListSampleDisplayCriteria.java @@ -46,6 +46,11 @@ public class ListSampleDisplayCriteria extends DefaultResultSetConfig<String, Sa return new ListSampleDisplayCriteria(ListSampleCriteria.createForParent(parentSampleId)); } + public static ListSampleDisplayCriteria createForChild(final TechId childSampleId) + { + return new ListSampleDisplayCriteria(ListSampleCriteria.createForChild(childSampleId)); + } + public static ListSampleDisplayCriteria createForExperiment(final TechId experimentId) { return new ListSampleDisplayCriteria(ListSampleCriteria.createForExperiment(experimentId)); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/public/generic-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/public/generic-dictionary.js index 1aaf86fda5bd7cfbd4937f132322e037b8848f85..69513aabbd05939b20573382629b1a94db7c1cc7 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/public/generic-dictionary.js +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/public/generic-dictionary.js @@ -14,6 +14,7 @@ var generic = { sample_properties_heading: "Sample Properties", part_of_heading: "Components", derived_samples_heading: "Derived Samples", + parent_samples_heading: "Parent Samples", derived_sample: "Derived Sample", external_data_heading: "Data Sets", show_only_directly_connected: "directly connected", diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java index 8bc6b3b66f5672cad90c24cd7e7d5e5a466c4ea5..f4c4e9f313d376d127c03202309c9525b7372e81 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java @@ -197,22 +197,25 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe if (criteria.isIncludeSpace()) { logAccess(sessionToken, "list_samples", - "TYPE(%s) OWNERS(space=%s) CONTAINER(%s) PARENT(%s) EXPERIMENT(%s)", criteria - .getSampleType(), criteria.getSpaceCode(), criteria + "TYPE(%s) OWNERS(space=%s) CONTAINER(%s) PARENT(%s) CHILD(%s) EXPERIMENT(%s)", + criteria.getSampleType(), criteria.getSpaceCode(), criteria .getContainerSampleId(), criteria.getParentSampleId(), criteria - .getExperimentId()); + .getChildSampleId(), criteria.getExperimentId()); } else if (criteria.isIncludeInstance()) { - logAccess(sessionToken, "list_samples", - "TYPE(%s) OWNERS(instance=%s) CONTAINER(%s) PARENT(%s) EXPERIMENT(%s)", + logAccess( + sessionToken, + "list_samples", + "TYPE(%s) OWNERS(instance=%s) CONTAINER(%s) PARENT(%s) CHILD(%s) EXPERIMENT(%s)", criteria.getSampleType(), criteria.getSampleType().getDatabaseInstance(), criteria.getContainerSampleId(), criteria.getParentSampleId(), criteria - .getExperimentId()); + .getChildSampleId(), criteria.getExperimentId()); } else { logAccess(sessionToken, "list_samples", - "TYPE(%s) CONTAINER(%s) PARENT(%s) EXPERIMENT(%s)", criteria.getSampleType(), - criteria.getContainerSampleId(), criteria.getParentSampleId(), criteria + "TYPE(%s) CONTAINER(%s) PARENT(%s) CHILD(%s) EXPERIMENT(%s)", criteria + .getSampleType(), criteria.getContainerSampleId(), criteria + .getParentSampleId(), criteria.getChildSampleId(), criteria .getExperimentId()); } return null; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java index 6ec477f15a5c35753631cf40d864df84f6baa1e6..1f1f5afcfdba16697e35becee0ea95da37a9f801 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java @@ -213,7 +213,7 @@ public interface ISampleListingQuery extends TransactionQuery, IPropertyListingQ public DataIterator<SampleRecord> getSamplesForContainer(long sampleContainerId); // - // Samples for parent + // Samples for parent/child // /** @@ -225,6 +225,15 @@ public interface ISampleListingQuery extends TransactionQuery, IPropertyListingQ public DataIterator<SampleRecord> getChildrenSamplesForParent(long relationshipId, long sampleParentId); + /** + * Returns the parent samples for the given ids of relationship and child sample. + */ + @Select(sql = SELECT_FROM_SAMPLES_S + " WHERE s.id IN " + + " (SELECT sample_id_parent FROM sample_relationships " + + " WHERE relationship_id=?{1} AND sample_id_child=?{2})", fetchSize = FETCH_SIZE) + public DataIterator<SampleRecord> getParentSamplesForChild(long relationshipId, + long sampleChildId); + // // New samples of type // 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 e9a1968868e6adc270d4339394a8df1a074987ee..83dc9a079d0475dae293a0c929d5ff0b5771ede8 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 @@ -230,6 +230,7 @@ final class SampleListingWorker retrievePrimaryBasicSamples(tryGetIteratorForExperimentSamples()); retrievePrimaryBasicSamples(tryGetIteratorForContainedSamples()); retrievePrimaryBasicSamples(tryGetIteratorForParentSamples()); + retrievePrimaryBasicSamples(tryGetIteratorForChildSamples()); retrievePrimaryBasicSamples(tryGetIteratorForNewTrackedSamples()); if (operationLog.isDebugEnabled()) { @@ -459,7 +460,7 @@ final class SampleListingWorker return query.getSamplesForContainer(containerTechId.getId()); } - private Iterable<SampleRecord> tryGetIteratorForParentSamples() + private Iterable<SampleRecord> tryGetIteratorForChildSamples() { final TechId parentTechId = criteria.getParentSampleId(); if (parentTechId == null) @@ -469,6 +470,16 @@ final class SampleListingWorker return query.getChildrenSamplesForParent(parentRelationhipTypeId, parentTechId.getId()); } + private Iterable<SampleRecord> tryGetIteratorForParentSamples() + { + final TechId childTechId = criteria.getChildSampleId(); + if (childTechId == null) + { + return null; + } + return query.getParentSamplesForChild(parentRelationhipTypeId, childTechId.getId()); + } + private Iterable<SampleRecord> tryGetIteratorForSharedSamples() { if (criteria.isIncludeInstance() == false) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ListSampleCriteriaPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ListSampleCriteriaPredicate.java index f2b4b4f298faf8e5f1066713c67dfee60f852c3c..e3a56fe9d0c9543ed9cfbaf4f7175b33434024ae 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ListSampleCriteriaPredicate.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ListSampleCriteriaPredicate.java @@ -57,28 +57,30 @@ public class ListSampleCriteriaPredicate extends AbstractGroupPredicate<ListSamp } @Override - protected - Status doEvaluation(PersonPE person, List<RoleWithIdentifier> allowedRoles, + protected Status doEvaluation(PersonPE person, List<RoleWithIdentifier> allowedRoles, ListSampleCriteria value) { Status status = Status.OK; - if (value.getExperimentId() != null && status == Status.OK) + if (value.getExperimentId() != null) { status = experimentTechIdPredicate.doEvaluation(person, allowedRoles, value .getExperimentId()); - } - if (value.getContainerSampleId() != null && status == Status.OK) + } else if (value.getContainerSampleId() != null) { status = sampleTechIdPredicate.doEvaluation(person, allowedRoles, value .getContainerSampleId()); - } - if (value.getParentSampleId() != null && status == Status.OK) + } else if (value.getParentSampleId() != null) { status = sampleTechIdPredicate.doEvaluation(person, allowedRoles, value .getParentSampleId()); + } else if (value.getChildSampleId() != null) + { + status = + sampleTechIdPredicate.doEvaluation(person, allowedRoles, value + .getChildSampleId()); } if (value.isIncludeSpace() && status == Status.OK) { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListOrSearchSampleCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListOrSearchSampleCriteria.java index 6a6befb462490b2c80a7d54f9f3eb697349d4f9f..76e20600337e7a6d350e05cd4d41b568750d3a85 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListOrSearchSampleCriteria.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListOrSearchSampleCriteria.java @@ -44,7 +44,7 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria private Collection<Long> sampleIds; private final String[] sampleCodes; - + private final String[] permIds; private boolean enrichDependentSamplesWithProperties = false; @@ -86,7 +86,7 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria { this.sampleCodes = null; this.permIds = codes; - + } else { this.sampleCodes = codes; @@ -159,6 +159,12 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria return listCriteria == null ? null : listCriteria.getParentSampleId(); } + @Override + public TechId getChildSampleId() + { + return listCriteria == null ? null : listCriteria.getChildSampleId(); + } + @Override public TechId getExperimentId() { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListSampleCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListSampleCriteria.java index c5f3982d570f78593f7f97341d1acebe1124bed3..a40364ce7ba69571c2cc5f2ec921286462bff144 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListSampleCriteria.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListSampleCriteria.java @@ -29,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; * <li>samples of particular type in a specified space and/or shared * <li>samples belonging to a container sample * <li>samples derived from a parent sample + * <li>samples connected with a child sample * <li>samples from the experiment * </ol> * @@ -58,6 +59,9 @@ public class ListSampleCriteria implements IsSerializable, Serializable private TechId parentSampleId; // --------- filter 4 fields + private TechId childSampleId; + + // --------- filter 5 fields private TechId experimentId; // ---- @@ -76,6 +80,13 @@ public class ListSampleCriteria implements IsSerializable, Serializable return criteria; } + public static ListSampleCriteria createForChild(final TechId childSampleId) + { + final ListSampleCriteria criteria = new ListSampleCriteria(); + criteria.setChildId(childSampleId); + return criteria; + } + public static ListSampleCriteria createForExperiment(final TechId experimentId) { final ListSampleCriteria criteria = new ListSampleCriteria(); @@ -103,6 +114,16 @@ public class ListSampleCriteria implements IsSerializable, Serializable this.parentSampleId = parentSampleId; } + public TechId getChildSampleId() + { + return childSampleId; + } + + private final void setChildId(final TechId childSampleId) + { + this.childSampleId = childSampleId; + } + public SampleType getSampleType() { return sampleType; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/DerivedSamplesSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/DerivedSamplesSection.java index bc589b4ff0283cca194706e8d712116314574e5d..dec4db41f9afe6627f351a1e05d54dba0a029f2c 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/DerivedSamplesSection.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/DerivedSamplesSection.java @@ -46,9 +46,9 @@ public class DerivedSamplesSection extends DisposableSectionPanel } // @Private - static String createGridId(TechId containerId) + static String createGridId(TechId parentId) { - return SampleBrowserGrid.createGridId(createBrowserId(containerId)); + return SampleBrowserGrid.createGridId(createBrowserId(parentId)); } private static String createBrowserId(TechId parentId) 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 118883e09af1a2033a8cf293c356e1b0eee2ff4d..dac17af93c1b30af6be0a2cc0a0696e5cd4da32e 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 @@ -110,6 +110,8 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme private DisposableSectionPanel derivedSamplesSection; + private DisposableSectionPanel parentSamplesSection; + private DisposableSectionPanel dataSetBrowser; private PropertyGrid propertyGrid; @@ -196,7 +198,7 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme { container.addPanel(panel); } - // Container samples + // Contained samples containerSamplesSection = new ContainerSamplesSection(viewContext, generator); containerSamplesSection.setDisplayID(DisplayTypeIDGenerator.CONTAINER_SAMPLES_SECTION, displayIdSuffix); @@ -206,6 +208,11 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme derivedSamplesSection.setDisplayID(DisplayTypeIDGenerator.DERIVED_SAMPLES_SECTION, displayIdSuffix); container.addPanel(derivedSamplesSection); + // Parent samples + parentSamplesSection = new ParentSamplesSection(viewContext, generator); + parentSamplesSection.setDisplayID(DisplayTypeIDGenerator.PARENT_SAMPLES_SECTION, + displayIdSuffix); + container.addPanel(parentSamplesSection); // Data Sets CheckBox showOnlyDirectlyConnectedCheckBox = createShowOnlyDirectlyConnectedCheckBox(); dataSetBrowser = diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesSection.java new file mode 100644 index 0000000000000000000000000000000000000000..503ce7c013ba9346d8c786567a14cdb40c7e5c8d --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesSection.java @@ -0,0 +1,67 @@ +/* + * Copyright 2008 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample; + +import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.SingleSectionPanel; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid; +import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; + +/** + * {@link SingleSectionPanel} containing samples with specified child sample. + * + * @author Piotr Buczek + */ +public class ParentSamplesSection extends DisposableSectionPanel +{ + private static final String PREFIX = "parent-samples-section_"; + + public static final String ID_PREFIX = GenericConstants.ID_PREFIX + PREFIX; + + private final Sample child; + + public ParentSamplesSection(final IViewContext<?> viewContext, final Sample child) + { + super(viewContext.getMessage(Dict.PARENT_SAMPLES_HEADING), viewContext); + this.child = child; + } + + // @Private + static String createGridId(TechId childId) + { + return SampleBrowserGrid.createGridId(createBrowserId(childId)); + } + + private static String createBrowserId(TechId childId) + { + return ID_PREFIX + childId + "-browser"; + } + + @Override + protected IDisposableComponent createDisposableContent() + { + TechId childId = TechId.create(child); + return SampleBrowserGrid.createGridForParentSamples(viewContext.getCommonViewContext(), + childId, createBrowserId(childId), child.getSampleType()); + } + +}