Newer
Older
Juan Fuentes
committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
package ethz.ch;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.Attachment;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSet;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.update.DataSetUpdate;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.deletion.id.IDeletionId;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.Experiment;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.delete.ExperimentDeletionOptions;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentIdentifier;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentPermId;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectIdentifier;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create.SampleCreation;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.update.SampleUpdate;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
import ch.ethz.sis.openbis.generic.dssapi.v3.IDataStoreServerApi;
public class Experiment2SampleTranslator
{
public static void migrate(String sessionToken,
IApplicationServerApi v3,
IDataStoreServerApi v3dss,
Experiment2Sample toMigrate,
boolean COMMIT_CHANGES_TO_OPENBIS) throws IOException {
System.out.println("[START]\t" + toMigrate.getExperimentPermId());
Experiment experiment = MetadataHelper.getExperiment(sessionToken, v3, toMigrate.getExperimentPermId());
SampleCreation sampleCreation = new SampleCreation();
sampleCreation.setCode(experiment.getCode());
sampleCreation.setSpaceId(new SpacePermId(experiment.getIdentifier().getIdentifier().split("/")[1]));
sampleCreation.setTypeId(new EntityTypePermId(toMigrate.getConfig().getTypeCode()));
ExperimentIdentifier experimentCollectionIdentifier = new ExperimentIdentifier(experiment.getIdentifier().getIdentifier().split("/")[1],
experiment.getIdentifier().getIdentifier().split("/")[2], toMigrate.getConfig().getExperimentToMigrateTo());
sampleCreation.setExperimentId(experimentCollectionIdentifier);
sampleCreation.setProperties(experiment.getProperties());
for(String from:toMigrate.getConfig().getPropertyTypesFromTo().keySet()) {
String to = toMigrate.getConfig().getPropertyTypesFromTo().get(from);
if(experiment.getProperties().containsKey(from)) {
sampleCreation.setProperty(to, experiment.getProperties().get(from));
}
}
// 1. Does the new collection for the sample exists? Create if not
if(COMMIT_CHANGES_TO_OPENBIS && !MetadataHelper.doExperimentExist(v3, sessionToken, experimentCollectionIdentifier.getIdentifier())) {
ProjectIdentifier projectIdentifier = new ProjectIdentifier("/" + experiment.getIdentifier().getIdentifier().split("/")[1] + "/" + experiment.getIdentifier().getIdentifier().split("/")[2]);
v3.createExperiments(sessionToken, Collections.singletonList(MetadataHelper.getMicroscopyExperimentCollectionCreation(projectIdentifier, toMigrate.getConfig().getExperimentToMigrateTo())));
System.out.println("Created Experiment\t" + experimentCollectionIdentifier.getIdentifier());
}
// 2. Does the new sample exists? Create if not
SampleIdentifier sampleIdentifier = new SampleIdentifier(experiment.getIdentifier().getIdentifier());
SamplePermId samplePermId = null;
Sample sample = MetadataHelper.getSample(v3, sessionToken, sampleIdentifier.getIdentifier());
if(COMMIT_CHANGES_TO_OPENBIS && sample == null) {
samplePermId = v3.createSamples(sessionToken, Collections.singletonList(sampleCreation)).get(0);
System.out.println("Created Sample\t" + sampleIdentifier.getIdentifier());
} else {
samplePermId = sample.getPermId();
}
// 3. Does the new sample have assigned as children the samples of the experiment? Assign if not to the new sample and experiment collection.
if(COMMIT_CHANGES_TO_OPENBIS && !experiment.getSamples().isEmpty()) {
Deque<SampleUpdate> toSetNewParentAndCollection = new LinkedList<SampleUpdate>();
for(Sample experimentSample:experiment.getSamples()) {
SampleUpdate update = new SampleUpdate();
update.setSampleId(experimentSample.getPermId());
update.setExperimentId(experimentCollectionIdentifier);
update.getParentIds().add(samplePermId);
toSetNewParentAndCollection.add(update);
System.out.println("Update Children\t" + experimentSample.getIdentifier());
}
MetadataHelper.executeSampleUpdates(sessionToken, v3, COMMIT_CHANGES_TO_OPENBIS, toSetNewParentAndCollection);
}
// 4. Does the new sample have assigned the experiment datasets? Assign if not
if(COMMIT_CHANGES_TO_OPENBIS && !experiment.getDataSets().isEmpty()) {
Deque<DataSetUpdate> toSetNewSampleAndCollection = new LinkedList<DataSetUpdate>();
for(DataSet experimentDataSet:experiment.getDataSets()) {
DataSetUpdate update = new DataSetUpdate();
update.setDataSetId(experimentDataSet.getPermId());
update.setExperimentId(experimentCollectionIdentifier); // Update experiment
// dataSets that are already assigned to a sample, we leave them assigned to them, they should be the containers
// dataSets that are not assigned to a sample should be assigned to their experiment sample
if(experimentDataSet.getSample() == null) {
update.setSampleId(samplePermId);
}
toSetNewSampleAndCollection.add(update);
System.out.println("Update DataSet\t" + experimentDataSet.getPermId());
}
MetadataHelper.executeDataSetUpdates(sessionToken, v3, COMMIT_CHANGES_TO_OPENBIS, toSetNewSampleAndCollection);
}
// 5. Does the new sample have assigned tags as organisational units? Create and add if not.
if(COMMIT_CHANGES_TO_OPENBIS && (sample == null || sample.getParents().isEmpty())) {
List<SamplePermId> tagsAsParentOU = TagsHelper.getOrganizationUnits(sessionToken, v3, COMMIT_CHANGES_TO_OPENBIS, experiment);
if(tagsAsParentOU != null) {
SampleUpdate sampleUpdate = new SampleUpdate();
sampleUpdate.setSampleId(samplePermId);
for(SamplePermId tagAsParentOU:tagsAsParentOU) {
sampleUpdate.getParentIds().add(tagAsParentOU);
}
System.out.println("Update Tags\t" + tagsAsParentOU);
Deque<SampleUpdate> sampleUpdates = new LinkedList(Arrays.asList(sampleUpdate));
MetadataHelper.executeSampleUpdates(sessionToken, v3, COMMIT_CHANGES_TO_OPENBIS, sampleUpdates);
}
}
// 6. Does the new sample have assigned as datasets the attachments of the experiment? Create if not.
if(COMMIT_CHANGES_TO_OPENBIS && (sample == null || !hasAttachments(sample))) {
for(Attachment attachment:experiment.getAttachments()) {
System.out.println("Update Attachment\t" + attachment.getFileName());
Map<String, String> properties = new HashMap<>();
if(attachment.getDescription() != null) {
properties.put("NOTES", attachment.getDescription());
}
DatasetCreationHelper.createDataset(v3dss, sessionToken, sampleIdentifier.getIdentifier(), "ATTACHMENT", attachment.getFileName(), attachment.getContent(), properties);
}
}
// 7. Add audit data always, repeating updates doesn't hurt
System.out.println("Attach Audit data\t" + toMigrate.getExperimentPermId() + "\t" + sampleIdentifier.getIdentifier());
AuditDataHelper.addAuditUpdate(samplePermId, experiment);
System.out.println("Delete Experiment\t" + toMigrate.getExperimentPermId());
// 8. Delete the migrated experiment
deleteExperiment(sessionToken, v3, COMMIT_CHANGES_TO_OPENBIS, toMigrate.getExperimentPermId());
System.out.println("[FINISH]\t" + toMigrate.getExperimentPermId());
}
private static boolean hasAttachments(Sample sample) {
for(DataSet dataSet:sample.getDataSets()) {
if(dataSet.getType().getCode().equals("ATTACHMENT")) {
return true;
}
}
return false;
}
private static void deleteExperiment(String sessionToken, IApplicationServerApi v3, boolean COMMIT_CHANGES_TO_OPENBIS, ExperimentPermId experimentPermId) {
// Sanity checks before deleting an Experiment
Experiment experiment = MetadataHelper.getExperiment(sessionToken, v3, experimentPermId);
if((experiment.getDataSets().size() + experiment.getSamples().size()) > 0) {
System.out.println("Experiment " + experiment.getIdentifier() + " can't be deleted until DataSets " + experiment.getDataSets().size() + " and Samples " + experiment.getSamples().size() + " are moved. Try again later.");
return;
}
// Deleting Experiments.
if(COMMIT_CHANGES_TO_OPENBIS) {
ExperimentDeletionOptions deleteOptions = new ExperimentDeletionOptions();
deleteOptions.setReason("Microscopy Migration");
IDeletionId deletionId = v3.deleteExperiments(sessionToken, Arrays.asList(experimentPermId), deleteOptions);
v3.confirmDeletions(sessionToken, Arrays.asList(deletionId));
}
}
}