package org.openbel.framework.test;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import static org.openbel.framework.test.WebAPIHelper.createWebAPI;
import static org.openbel.framework.ws.model.CitationType.*;
import static org.openbel.framework.ws.model.RelationshipType.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openbel.framework.ws.model.*;
public class TestKamUtilsEndPoint {
private final static ObjectFactory factory = new ObjectFactory();
// This class is a JUnit test against com.seleventa.belframework.ws.endpoint.KamUtilsEndPoint
// (which implements the LoadKam request offered by the web API).
private static final String SMALL_CORPUS_KAM_NAME = "small_corpus";
private static final long POLL_INTERVAL_MILLISECONDS = 500;
private static final long SEED = 71073753702L;
private static WebAPI webAPI = createWebAPI();
private static final Random random = new Random(SEED);
private static boolean randomIsInclude = false;
private static boolean defaultIsInclude = true;
private static Kam smallCorpus = null;
private static List<BelDocument> belDocuments;
private static List<AnnotationType> annotationTypes;
private static List<Citation> citations;
private static final List<RelationshipType> relationships;
@BeforeClass
public static void establishWebAPI() {
assertThat(webAPI, is(not(nullValue())));
final GetCatalogResponse catres = webAPI.getCatalog(null);
assertThat(catres, is(not(nullValue())));
final List<Kam> catalog = catres.getKams();
assertThat(catalog, is(not(nullValue())));
assertThat(catalog.isEmpty(), is(false));
// Find the KAM with the name "small_corpus".
for (final Kam kam : catalog) {
if (SMALL_CORPUS_KAM_NAME.equals(kam.getName())) {
smallCorpus = kam;
break;
}
}
assertThat(smallCorpus, is(not(nullValue())));
// Get the lists of BEL documents, annotation types, and citations
// that will be needed for the tests.
final KamHandle smallCorpusHandle = pollForKam(smallCorpus, null);
belDocuments = getBelDocuments(smallCorpusHandle);
annotationTypes = getAnnotationTypes(smallCorpusHandle);
citations = getCitations(smallCorpusHandle);
assertThat(4, is(belDocuments.size()));
assertThat(21, is(annotationTypes.size()));
assertThat(60, is(citations.size()));
}
@Test
public void testLoadKamWithRandomFilter() {
final KamFilter filter = factory.createKamFilter();
filter.getAnnotationCriteria().add(getRandomAnnotationFilterCriteria());
filter.getCitationCriteria().add(getRandomCitationFilterCriteria());
filter.getDocumentCriteria().add(getRandomBelDocumentFilterCriteria());
filter.getRelationshipCriteria().add(getRandomRelationshipTypeFilterCriteria());
final KamHandle handle = pollForKam(smallCorpus, filter);
releaseKam(handle);
}
@Test
public void testLoadKamWithRandomAnnotationFilter() {
final AnnotationFilterCriteria criteria = getRandomAnnotationFilterCriteria();
final KamFilter filter = factory.createKamFilter();
filter.getAnnotationCriteria().add(criteria);
final KamHandle handle = pollForKam(smallCorpus, filter);
releaseKam(handle);
}
@Test
public void testLoadKamWithRandomCitationFilter() {
final CitationFilterCriteria criteria = getRandomCitationFilterCriteria();
final KamFilter filter = factory.createKamFilter();
filter.getCitationCriteria().add(criteria);
final KamHandle handle = pollForKam(smallCorpus, filter);
releaseKam(handle);
}
@Test
public void testLoadKamWithRandomDocumentFilter() {
final BelDocumentFilterCriteria criteria = getRandomBelDocumentFilterCriteria();
final KamFilter filter = factory.createKamFilter();
filter.getDocumentCriteria().add(criteria);
final KamHandle handle = pollForKam(smallCorpus, filter);
releaseKam(handle);
}
@Test
public void testLoadKamWithRandomRelationshipFilter() {
RelationshipTypeFilterCriteria criteria = getRandomRelationshipTypeFilterCriteria();
final KamFilter filter = factory.createKamFilter();
filter.getRelationshipCriteria().add(criteria);
final KamHandle handle = pollForKam(smallCorpus, filter);
releaseKam(handle);
}
private static AnnotationFilterCriteria getRandomAnnotationFilterCriteria() {
final AnnotationFilterCriteria criteria = factory.createAnnotationFilterCriteria();
criteria.setAnnotationType(oneOf(annotationTypes));
criteria.setIsInclude(randomIsInclude ? random.nextBoolean() : defaultIsInclude);
criteria.getValueSet().addAll(Arrays.asList(new String[] { "example", "test", "sample" }));
return criteria;
}
private static CitationFilterCriteria getRandomCitationFilterCriteria() {
final CitationFilterCriteria criteria = factory.createCitationFilterCriteria();
criteria.setIsInclude(randomIsInclude ? random.nextBoolean() : defaultIsInclude);
criteria.getValueSet().add(oneOf(citations));
return criteria;
}
private static BelDocumentFilterCriteria getRandomBelDocumentFilterCriteria() {
final BelDocumentFilterCriteria criteria = factory.createBelDocumentFilterCriteria();
criteria.setIsInclude(randomIsInclude ? random.nextBoolean() : defaultIsInclude);
criteria.getValueSet().add(oneOf(belDocuments));
return criteria;
}
private static RelationshipTypeFilterCriteria getRandomRelationshipTypeFilterCriteria() {
final RelationshipTypeFilterCriteria criteria = factory.createRelationshipTypeFilterCriteria();
criteria.setIsInclude(randomIsInclude ? random.nextBoolean() : defaultIsInclude);
criteria.getValueSet().add(oneOf(relationships));
return criteria;
}
private static <T> T oneOf(List<T> list) {
int n = list.size();
if (n == 0) {
return null;
}
return list.get(random.nextInt(n));
}
private static KamHandle pollForKam(Kam kam, KamFilter kamFilter) {
final LoadKamRequest loadKamRequest = factory.createLoadKamRequest();
loadKamRequest.setKam(kam);
loadKamRequest.setFilter(kamFilter);
LoadKamResponse loadKamResponse = webAPI.loadKam(loadKamRequest);
assertThat(loadKamResponse, is(not(nullValue())));
KAMLoadStatus status = loadKamResponse.getLoadStatus();
assertThat(status, is(not(nullValue())));
while (status != KAMLoadStatus.COMPLETE) {
if (status == KAMLoadStatus.FAILED) {
String msg = loadKamResponse.getMessage();
fail("Received the KAM load status FAILED" + (msg != null ? ": " + msg : "."));
}
assertThat(status, is(equalTo(KAMLoadStatus.IN_PROCESS)));
// Continue to poll after the time interval.
try {
Thread.sleep(POLL_INTERVAL_MILLISECONDS);
} catch (InterruptedException ex) {
// Do nothing.
}
loadKamResponse = webAPI.loadKam(loadKamRequest);
assertThat(loadKamResponse, is(not(nullValue())));
status = loadKamResponse.getLoadStatus();
assertThat(status, is(not(nullValue())));
}
final KamHandle handle = loadKamResponse.getHandle();
assertThat(handle, is(not(nullValue())));
return handle;
}
private void releaseKam(KamHandle handle) {
final ReleaseKamRequest request = factory.createReleaseKamRequest();
request.setKam(handle);
final ReleaseKamResponse response = webAPI.releaseKam(request);
assertThat(response, is(not(nullValue())));
}
private static List<BelDocument> getBelDocuments(KamHandle handle) {
final GetBelDocumentsRequest request = factory.createGetBelDocumentsRequest();
request.setHandle(handle);
final GetBelDocumentsResponse response = webAPI.getBelDocuments(request);
assertThat(response, is(not(nullValue())));
final List<BelDocument> documents = response.getDocuments();
assertThat(documents, is(not(nullValue())));
return documents;
}
private static List<AnnotationType> getAnnotationTypes(KamHandle handle) {
final GetAnnotationTypesRequest request = factory.createGetAnnotationTypesRequest();
request.setHandle(handle);
final GetAnnotationTypesResponse response = webAPI.getAnnotationTypes(request);
assertThat(response, is(not(nullValue())));
final List<AnnotationType> annotationTypes = response.getAnnotationTypes();
assertThat(annotationTypes, is(not(nullValue())));
return annotationTypes;
}
private static List<Citation> getCitations(KamHandle handle) {
List<Citation> ret = new ArrayList<Citation>();
final CitationType[] types = new CitationType[] { BOOK, JOURNAL, ONLINE_RESOURCE, PUBMED, OTHER };
for (CitationType type : types) {
ret.addAll(getCitations(handle, type));
}
return ret;
}
private static List<Citation> getCitations(KamHandle handle, CitationType citationType) {
final GetCitationsRequest request = factory.createGetCitationsRequest();
request.setHandle(handle);
request.setCitationType(citationType);
//request.setDocument(null);
final GetCitationsResponse response = webAPI.getCitations(request);
assertThat(response, is(not(nullValue())));
final List<Citation> citations = response.getCitations();
assertThat(citations, is(not(nullValue())));
return citations;
}
static {
relationships = Arrays.asList(new RelationshipType[] {
UNKNOWN,
ACTS_IN,
ANALOGOUS,
ASSOCIATION,
BIOMARKER_FOR,
CAUSES_NO_CHANGE,
DECREASES,
DIRECTLY_DECREASES,
DIRECTLY_INCREASES,
HAS_COMPONENT,
HAS_MEMBER,
HAS_MODIFICATION,
HAS_PRODUCT,
HAS_VARIANT,
INCLUDES,
INCREASES,
IS_A,
NEGATIVE_CORRELATION,
ORTHOLOGOUS,
POSITIVE_CORRELATION,
PROGNOSTIC_BIOMARKER_FOR,
RATE_LIMITING_STEP_OF,
REACTANT_IN,
SUB_PROCESS_OF,
TRANSCRIBED_TO,
TRANSLATED_TO,
TRANSLOCATES });
}
}