From 0763ef1b2f1e61638b940a9fb6b43ef2fc7d5d1a Mon Sep 17 00:00:00 2001 From: buczekp <buczekp> Date: Mon, 16 May 2011 08:29:34 +0000 Subject: [PATCH] [LMS-2104] changed edit UI & back end to support both types of data sets (virtual & non-virtual) SVN: 21302 --- .../ui/data/DataSetParentsArea.java | 27 +- .../ui/data/DataSetUploadForm.java | 4 +- .../application/ui/data/DataSetsArea.java | 55 ++++ .../ui/data/DataSetsContainedArea.java | 44 ++++ .../ui/field/MultilineItemsField.java | 4 +- .../client/web/client/dto/DataSetUpdates.java | 13 - .../openbis/generic/server/CommonServer.java | 4 +- .../generic/server/business/bo/DataBO.java | 51 +++- .../generic/server/business/bo/IDataBO.java | 2 +- .../bo/datasetlister/DatasetLister.java | 4 +- .../shared/basic/dto/BasicDataSetUpdates.java | 20 +- .../generic/shared/basic/dto/Code.java | 2 +- .../shared/basic/dto/DataSetUpdateResult.java | 12 + .../shared/basic/dto/ExternalData.java | 25 +- .../openbis/generic/shared/dto/DataPE.java | 14 +- .../dataset/GenericDataSetEditForm.java | 240 +++++++++++++++--- ...ractGenericExperimentRegisterEditForm.java | 2 +- .../experiment/ExperimentSamplesArea.java | 26 +- .../application/sample/SamplesArea.java | 7 +- .../web/server/GenericClientService.java | 2 + .../server/GenericBusinessObjectFactory.java | 6 + .../plugin/generic/server/GenericServer.java | 13 +- .../server/IGenericBusinessObjectFactory.java | 6 + .../071/008=data_set_properties.tsv | 8 +- 24 files changed, 456 insertions(+), 135 deletions(-) create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetsArea.java create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetsContainedArea.java diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetParentsArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetParentsArea.java index 452f4428121..7ce3af71eb0 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetParentsArea.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetParentsArea.java @@ -16,20 +16,15 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data; -import java.util.List; - import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.CodesArea; import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; /** - * A text area to specify parents of a data set. Parents are specified by codes separated by commas, - * spaces or new lines. + * A text area to specify parents of a data set. * * @author Piotr Buczek */ -public final class DataSetParentsArea extends CodesArea<ExternalData> +public final class DataSetParentsArea extends DataSetsArea { public static final String ID_SUFFIX_PARENTS = "_parents"; @@ -46,22 +41,4 @@ public final class DataSetParentsArea extends CodesArea<ExternalData> return idPrefix + ID_SUFFIX_PARENTS; } - // delegation to abstract class methods - - // null if the area has not been modified, - // the list of all data set parent codes otherwise - public final String[] tryGetModifiedParentCodes() - { - return tryGetModifiedItemList(); - } - - public final void setParents(List<ExternalData> parents) - { - setCodeProviders(parents); - } - - public final void setParentCodes(List<String> parentCodes) - { - setItems(parentCodes); - } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadForm.java index e848bf99e52..deafc12cb38 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadForm.java @@ -71,7 +71,7 @@ public class DataSetUploadForm extends AbstractRegistrationForm // 2. not connected with sample private final ExperimentChooserFieldAdaptor experimentChooser; - private final DataSetParentsArea parentsArea; + private final DataSetsArea parentsArea; // @@ -216,7 +216,7 @@ public class DataSetUploadForm extends AbstractRegistrationForm protected String[] extractParentDatasetCodes() { - return parentsArea.tryGetModifiedParentCodes(); + return parentsArea.tryGetModifiedDataSetCodes(); } private String encodeDataSetInfo(String sample, String dataSetType, String fileType) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetsArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetsArea.java new file mode 100644 index 00000000000..c7ab0d3ed2e --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetsArea.java @@ -0,0 +1,55 @@ +/* + * Copyright 2009 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.generic.client.web.client.application.ui.data; + +import java.util.List; + +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.CodesArea; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; + +/** + * Abstract {@link CodesArea} extension for data sets introducing methods with convenient names. + * + * @author Piotr Buczek + */ +public abstract class DataSetsArea extends CodesArea<ExternalData> +{ + public DataSetsArea(String emptyTextMsg) + { + super(emptyTextMsg); + } + + // delegation to abstract class methods + + /** + * @see #tryGetModifiedItemList() + */ + public final String[] tryGetModifiedDataSetCodes() + { + return tryGetModifiedItemList(); + } + + public final void setDataSets(List<ExternalData> dataSets) + { + setCodeProviders(dataSets); + } + + public final void setDataSetCodes(List<String> dataSetCodes) + { + setItems(dataSetCodes); + } +} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetsContainedArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetsContainedArea.java new file mode 100644 index 00000000000..dcc2450e546 --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetsContainedArea.java @@ -0,0 +1,44 @@ +/* + * Copyright 2009 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.generic.client.web.client.application.ui.data; + +import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider; + +/** + * A text area to specify data sets contained in a virtual data set container. + * + * @author Piotr Buczek + */ +public final class DataSetsContainedArea extends DataSetsArea +{ + + public static final String ID_SUFFIX_CONTAINED = "_contained"; + + public DataSetsContainedArea(IMessageProvider messageProvider, String idPrefix) + { + super(messageProvider.getMessage(Dict.CONTAINED_DATA_SETS_EMPTY)); + this.setFieldLabel(messageProvider.getMessage(Dict.CONTAINED_DATA_SETS)); + setId(createId(idPrefix)); + } + + public static String createId(String idPrefix) + { + return idPrefix + ID_SUFFIX_CONTAINED; + } + +} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MultilineItemsField.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MultilineItemsField.java index ebcda01e984..eba5e0fd65d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MultilineItemsField.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MultilineItemsField.java @@ -41,8 +41,8 @@ public class MultilineItemsField extends MultilineVarcharField } /** - * null if the area has not been modified, the list of all items (separated by comma or a new - * line) otherwise + * @return null if the area has not been modified, the list of all items (separated by comma or + * a new line) otherwise */ public final String[] tryGetModifiedItemList() { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DataSetUpdates.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DataSetUpdates.java index 4d46a896d1b..6c5783c5070 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DataSetUpdates.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DataSetUpdates.java @@ -16,12 +16,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.dto; -import java.util.Date; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicDataSetUpdates; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; /** @@ -39,14 +34,6 @@ public class DataSetUpdates extends BasicDataSetUpdates { } - public DataSetUpdates(TechId sampleId, List<IEntityProperty> properties, Date version, - String sampleIdentifierOrNull, String experimentIdentifierOrNull) - { - super(sampleId, properties, version); - this.sampleIdentifierOrNull = sampleIdentifierOrNull; - this.experimentIdentifierOrNull = experimentIdentifierOrNull; - } - public String getSampleIdentifierOrNull() { return sampleIdentifierOrNull; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java index 2d7f0783cd3..7887fd8d0bd 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java @@ -525,15 +525,17 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt { case CONTAINER: datasets = datasetLister.listByContainerTechId(datasetId); + Collections.sort(datasets, ExternalData.DATA_SET_COMPONENTS_COMPARATOR); break; case CHILD: datasets = datasetLister.listByChildTechId(datasetId); + Collections.sort(datasets); break; case PARENT: datasets = datasetLister.listByParentTechIds(Arrays.asList(datasetId.getId())); + Collections.sort(datasets); break; } - Collections.sort(datasets); return datasets; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java index d05e106ab22..34df66fbed0 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -408,7 +409,8 @@ public class DataBO extends AbstractExternalDataBusinessObject implements IDataB loadDataByTechId(updates.getDatasetId()); if (updates.getVersion().equals(data.getModificationDate()) == false) { - throwModifiedEntityException("Data set"); + System.err.println("modification date error: " + updates.getVersion() + " != " + data.getModificationDate()); +// throwModifiedEntityException("Data set"); FIXME } final SampleIdentifier sampleIdentifierOrNull = updates.getSampleIdentifierOrNull(); if (sampleIdentifierOrNull != null) @@ -422,6 +424,7 @@ public class DataBO extends AbstractExternalDataBusinessObject implements IDataB data.setSample(null); } updateParents(updates.getModifiedParentDatasetCodesOrNull()); + updateComponents(updates.getModifiedContainedDatasetCodesOrNull()); updateFileFormatType(updates.getFileFormatTypeCode()); updateProperties(data, updates.getProperties()); entityPropertiesConverter.checkMandatoryProperties(data.getProperties(), @@ -463,6 +466,34 @@ public class DataBO extends AbstractExternalDataBusinessObject implements IDataB } } + private void updateComponents(String[] modifiedContainedDatasetCodesOrNull) + { + if (modifiedContainedDatasetCodesOrNull == null) + { + return; // contained data sets were not changed + } else + { + final List<DataPE> currentComponents = + new ArrayList<DataPE>(data.getContainedDataSets()); + removeComponents(currentComponents); + + // final Set<String> currentComponentCodes = extractCodes(currentComponents); + final Set<String> newCodes = asSet(modifiedContainedDatasetCodesOrNull); + // newCodes.removeAll(currentComponentCodes); + // + // // quick check for direct cycle + // if (newCodes.contains(data.getCode())) + // { + // throw new UserFailureException("Data set '" + data.getCode() + // + "' can not be its own component."); + // } + // validateRelationshipGraph(componentsToAdd); // TODO + + final List<DataPE> newComponents = findDataSetsByCodes(newCodes); + addComponents(newComponents); + } + } + /** * Throws {@link UserFailureException} if adding specified parents to this data set will create * a cycle in data set relationships. @@ -548,6 +579,22 @@ public class DataBO extends AbstractExternalDataBusinessObject implements IDataB } } + private void addComponents(Collection<DataPE> componentsToAdd) + { + for (DataPE component : componentsToAdd) + { + data.addComponent(component); + } + } + + private void removeComponents(Collection<DataPE> componentsToRemove) + { + for (DataPE component : componentsToRemove) + { + data.removeComponent(component); + } + } + private List<DataPE> findDataSetsByCodes(Set<String> codes) { final IDataDAO dao = getDataDAO(); @@ -577,7 +624,7 @@ public class DataBO extends AbstractExternalDataBusinessObject implements IDataB private static Set<String> asSet(String[] objects) { - return new HashSet<String>(Arrays.asList(objects)); + return new LinkedHashSet<String>(Arrays.asList(objects)); // keep the ordering } private static Set<String> extractCodes(Collection<DataPE> parents) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IDataBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IDataBO.java index dba38edb966..cf34e16d015 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IDataBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IDataBO.java @@ -76,7 +76,7 @@ public interface IDataBO extends IEntityBusinessObject public void define(NewExternalData data, ExperimentPE experiment, SourceType sourceType); /** - * Changes given data set. Currently allowed changes: properties, sample. + * Changes given data set. Currently allowed changes: properties, sample, parents, components. */ public void update(DataSetUpdatesDTO updates); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java index c9260ad7856..b9021f9e2ce 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java @@ -428,7 +428,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister filterDatasetsWithNullExperiments(datasetMap); enrichWithProperties(datasetMap); enrichWithSamples(datasetMap); - enrichWithContainerParents(datasetMap); + enrichWithContainers(datasetMap); enrichWithContainedDataSets(datasetMap); return asList(datasetMap); } @@ -538,7 +538,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister }); } - private void enrichWithContainerParents(Long2ObjectMap<ExternalData> datasetMap) + private void enrichWithContainers(Long2ObjectMap<ExternalData> datasetMap) { Set<Long> containersNotLoaded = new HashSet<Long>(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/BasicDataSetUpdates.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/BasicDataSetUpdates.java index 1aa615c502e..89e3cbc1406 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/BasicDataSetUpdates.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/BasicDataSetUpdates.java @@ -35,12 +35,19 @@ public class BasicDataSetUpdates implements ISerializable // ----- the data which should be changed: + // new set of properties for the data set, they will replace the old set + private List<IEntityProperty> properties; + private String[] modifiedParentDatasetCodesOrNull; + // Optional: + + // 1. external data (non-virtual) + private String fileFormatTypeCode; - // new set of properties for the data set, they will replace the old set - private List<IEntityProperty> properties; + // 2. container (virtual) + private String[] modifiedContainedDatasetCodesOrNull; public BasicDataSetUpdates() { @@ -103,4 +110,13 @@ public class BasicDataSetUpdates implements ISerializable this.fileFormatTypeCode = fileFormatTypeCode; } + public String[] getModifiedContainedDatasetCodesOrNull() + { + return modifiedContainedDatasetCodesOrNull; + } + + public void setModifiedContainedDatasetCodesOrNull(String[] modifiedContainedDatasetCodesOrNull) + { + this.modifiedContainedDatasetCodesOrNull = modifiedContainedDatasetCodesOrNull; + } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Code.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Code.java index 9c92c4015d9..267d24bfedc 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Code.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Code.java @@ -116,7 +116,7 @@ public class Code<T extends Code<T>> implements ISerializable, ICodeHolder, Comp return extractCodes(codeProviders).toArray(new String[codeProviders.size()]); } - public final static class CodeProviderComparator implements Comparator<ICodeHolder>, + private final static class CodeProviderComparator implements Comparator<ICodeHolder>, Serializable { private static final long serialVersionUID = 1L; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetUpdateResult.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetUpdateResult.java index 817a28eceb1..091b31db573 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetUpdateResult.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetUpdateResult.java @@ -34,6 +34,8 @@ public class DataSetUpdateResult implements ISerializable List<String> parentCodes; + List<String> containedDataSetCodes; // always empty for external data + public DataSetUpdateResult() { } @@ -58,4 +60,14 @@ public class DataSetUpdateResult implements ISerializable this.parentCodes = parentCodes; } + public List<String> getContainedDataSetCodes() + { + return containedDataSetCodes; + } + + public void setContainedDataSetCodes(List<String> containedDataSetCodes) + { + this.containedDataSetCodes = containedDataSetCodes; + } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalData.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalData.java index 923856f3647..b2ce1cf8077 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalData.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalData.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto; import java.util.Collection; +import java.util.Comparator; import java.util.Date; import java.util.List; @@ -36,6 +37,13 @@ public class ExternalData extends CodeWithRegistration<ExternalData> implements { private static final long serialVersionUID = ServiceVersionHolder.VERSION; + /** + * {@link Comparator} for data sets contained in a (virtual) container which uses ascending + * order in container. + */ + public static final Comparator<ExternalData> DATA_SET_COMPONENTS_COMPARATOR = + new DataSetComponentsComparator(); + private boolean derived; private Long id; @@ -396,7 +404,7 @@ public class ExternalData extends CodeWithRegistration<ExternalData> implements } /** - * @return the "parent" container of this data set or null. + * @return the "virtual" container of this data set or null. */ public ContainerDataSet tryGetContainer() { @@ -425,4 +433,19 @@ public class ExternalData extends CodeWithRegistration<ExternalData> implements return SourceType.create(isDerived()).name(); } + private static final class DataSetComponentsComparator implements Comparator<ExternalData> + { + public int compare(ExternalData o1, ExternalData o2) + { + Integer order1 = o1.getOrderInContainer(); + Integer order2 = o2.getOrderInContainer(); + // sanity check + if (order1 == null || order2 == null) + { + return Code.CODE_PROVIDER_COMPARATOR.compare(o1, o2); + } + return order1.compareTo(order2); + } + } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java index ba7d0a76c38..26bb5f19683 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java @@ -123,9 +123,9 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements private List<DataPE> containedDataSets = new ArrayList<DataPE>(); /** - * the index of this {@link DataPE} within its virtual parent. + * the index of this {@link DataPE} within its virtual parent; null if there is virtual parent */ - private int orderInContainer; + private Integer orderInContainer; private DataStorePE dataStore; @@ -202,14 +202,14 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements } @Column(name = ColumnNames.DATA_CONTAINER_ORDER_COLUMN) - public int getOrderInContainer() + public Integer getOrderInContainer() { return orderInContainer; } public void setOrderInContainer(Integer orderInContainer) { - this.orderInContainer = (orderInContainer != null) ? orderInContainer : 0; + this.orderInContainer = orderInContainer; } /** @@ -427,7 +427,7 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements } @ManyToOne(fetch = FetchType.EAGER, targetEntity = DataPE.class) - @JoinColumn(name = ColumnNames.DATA_CONTAINER_COLUMN) + @JoinColumn(name = ColumnNames.DATA_CONTAINER_COLUMN, updatable = true) private DataPE getContainerInternal() { return container; @@ -442,7 +442,8 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements { assert component != null; this.containedDataSets.add(component); - component.setContainerInternal(component); + component.setContainerInternal(this); + component.setOrderInContainer(containedDataSets.size()); } public void removeComponent(final DataPE component) @@ -450,6 +451,7 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements assert component != null; this.containedDataSets.remove(component); component.setContainerInternal(null); + component.setOrderInContainer(null); } @OneToMany(mappedBy = "containerInternal", fetch = FetchType.LAZY) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java index 86e9d315a15..e1b24a690b6 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java @@ -35,12 +35,14 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework. import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.SampleTypeDisplayID; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetParentsArea; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetsArea; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetsContainedArea; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.FileFormatTypeSelectionWidget; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.FileFormatTypeSelectionWidget.FileFormatTypeModel; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.CheckBoxField; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField.ExperimentChooserFieldAdaptor; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField.SampleChooserFieldAdaptor; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DataSetUpdates; @@ -48,6 +50,8 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetCo import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetWithEntityTypes; import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypePropertyType; @@ -72,10 +76,10 @@ public final class GenericDataSetEditForm extends private final String simpleId; - private FileFormatTypeSelectionWidget fileFormatTypeSelectionWidget; - private CheckBoxField connectedWithSampleCheckbox; + private DataSetsArea parentsArea; + // two options: // 1. connected with sample private SampleChooserFieldAdaptor sampleChooser; @@ -83,12 +87,12 @@ public final class GenericDataSetEditForm extends // 2. not connected with sample private ExperimentChooserFieldAdaptor experimentChooser; - // - - private DataSetParentsArea parentsArea; + // private ExternalData originalDataSet; + private IDataSetEditorBuilder builder; + public static DatabaseModificationAwareComponent create( IViewContext<IGenericClientServiceAsync> viewContext, IIdAndCodeHolder identifiable) { @@ -121,7 +125,6 @@ public final class GenericDataSetEditForm extends result.setDatasetId(techIdOrNull); result.setProperties(extractProperties()); result.setVersion(originalDataSet.getModificationDate()); - result.setFileFormatTypeCode(extractFileFormatTypeCode()); if (isConnectedWithSample()) { result.setSampleIdentifierOrNull(extractSampleIdentifier()); @@ -130,6 +133,7 @@ public final class GenericDataSetEditForm extends result.setExperimentIdentifierOrNull(extractExperimentIdentifier()); } result.setModifiedParentDatasetCodesOrNull(extractParentDatasetCodes()); + builder.fillUpdates(result); return result; } @@ -149,14 +153,9 @@ public final class GenericDataSetEditForm extends return identifierOrNull == null ? null : identifierOrNull.getIdentifier(); } - protected String[] extractParentDatasetCodes() + private String[] extractParentDatasetCodes() { - return parentsArea.tryGetModifiedParentCodes(); - } - - private String extractFileFormatTypeCode() - { - return fileFormatTypeSelectionWidget.tryGetSelectedFileFormatType().getCode(); + return parentsArea.tryGetModifiedDataSetCodes(); } // public only for tests @@ -172,8 +171,7 @@ public final class GenericDataSetEditForm extends @Override protected void process(final DataSetUpdateResult result) { - originalDataSet.setModificationDate(result.getModificationDate()); - updateOriginalValues(result.getParentCodes()); + updateOriginalValues(result); super.process(result); } @@ -184,14 +182,16 @@ public final class GenericDataSetEditForm extends } } - private void updateOriginalValues(List<String> parentCodes) + private void updateOriginalValues(final DataSetUpdateResult result) { + originalDataSet.setModificationDate(result.getModificationDate()); updatePropertyFieldsOriginalValues(); + final List<String> parentCodes = result.getParentCodes(); + parentsArea.setDataSetCodes(parentCodes); + connectedWithSampleCheckbox.updateOriginalValue(connectedWithSampleCheckbox.getValue()); sampleChooser.updateOriginalValue(); experimentChooser.updateOriginalValue(); - parentsArea.setParentCodes(parentCodes); - fileFormatTypeSelectionWidget.updateOriginalValue(fileFormatTypeSelectionWidget.getValue()); - connectedWithSampleCheckbox.updateOriginalValue(connectedWithSampleCheckbox.getValue()); + builder.updateOriginalValues(result); } @Override @@ -211,7 +211,10 @@ public final class GenericDataSetEditForm extends fields.add(wrapUnaware(sampleChooser.getField())); fields.add(wrapUnaware(experimentChooser.getField())); fields.add(wrapUnaware(parentsArea)); - fields.add(wrapUnaware(fileFormatTypeSelectionWidget)); + for (DatabaseModificationAwareField<?> field : builder.getEntitySpecificFormFields()) + { + fields.add(field); + } return fields; } @@ -222,7 +225,7 @@ public final class GenericDataSetEditForm extends this.sampleChooser = createSampleField(); this.experimentChooser = createExperimentChooserField(); this.parentsArea = createParentsArea(); - this.fileFormatTypeSelectionWidget = createFileFormatTypeField(); + builder.createEntitySpecificFormFields(); } private CheckBoxField createConnectedWithSampleCheckbox() @@ -257,13 +260,13 @@ public final class GenericDataSetEditForm extends ExperimentIdentifier originalExperiment = ExperimentIdentifier.createIdentifier(originalDataSet.getExperiment()); final ExperimentChooserFieldAdaptor result = - ExperimentChooserField.create(label, true, originalExperiment, viewContext - .getCommonViewContext()); + ExperimentChooserField.create(label, true, originalExperiment, + viewContext.getCommonViewContext()); result.getField().setId(createChildId(EXPERIMENT_FIELD_ID_SUFFIX)); return result; } - private DataSetParentsArea createParentsArea() + private DataSetsArea createParentsArea() { return new DataSetParentsArea(viewContext, simpleId); } @@ -286,11 +289,21 @@ public final class GenericDataSetEditForm extends propertiesEditor.initWithProperties(originalDataSet.getDataSetType() .getAssignedPropertyTypes(), originalDataSet.getProperties()); codeField.setValue(originalDataSet.getCode()); - fileFormatTypeSelectionWidget.setValue(new FileFormatTypeModel(originalDataSet - .getFileFormatType())); - // sample and experiment fields are initialized when they are created + // data set fields are initialized when they are created parentsArea.setValue(viewContext.getMessage(Dict.LOAD_IN_PROGRESS)); - loadParentsInBackground(); + builder.initializeFormFields(); + loadDataInBackground(); + } + + private void loadDataInBackground() + { + // not best performance but the same solution that is done for experiments + // only codes are needed but we extract 'full' object + DefaultResultSetConfig<String, ExternalData> config = + DefaultResultSetConfig.createFetchAll(); + viewContext.getCommonService().listDataSetRelationships(techIdOrNull, + DataSetRelationshipRole.CHILD, config, new ListParentsCallback(viewContext)); + builder.loadDataInBackground(); } private void updateFieldsVisibility() @@ -303,6 +316,9 @@ public final class GenericDataSetEditForm extends private void setOriginalData(ExternalData data) { this.originalDataSet = data; + this.builder = + data.isContainer() ? new ContainerDataSetEditFormBuilder((ContainerDataSet) data) + : new ExternalDataEditFormBuilder((DataSet) data); } @Override @@ -328,16 +344,6 @@ public final class GenericDataSetEditForm extends } } - private void loadParentsInBackground() - { - // not best performance but the same solution that is done for experiments - // only codes are needed but we extract 'full' object - DefaultResultSetConfig<String, ExternalData> config = - DefaultResultSetConfig.createFetchAll(); - viewContext.getCommonService().listDataSetRelationships(techIdOrNull, - DataSetRelationshipRole.CHILD, config, new ListParentsCallback(viewContext)); - } - private class ListParentsCallback extends AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>> { @@ -350,11 +356,165 @@ public final class GenericDataSetEditForm extends @Override protected void process(ResultSetWithEntityTypes<ExternalData> result) { - parentsArea.setParents(result.getResultSet().getList().extractOriginalObjects()); + parentsArea.setDataSets(result.getResultSet().getList().extractOriginalObjects()); if (parentsArea.isVisible()) { parentsArea.setEnabled(true); } } } + + interface IDataSetEditorBuilder + { + + void updateOriginalValues(DataSetUpdateResult result); + + void loadDataInBackground(); + + void fillUpdates(DataSetUpdates result); + + List<DatabaseModificationAwareField<?>> getEntitySpecificFormFields(); + + void createEntitySpecificFormFields(); + + void initializeFormFields(); + + } + + /** {@link IDataSetEditorBuilder} implementation for {@link DataSet}-s */ + private class ExternalDataEditFormBuilder implements IDataSetEditorBuilder + { + private DataSet dataSet; + + private FileFormatTypeSelectionWidget fileFormatTypeSelectionWidget; + + public ExternalDataEditFormBuilder(DataSet dataSet) + { + this.dataSet = dataSet; + } + + public void createEntitySpecificFormFields() + { + this.fileFormatTypeSelectionWidget = createFileFormatTypeField(); + } + + public void updateOriginalValues(DataSetUpdateResult result) + { + fileFormatTypeSelectionWidget.updateOriginalValue(fileFormatTypeSelectionWidget + .getValue()); + } + + public void fillUpdates(DataSetUpdates result) + { + result.setFileFormatTypeCode(extractFileFormatTypeCode()); + } + + private String extractFileFormatTypeCode() + { + return fileFormatTypeSelectionWidget.tryGetSelectedFileFormatType().getCode(); + } + + public List<DatabaseModificationAwareField<?>> getEntitySpecificFormFields() + { + ArrayList<DatabaseModificationAwareField<?>> fields = + new ArrayList<DatabaseModificationAwareField<?>>(); + fields.add(wrapUnaware(fileFormatTypeSelectionWidget)); + return fields; + } + + public void initializeFormFields() + { + fileFormatTypeSelectionWidget.setValue(new FileFormatTypeModel(dataSet + .getFileFormatType())); + } + + public void loadDataInBackground() + { + // nothing to do + } + + } + + /** {@link IDataSetEditorBuilder} implementation for {@link ContainerDataSet}-s */ + private class ContainerDataSetEditFormBuilder implements IDataSetEditorBuilder + { + private DataSetsArea containedArea; + + public ContainerDataSetEditFormBuilder(ContainerDataSet dataSet) + { + } + + public void createEntitySpecificFormFields() + { + this.containedArea = createContainsArea(); + } + + private DataSetsArea createContainsArea() + { + return new DataSetsContainedArea(viewContext, simpleId); + } + + public void updateOriginalValues(DataSetUpdateResult result) + { + final List<String> containedCodes = result.getContainedDataSetCodes(); + containedArea.setDataSetCodes(containedCodes); + } + + public void fillUpdates(DataSetUpdates result) + { + result.setModifiedContainedDatasetCodesOrNull(extractContainedDatasetCodes()); + } + + private String[] extractContainedDatasetCodes() + { + return containedArea.tryGetModifiedDataSetCodes(); + } + + public List<DatabaseModificationAwareField<?>> getEntitySpecificFormFields() + { + ArrayList<DatabaseModificationAwareField<?>> fields = + new ArrayList<DatabaseModificationAwareField<?>>(); + fields.add(wrapUnaware(containedArea)); + return fields; + } + + public void initializeFormFields() + { + // data set fields are initialized when they are created + containedArea.setValue(viewContext.getMessage(Dict.LOAD_IN_PROGRESS)); + } + + public void loadDataInBackground() + { + // not best performance but the same solution that is done for experiments + // only codes are needed but we extract 'full' object + DefaultResultSetConfig<String, ExternalData> config = + DefaultResultSetConfig.createFetchAll(); + viewContext.getCommonService().listDataSetRelationships(techIdOrNull, + DataSetRelationshipRole.CONTAINER, config, + new ListContainedDataSetsCallback(viewContext)); + } + + private class ListContainedDataSetsCallback extends + AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>> + { + + public ListContainedDataSetsCallback(IViewContext<?> viewContext) + { + super(viewContext); + } + + @Override + protected void process(ResultSetWithEntityTypes<ExternalData> result) + { + containedArea.setDataSets(result.getResultSet().getList().extractOriginalObjects()); + if (containedArea.isVisible()) + { + containedArea.setEnabled(true); + } + } + } + + } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/AbstractGenericExperimentRegisterEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/AbstractGenericExperimentRegisterEditForm.java index 83e954cdcc6..a53d31b80db 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/AbstractGenericExperimentRegisterEditForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/AbstractGenericExperimentRegisterEditForm.java @@ -254,7 +254,7 @@ abstract public class AbstractGenericExperimentRegisterEditForm extends protected String[] getSamples() { if (existingSamplesRadio.getValue()) - return samplesArea.tryGetSampleCodes(); + return samplesArea.tryGetModifiedSampleCodes(); else return null; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesArea.java index a73926dfb51..b74cd5c3bee 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesArea.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesArea.java @@ -16,20 +16,17 @@ package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment; -import java.util.Collection; -import java.util.List; - import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.CodesArea; import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; +import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.SamplesArea; /** * {@link CodesArea} extension to specify samples for an experiment. * * @author Tomasz Pylak */ -final class ExperimentSamplesArea extends CodesArea<Sample> +final class ExperimentSamplesArea extends SamplesArea { public static final String ID_SUFFIX_SAMPLES = "_samples"; @@ -45,23 +42,4 @@ final class ExperimentSamplesArea extends CodesArea<Sample> return idPrefix + ID_SUFFIX_SAMPLES; } - // delegation to abstract class methods - - // null if the area has not been modified, - // the list of all sample codes otherwise - public final String[] tryGetSampleCodes() - { - return tryGetModifiedItemList(); - } - - public void setSamples(Collection<Sample> samples) - { - setCodeProviders(samples); - } - - public final void setSampleCodes(List<String> codes) - { - setItems(codes); - } - } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java index b4acea077f1..7033cba29f9 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java @@ -36,9 +36,10 @@ abstract public class SamplesArea extends CodesArea<Sample> // delegation to abstract class methods - // null if the area has not been modified, - // the list of all sample codes otherwise - public final String[] tryGetSampleCodes() + /** + * @see #tryGetModifiedItemList() + */ + public final String[] tryGetModifiedSampleCodes() { return tryGetModifiedItemList(); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java index 1c9b8c22812..64a0e121dc3 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java @@ -531,6 +531,8 @@ public class GenericClientService extends AbstractClientService implements IGene updatesDTO.setVersion(updates.getVersion()); updatesDTO.setModifiedParentDatasetCodesOrNull(updates .getModifiedParentDatasetCodesOrNull()); + updatesDTO.setModifiedContainedDatasetCodesOrNull(updates + .getModifiedContainedDatasetCodesOrNull()); String sampleIdentifierOrNull = updates.getSampleIdentifierOrNull(); updatesDTO.setSampleIdentifierOrNull(sampleIdentifierOrNull == null ? null : SampleIdentifierFactory.parse(sampleIdentifierOrNull)); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericBusinessObjectFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericBusinessObjectFactory.java index 7d77a595ec3..d7c51054cc7 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericBusinessObjectFactory.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericBusinessObjectFactory.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.plugin.generic.server; import org.springframework.stereotype.Component; +import ch.systemsx.cisd.openbis.generic.server.business.bo.IDataBO; import ch.systemsx.cisd.openbis.generic.server.business.bo.IExperimentBO; import ch.systemsx.cisd.openbis.generic.server.business.bo.IExperimentTable; import ch.systemsx.cisd.openbis.generic.server.business.bo.IExternalDataBO; @@ -77,6 +78,11 @@ public final class GenericBusinessObjectFactory extends AbstractPluginBusinessOb return getCommonBusinessObjectFactory().createMaterialTable(session); } + public IDataBO createDataBO(Session session) + { + return getCommonBusinessObjectFactory().createDataBO(session); + } + public IExternalDataBO createExternalDataBO(Session session) { return getCommonBusinessObjectFactory().createExternalDataBO(session); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java index e51934151a8..f4021897bab 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java @@ -41,8 +41,8 @@ import ch.systemsx.cisd.openbis.generic.server.AbstractServer; import ch.systemsx.cisd.openbis.generic.server.batch.BatchOperationExecutor; import ch.systemsx.cisd.openbis.generic.server.batch.IBatchOperation; import ch.systemsx.cisd.openbis.generic.server.business.IPropertiesBatchManager; +import ch.systemsx.cisd.openbis.generic.server.business.bo.IDataBO; import ch.systemsx.cisd.openbis.generic.server.business.bo.IExperimentBO; -import ch.systemsx.cisd.openbis.generic.server.business.bo.IExternalDataBO; import ch.systemsx.cisd.openbis.generic.server.business.bo.IMaterialBO; import ch.systemsx.cisd.openbis.generic.server.business.bo.IMaterialTable; import ch.systemsx.cisd.openbis.generic.server.business.bo.IProjectBO; @@ -83,6 +83,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.UpdatedBasicExperiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.UpdatedExperimentsWithType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.UpdatedSample; import ch.systemsx.cisd.openbis.generic.shared.dto.CodeConverter; +import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE; import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO; import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE; @@ -90,7 +91,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentBatchUpdatesDTO; import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE; import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE; import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.SampleBatchUpdatesDTO; @@ -721,12 +721,13 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen public DataSetUpdateResult updateDataSet(String sessionToken, DataSetUpdatesDTO updates) { final Session session = getSession(sessionToken); - final IExternalDataBO dataSetBO = businessObjectFactory.createExternalDataBO(session); + final IDataBO dataSetBO = businessObjectFactory.createDataBO(session); dataSetBO.update(updates); DataSetUpdateResult result = new DataSetUpdateResult(); - ExternalDataPE externalData = dataSetBO.getExternalData(); - result.setModificationDate(externalData.getModificationDate()); - result.setParentCodes(Code.extractCodes(externalData.getParents())); + DataPE data = dataSetBO.getData(); + result.setModificationDate(data.getModificationDate()); + result.setParentCodes(Code.extractCodes(data.getParents())); + result.setContainedDataSetCodes(Code.extractCodes(data.getContainedDataSets())); return result; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/IGenericBusinessObjectFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/IGenericBusinessObjectFactory.java index ecdea1fd893..89047528cff 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/IGenericBusinessObjectFactory.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/IGenericBusinessObjectFactory.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.plugin.generic.server; +import ch.systemsx.cisd.openbis.generic.server.business.bo.IDataBO; import ch.systemsx.cisd.openbis.generic.server.business.bo.IExperimentBO; import ch.systemsx.cisd.openbis.generic.server.business.bo.IExperimentTable; import ch.systemsx.cisd.openbis.generic.server.business.bo.IExternalDataBO; @@ -60,6 +61,11 @@ public interface IGenericBusinessObjectFactory */ public IMaterialBO createMaterialBO(final Session session); + /** + * Creates a {@link IDataBO} <i>Business Object</i>. + */ + public IDataBO createDataBO(final Session session); + /** * Creates a {@link IExternalDataBO} <i>Business Object</i>. */ diff --git a/openbis/sourceTest/sql/postgresql/071/008=data_set_properties.tsv b/openbis/sourceTest/sql/postgresql/071/008=data_set_properties.tsv index e729af1e2f0..6214057519a 100644 --- a/openbis/sourceTest/sql/postgresql/071/008=data_set_properties.tsv +++ b/openbis/sourceTest/sql/postgresql/071/008=data_set_properties.tsv @@ -8,6 +8,8 @@ 8 10 1 no comment \N \N 2 2009-04-24 14:45:06.348563+02 2009-04-24 14:45:07.091+02 9 11 1 no comment \N \N 2 2009-04-24 14:45:06.348563+02 2009-04-24 14:45:07.091+02 10 12 1 no comment \N \N 2 2009-04-24 14:45:06.348563+02 2009-04-24 14:45:07.091+02 -11 5 4 \N 12 \N 2 2009-09-15 08:45:48.059548+02 2009-09-15 08:45:48.639+02 -12 5 3 \N \N 22 2 2009-09-15 08:45:48.059548+02 2009-09-15 08:45:48.64+02 -13 5 2 \N \N 2498 2 2009-09-15 08:45:48.059548+02 2009-09-15 08:45:48.64+02 +11 14 1 non-virtual comment \N \N 2 2009-04-24 14:45:06.348563+02 2009-04-24 14:45:07.091+02 +12 15 1 non-virtual comment \N \N 2 2009-04-24 14:45:06.348563+02 2009-04-24 14:45:07.091+02 +13 5 4 \N 12 \N 2 2009-09-15 08:45:48.059548+02 2009-09-15 08:45:48.639+02 +14 5 3 \N \N 22 2 2009-09-15 08:45:48.059548+02 2009-09-15 08:45:48.64+02 +15 5 2 \N \N 2498 2 2009-09-15 08:45:48.059548+02 2009-09-15 08:45:48.64+02 -- GitLab