Skip to content

Commit

Permalink
setup build and write tests
Browse files Browse the repository at this point in the history
  • Loading branch information
KochTobi committed May 23, 2024
1 parent 2a504c7 commit 6d931d7
Show file tree
Hide file tree
Showing 7 changed files with 180 additions and 52 deletions.
32 changes: 32 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,12 @@
<artifactId>hotdeploy-plugins</artifactId>
<version>13.01.0</version>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>2.4-M1-groovy-4.0</version>
<scope>test</scope>
</dependency>
</dependencies>

<!-- This configures the target artifact repositories for deployment
Expand All @@ -116,4 +122,30 @@
<url>https://qbic-repo.qbic.uni-tuebingen.de/repository/maven-snapshots</url>
</snapshotRepository>
</distributionManagement>

<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,22 @@ public class DataSetProvenance implements Serializable {
private static final long serialVersionUID = -1597156104025439195L;

@JsonProperty("origin")
private final String origin;
private String origin;
@JsonProperty("user")
private final String user;
private String user;
@JsonProperty("measurementId")
private final String measurementId;
private String measurementId;
@JsonProperty("datasetFiles")
private final String[] datasetFiles;
private String[] datasetFiles;
@JsonProperty("taskId")
private final String taskId;
private String taskId;
@JsonProperty("history")
private final String[] history;
private String[] history;


private DataSetProvenance() {

}
public DataSetProvenance(String origin, String user, String measurementId, String[] datasetFiles,
String taskId, String[] history) {
this.origin = origin;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,10 @@
import ch.systemsx.cisd.etlserver.registrator.api.v2.AbstractJavaDataSetRegistrationDropboxV2;
import ch.systemsx.cisd.etlserver.registrator.api.v2.IDataSet;
import ch.systemsx.cisd.etlserver.registrator.api.v2.IDataSetRegistrationTransactionV2;
import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IDataSetImmutable;
import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable;
import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISearchService;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria;
import java.io.File;
import java.util.List;
import life.qbic.registration.openbis.exceptions.fail.MeasurementHasDataException;
import life.qbic.registration.openbis.exceptions.fail.ToManyMeasurementsException;
import life.qbic.registration.openbis.exceptions.fail.UnknownSampleTypeException;
import life.qbic.registration.openbis.exceptions.retry.NoMeasurementsFoundException;
import life.qbic.registration.openbis.types.QDatasetType;
import life.qbic.registration.openbis.types.QPropertyType;
import life.qbic.registration.openbis.types.QSampleType;
Expand All @@ -31,7 +22,7 @@
* <ol>
* <li>fetching the measurement sample from openbis
* <li>creating a data set linked to the sample
* <li> moving files into the dataset
* <li>moving files into the dataset
* </ol>
* Some constraints are taken care of during this process. These constraints being:
* <ul>
Expand Down Expand Up @@ -70,11 +61,11 @@ public void process(IDataSetRegistrationTransactionV2 transaction) {

String measurementId = dataSetProvenance.measurementId();

ISearchService searchService = transaction.getSearchService();
OpenBisSearchImpl openBisSearch = new OpenBisSearchImpl(transaction.getSearchService());

ISampleImmutable measurementSample = findMeasurementSample(measurementId, searchService);
ISampleImmutable measurementSample = openBisSearch.getMeasurementSample(measurementId);

if (doesMeasurementHaveData(measurementSample, searchService)) {
if (openBisSearch.doesMeasurementHaveData(measurementSample)) {
throw new MeasurementHasDataException("Measurement " + measurementId + " has data attached.");
}
IDataSet newDataSet = transaction.createNewDataSet();
Expand All @@ -93,37 +84,4 @@ private static QDatasetType getDatasetType(ISampleImmutable measurementSample) {
"Unknown sample type: " + measurementSample.getSampleType()));
return QDatasetType.fromQSampleType(qSampleType);
}

private static ISampleImmutable findMeasurementSample(String measurementId,
ISearchService searchService) {
SearchCriteria measurementSearchCriteria = new SearchCriteria();
measurementSearchCriteria.addMatchClause(
MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, measurementId));
List<ISampleImmutable> immutableSamples = searchService.searchForSamples(measurementSearchCriteria);

if (immutableSamples.isEmpty()) {
//measurement not found
throw new NoMeasurementsFoundException("Measurement '" + measurementId + "' not found");
}
if (immutableSamples.size() > 1) {
throw new ToManyMeasurementsException(
"Multiple measurement with id '" + measurementId + "' found");
}
return immutableSamples.get(0);
}

private boolean doesMeasurementHaveData(ISampleImmutable sample, ISearchService searchService) {
SearchCriteria parentSampleSearchCriteria = new SearchCriteria();
parentSampleSearchCriteria.addMatchClause(
MatchClause.createAttributeMatch(MatchClauseAttribute.PERM_ID, sample.getPermId()));

SearchCriteria dataSetSearchCriteria = new SearchCriteria();
dataSetSearchCriteria.addSubCriteria(
SearchSubCriteria.createDataSetContainerCriteria(parentSampleSearchCriteria));
List<IDataSetImmutable> existingDataSets = searchService.searchForDataSets(
dataSetSearchCriteria);
return !existingDataSets.isEmpty();

}

}
24 changes: 24 additions & 0 deletions src/main/java/life/qbic/registration/openbis/OpenBisSearch.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package life.qbic.registration.openbis;

import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable;

/**
* Interface that allows for searching openbis infrastructure
*/
public interface OpenBisSearch {

/**
* Searches for a sample with the measurement code in openbis. Assumes that there is one sample and only one; Fails otherwise.
* @param measurementId the identifier of the measurement
* @return the existing measurement
*/
ISampleImmutable getMeasurementSample(String measurementId);

/**
* Checks for datasets attached to a measurement sample
* @param measurementSample
* @return true if a dataset is contained in the measurement; false otherwise.
*/
boolean doesMeasurementHaveData(ISampleImmutable measurementSample);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package life.qbic.registration.openbis;

import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IDataSetImmutable;
import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable;
import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISearchService;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria;
import java.util.List;
import life.qbic.registration.openbis.exceptions.fail.ToManyMeasurementsException;
import life.qbic.registration.openbis.exceptions.retry.NoMeasurementsFoundException;

/**
* Implements the Openbis access
*/
public class OpenBisSearchImpl implements OpenBisSearch {

private final ISearchService searchService;

public OpenBisSearchImpl(ISearchService searchService) {
this.searchService = searchService;
}

@Override
public ISampleImmutable getMeasurementSample(String measurementId) {
return findMeasurementSample(measurementId, searchService);
}

private static ISampleImmutable findMeasurementSample(String measurementId,
ISearchService searchService) {
SearchCriteria measurementSearchCriteria = new SearchCriteria();
measurementSearchCriteria.addMatchClause(
MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, measurementId));
List<ISampleImmutable> immutableSamples = searchService.searchForSamples(
measurementSearchCriteria);

if (immutableSamples.isEmpty()) {
//measurement not found
throw new NoMeasurementsFoundException("Measurement '" + measurementId + "' not found");
}
if (immutableSamples.size() > 1) {
throw new ToManyMeasurementsException(
"Multiple measurement with id '" + measurementId + "' found");
}
return immutableSamples.get(0);
}

@Override
public boolean doesMeasurementHaveData(ISampleImmutable sample) {
return doesMeasurementHaveData(sample, searchService);
}

private static boolean doesMeasurementHaveData(ISampleImmutable sample,
ISearchService searchService) {
SearchCriteria parentSampleSearchCriteria = new SearchCriteria();
parentSampleSearchCriteria.addMatchClause(
MatchClause.createAttributeMatch(MatchClauseAttribute.PERM_ID, sample.getPermId()));

SearchCriteria dataSetSearchCriteria = new SearchCriteria();
dataSetSearchCriteria.addSubCriteria(
SearchSubCriteria.createDataSetContainerCriteria(parentSampleSearchCriteria));
List<IDataSetImmutable> existingDataSets = searchService.searchForDataSets(
dataSetSearchCriteria);
return !existingDataSets.isEmpty();
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package life.qbic.registration.openbis

import spock.lang.Specification

/**
* TODO!
* <b>short description</b>
*
* <p>detailed description</p>
*
* @since <version tag>
*/
class ProvenanceParserTest extends Specification {

final File validFile = new File(ProvenanceParserTest.class.getClassLoader().getResource("valid-provenance.json").toURI());

def "parsing just works"() {
when:
var resultingProvenanceObject = new ProvenanceParser().parseProvenanceJson(validFile)
then:
resultingProvenanceObject.measurementId() == "NGSQTEST001AE-1234512312"
resultingProvenanceObject.origin() == "/Users/myuser/registration"
resultingProvenanceObject.datasetFiles() == ["file1.fastq.gz", "file2.fastq.gz"]
resultingProvenanceObject.user() == "/Users/myuser"
resultingProvenanceObject.taskId() == "ce36775e-0d06-471e-baa7-1e3b63de871f"
resultingProvenanceObject.history() == ["/some/dir", "/some/other/dir"]
}
}
14 changes: 14 additions & 0 deletions src/test/resources/valid-provenance.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"origin": "/Users/myuser/registration",
"user": "/Users/myuser",
"measurementId": "NGSQTEST001AE-1234512312",
"datasetFiles" : [
"file1.fastq.gz",
"file2.fastq.gz"
],
"taskId": "ce36775e-0d06-471e-baa7-1e3b63de871f",
"history": [
"/some/dir",
"/some/other/dir"
]
}

0 comments on commit 6d931d7

Please sign in to comment.