Skip to content

Commit 6d931d7

Browse files
committed
setup build and write tests
1 parent 2a504c7 commit 6d931d7

File tree

7 files changed

+180
-52
lines changed

7 files changed

+180
-52
lines changed

pom.xml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@
9797
<artifactId>hotdeploy-plugins</artifactId>
9898
<version>13.01.0</version>
9999
</dependency>
100+
<dependency>
101+
<groupId>org.spockframework</groupId>
102+
<artifactId>spock-core</artifactId>
103+
<version>2.4-M1-groovy-4.0</version>
104+
<scope>test</scope>
105+
</dependency>
100106
</dependencies>
101107

102108
<!-- This configures the target artifact repositories for deployment
@@ -116,4 +122,30 @@
116122
<url>https://qbic-repo.qbic.uni-tuebingen.de/repository/maven-snapshots</url>
117123
</snapshotRepository>
118124
</distributionManagement>
125+
126+
<build>
127+
<plugins>
128+
<plugin>
129+
<artifactId>maven-assembly-plugin</artifactId>
130+
<configuration>
131+
<archive>
132+
<manifest>
133+
</manifest>
134+
</archive>
135+
<descriptorRefs>
136+
<descriptorRef>jar-with-dependencies</descriptorRef>
137+
</descriptorRefs>
138+
</configuration>
139+
<executions>
140+
<execution>
141+
<id>make-assembly</id>
142+
<phase>package</phase>
143+
<goals>
144+
<goal>single</goal>
145+
</goals>
146+
</execution>
147+
</executions>
148+
</plugin>
149+
</plugins>
150+
</build>
119151
</project>

src/main/java/life/qbic/registration/openbis/DataSetProvenance.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,22 @@ public class DataSetProvenance implements Serializable {
1717
private static final long serialVersionUID = -1597156104025439195L;
1818

1919
@JsonProperty("origin")
20-
private final String origin;
20+
private String origin;
2121
@JsonProperty("user")
22-
private final String user;
22+
private String user;
2323
@JsonProperty("measurementId")
24-
private final String measurementId;
24+
private String measurementId;
2525
@JsonProperty("datasetFiles")
26-
private final String[] datasetFiles;
26+
private String[] datasetFiles;
2727
@JsonProperty("taskId")
28-
private final String taskId;
28+
private String taskId;
2929
@JsonProperty("history")
30-
private final String[] history;
30+
private String[] history;
3131

3232

33+
private DataSetProvenance() {
34+
35+
}
3336
public DataSetProvenance(String origin, String user, String measurementId, String[] datasetFiles,
3437
String taskId, String[] history) {
3538
this.origin = origin;

src/main/java/life/qbic/registration/openbis/OpenBisDropboxETL.java

Lines changed: 4 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,10 @@
77
import ch.systemsx.cisd.etlserver.registrator.api.v2.AbstractJavaDataSetRegistrationDropboxV2;
88
import ch.systemsx.cisd.etlserver.registrator.api.v2.IDataSet;
99
import ch.systemsx.cisd.etlserver.registrator.api.v2.IDataSetRegistrationTransactionV2;
10-
import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IDataSetImmutable;
1110
import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable;
12-
import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISearchService;
13-
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria;
14-
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause;
15-
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
16-
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria;
1711
import java.io.File;
18-
import java.util.List;
1912
import life.qbic.registration.openbis.exceptions.fail.MeasurementHasDataException;
20-
import life.qbic.registration.openbis.exceptions.fail.ToManyMeasurementsException;
2113
import life.qbic.registration.openbis.exceptions.fail.UnknownSampleTypeException;
22-
import life.qbic.registration.openbis.exceptions.retry.NoMeasurementsFoundException;
2314
import life.qbic.registration.openbis.types.QDatasetType;
2415
import life.qbic.registration.openbis.types.QPropertyType;
2516
import life.qbic.registration.openbis.types.QSampleType;
@@ -31,7 +22,7 @@
3122
* <ol>
3223
* <li>fetching the measurement sample from openbis
3324
* <li>creating a data set linked to the sample
34-
* <li> moving files into the dataset
25+
* <li>moving files into the dataset
3526
* </ol>
3627
* Some constraints are taken care of during this process. These constraints being:
3728
* <ul>
@@ -70,11 +61,11 @@ public void process(IDataSetRegistrationTransactionV2 transaction) {
7061

7162
String measurementId = dataSetProvenance.measurementId();
7263

73-
ISearchService searchService = transaction.getSearchService();
64+
OpenBisSearchImpl openBisSearch = new OpenBisSearchImpl(transaction.getSearchService());
7465

75-
ISampleImmutable measurementSample = findMeasurementSample(measurementId, searchService);
66+
ISampleImmutable measurementSample = openBisSearch.getMeasurementSample(measurementId);
7667

77-
if (doesMeasurementHaveData(measurementSample, searchService)) {
68+
if (openBisSearch.doesMeasurementHaveData(measurementSample)) {
7869
throw new MeasurementHasDataException("Measurement " + measurementId + " has data attached.");
7970
}
8071
IDataSet newDataSet = transaction.createNewDataSet();
@@ -93,37 +84,4 @@ private static QDatasetType getDatasetType(ISampleImmutable measurementSample) {
9384
"Unknown sample type: " + measurementSample.getSampleType()));
9485
return QDatasetType.fromQSampleType(qSampleType);
9586
}
96-
97-
private static ISampleImmutable findMeasurementSample(String measurementId,
98-
ISearchService searchService) {
99-
SearchCriteria measurementSearchCriteria = new SearchCriteria();
100-
measurementSearchCriteria.addMatchClause(
101-
MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, measurementId));
102-
List<ISampleImmutable> immutableSamples = searchService.searchForSamples(measurementSearchCriteria);
103-
104-
if (immutableSamples.isEmpty()) {
105-
//measurement not found
106-
throw new NoMeasurementsFoundException("Measurement '" + measurementId + "' not found");
107-
}
108-
if (immutableSamples.size() > 1) {
109-
throw new ToManyMeasurementsException(
110-
"Multiple measurement with id '" + measurementId + "' found");
111-
}
112-
return immutableSamples.get(0);
113-
}
114-
115-
private boolean doesMeasurementHaveData(ISampleImmutable sample, ISearchService searchService) {
116-
SearchCriteria parentSampleSearchCriteria = new SearchCriteria();
117-
parentSampleSearchCriteria.addMatchClause(
118-
MatchClause.createAttributeMatch(MatchClauseAttribute.PERM_ID, sample.getPermId()));
119-
120-
SearchCriteria dataSetSearchCriteria = new SearchCriteria();
121-
dataSetSearchCriteria.addSubCriteria(
122-
SearchSubCriteria.createDataSetContainerCriteria(parentSampleSearchCriteria));
123-
List<IDataSetImmutable> existingDataSets = searchService.searchForDataSets(
124-
dataSetSearchCriteria);
125-
return !existingDataSets.isEmpty();
126-
127-
}
128-
12987
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package life.qbic.registration.openbis;
2+
3+
import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable;
4+
5+
/**
6+
* Interface that allows for searching openbis infrastructure
7+
*/
8+
public interface OpenBisSearch {
9+
10+
/**
11+
* Searches for a sample with the measurement code in openbis. Assumes that there is one sample and only one; Fails otherwise.
12+
* @param measurementId the identifier of the measurement
13+
* @return the existing measurement
14+
*/
15+
ISampleImmutable getMeasurementSample(String measurementId);
16+
17+
/**
18+
* Checks for datasets attached to a measurement sample
19+
* @param measurementSample
20+
* @return true if a dataset is contained in the measurement; false otherwise.
21+
*/
22+
boolean doesMeasurementHaveData(ISampleImmutable measurementSample);
23+
24+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package life.qbic.registration.openbis;
2+
3+
import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IDataSetImmutable;
4+
import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable;
5+
import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISearchService;
6+
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria;
7+
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause;
8+
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
9+
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria;
10+
import java.util.List;
11+
import life.qbic.registration.openbis.exceptions.fail.ToManyMeasurementsException;
12+
import life.qbic.registration.openbis.exceptions.retry.NoMeasurementsFoundException;
13+
14+
/**
15+
* Implements the Openbis access
16+
*/
17+
public class OpenBisSearchImpl implements OpenBisSearch {
18+
19+
private final ISearchService searchService;
20+
21+
public OpenBisSearchImpl(ISearchService searchService) {
22+
this.searchService = searchService;
23+
}
24+
25+
@Override
26+
public ISampleImmutable getMeasurementSample(String measurementId) {
27+
return findMeasurementSample(measurementId, searchService);
28+
}
29+
30+
private static ISampleImmutable findMeasurementSample(String measurementId,
31+
ISearchService searchService) {
32+
SearchCriteria measurementSearchCriteria = new SearchCriteria();
33+
measurementSearchCriteria.addMatchClause(
34+
MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, measurementId));
35+
List<ISampleImmutable> immutableSamples = searchService.searchForSamples(
36+
measurementSearchCriteria);
37+
38+
if (immutableSamples.isEmpty()) {
39+
//measurement not found
40+
throw new NoMeasurementsFoundException("Measurement '" + measurementId + "' not found");
41+
}
42+
if (immutableSamples.size() > 1) {
43+
throw new ToManyMeasurementsException(
44+
"Multiple measurement with id '" + measurementId + "' found");
45+
}
46+
return immutableSamples.get(0);
47+
}
48+
49+
@Override
50+
public boolean doesMeasurementHaveData(ISampleImmutable sample) {
51+
return doesMeasurementHaveData(sample, searchService);
52+
}
53+
54+
private static boolean doesMeasurementHaveData(ISampleImmutable sample,
55+
ISearchService searchService) {
56+
SearchCriteria parentSampleSearchCriteria = new SearchCriteria();
57+
parentSampleSearchCriteria.addMatchClause(
58+
MatchClause.createAttributeMatch(MatchClauseAttribute.PERM_ID, sample.getPermId()));
59+
60+
SearchCriteria dataSetSearchCriteria = new SearchCriteria();
61+
dataSetSearchCriteria.addSubCriteria(
62+
SearchSubCriteria.createDataSetContainerCriteria(parentSampleSearchCriteria));
63+
List<IDataSetImmutable> existingDataSets = searchService.searchForDataSets(
64+
dataSetSearchCriteria);
65+
return !existingDataSets.isEmpty();
66+
}
67+
68+
69+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package life.qbic.registration.openbis
2+
3+
import spock.lang.Specification
4+
5+
/**
6+
* TODO!
7+
* <b>short description</b>
8+
*
9+
* <p>detailed description</p>
10+
*
11+
* @since <version tag>
12+
*/
13+
class ProvenanceParserTest extends Specification {
14+
15+
final File validFile = new File(ProvenanceParserTest.class.getClassLoader().getResource("valid-provenance.json").toURI());
16+
17+
def "parsing just works"() {
18+
when:
19+
var resultingProvenanceObject = new ProvenanceParser().parseProvenanceJson(validFile)
20+
then:
21+
resultingProvenanceObject.measurementId() == "NGSQTEST001AE-1234512312"
22+
resultingProvenanceObject.origin() == "/Users/myuser/registration"
23+
resultingProvenanceObject.datasetFiles() == ["file1.fastq.gz", "file2.fastq.gz"]
24+
resultingProvenanceObject.user() == "/Users/myuser"
25+
resultingProvenanceObject.taskId() == "ce36775e-0d06-471e-baa7-1e3b63de871f"
26+
resultingProvenanceObject.history() == ["/some/dir", "/some/other/dir"]
27+
}
28+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"origin": "/Users/myuser/registration",
3+
"user": "/Users/myuser",
4+
"measurementId": "NGSQTEST001AE-1234512312",
5+
"datasetFiles" : [
6+
"file1.fastq.gz",
7+
"file2.fastq.gz"
8+
],
9+
"taskId": "ce36775e-0d06-471e-baa7-1e3b63de871f",
10+
"history": [
11+
"/some/dir",
12+
"/some/other/dir"
13+
]
14+
}

0 commit comments

Comments
 (0)