Skip to content
Snippets Groups Projects
Commit 62d05668 authored by Piotr Gawron's avatar Piotr Gawron
Browse files

Biocompendium annotator removed

parent beeb9092
No related branches found
No related tags found
1 merge request!776Resolve "Biocompendium problems"
minerva (14.0.0~alpha.0) unstable; urgency=low
* Feature: log4j is replaced with log4j2 logging mechanism (#291)
* Feature removal: BioCompendium annotator removed (#32)
minerva (13.1.0~alpha.0) unstable; urgency=low minerva (13.1.0~alpha.0) unstable; urgency=low
* Feature: annotators are more flexible - you can define set of input and * Feature: annotators are more flexible - you can define set of input and
outputs used by annotator (#617) outputs used by annotator (#617)
......
package lcsb.mapviewer.annotation.services.annotators;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import lcsb.mapviewer.common.XmlParser;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.logging.log4j.*;
import org.springframework.stereotype.Service;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import lcsb.mapviewer.annotation.cache.GeneralCacheInterface;
import lcsb.mapviewer.annotation.cache.SourceNotAvailable;
import lcsb.mapviewer.annotation.services.ExternalServiceStatus;
import lcsb.mapviewer.annotation.services.ExternalServiceStatusType;
import lcsb.mapviewer.annotation.services.IExternalService;
import lcsb.mapviewer.common.exception.InvalidArgumentException;
import lcsb.mapviewer.common.exception.InvalidXmlSchemaException;
import lcsb.mapviewer.converter.model.celldesigner.annotation.NoteField;
import lcsb.mapviewer.converter.model.celldesigner.annotation.RestAnnotationParser;
import lcsb.mapviewer.model.map.MiriamData;
import lcsb.mapviewer.model.map.MiriamType;
import lcsb.mapviewer.model.map.species.Gene;
import lcsb.mapviewer.model.map.species.Protein;
import lcsb.mapviewer.model.map.species.Rna;
import lcsb.mapviewer.model.user.annotator.AnnotatorData;
import lcsb.mapviewer.model.user.annotator.AnnotatorInputParameter;
import lcsb.mapviewer.model.user.annotator.AnnotatorOutputParameter;
import lcsb.mapviewer.model.user.annotator.BioEntityField;
/**
* This class is responsible for connection to Vencata annotation service. The
* service is available on
* http://biocompendium.embl.de/map_annotator/REST/GetAnnotation/. This service
* is RESTful service. To query for an annotation one need to send a POST
* message with two parameters:<br>
* Method - this parameter should be set to GetAnnotation <br>
* File - this parameter should bo connected to a file with a request<br>
*
* Request file should looks like the one in testFiles/sampleRequest.xml.<br>
* As a result the xml file is received. An example of a xml response is in
* testFiles/sampleResponse.xml
*
*
* @author Piotr Gawron
*
*/
@Service
public class BiocompendiumAnnotator extends ElementAnnotator implements IExternalService {
/**
* Address of the restfull API for biocompendium.
*/
private static final String SERVICE_ADDRESS = "http://biocompendium.embl.de/map_annotator/REST/GetAnnotation/";
/**
* Standard class logger.
*/
private final Logger logger = LogManager.getLogger(BiocompendiumAnnotator.class);
/**
* Xml parser used for processing notes into structured data.
*/
private RestAnnotationParser rap = new RestAnnotationParser();
/**
* Default constructor.
*/
public BiocompendiumAnnotator() {
super(BiocompendiumAnnotator.class, new Class[] { Protein.class, Gene.class, Rna.class }, true);
}
@Override
public String refreshCacheQuery(Object query) throws SourceNotAvailable {
String result = null;
try {
if (query instanceof String) {
String name = (String) query;
result = getAnnotation(new MiriamData(MiriamType.HGNC_SYMBOL, name));
} else {
throw new InvalidArgumentException("Don't know what to do with class: " + query.getClass());
}
} catch (IOException e) {
throw new SourceNotAvailable(e);
}
return result;
}
/**
* Returns String with annotations for species described by {@link MiriamData}
* with {@link MiriamType#HGNC_SYMBOL} entry.
*
* @param md
* description of the element by {@link MiriamData} with
* {@link MiriamType#HGNC_SYMBOL} entry
* @return annotation for species with given name and type from Venkata server
* @throws IOException
* thrown when there is a problem with connection to the server
*/
protected String getAnnotation(MiriamData md) throws IOException {
if (!MiriamType.HGNC_SYMBOL.equals(md.getDataType())) {
throw new InvalidArgumentException(
"Only " + MiriamType.HGNC_SYMBOL.getCommonName() + " miriam registry is supported.");
}
MiriamData miriamData = new MiriamData(md);
miriamData.setResource(miriamData.getResource().replaceAll("[\n\r]+", " "));
String annotation = getCacheValue(miriamData.getResource());
if (annotation != null) {
return annotation;
}
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httppost = new HttpPost(SERVICE_ADDRESS);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
// prepare a query
String requestXml = dataToString(miriamData);
// save query to a temporary file
File tmp = File.createTempFile("annotation-plugin", "xml");
BufferedWriter out = new BufferedWriter(new FileWriter(tmp));
out.write(requestXml);
out.close();
builder.addBinaryBody("File", tmp, ContentType.APPLICATION_OCTET_STREAM, tmp.getName());
HttpEntity multipart = builder.build();
httppost.setEntity(multipart);
CloseableHttpResponse response = httpClient.execute(httppost);
HttpEntity entity2 = response.getEntity();
if (entity2 != null) {
InputStream instream = entity2.getContent();
Scanner scanner = new Scanner(instream);
try {
Scanner s = scanner.useDelimiter("\\A");
// get results
String responseXml = "";
if (s.hasNext()) {
responseXml = s.next();
}
try {
annotation = getAnnotationsFromXml(responseXml).get(miriamData.getResource());
} catch (InvalidXmlSchemaException e) {
throw new IOException(e);
}
} finally {
scanner.close();
instream.close();
}
}
if (annotation != null) {
setCacheValue(miriamData.getResource(), annotation);
}
return annotation;
}
/**
* This method convert a hgnc symbol in miriam data into xml request.
*
* @param miriamData
* - {@link MiriamData} with {@link MiriamType#HGNC_SYMBOL}
* @return xml string that represent a request to RESTful service
*/
String dataToString(MiriamData miriamData) {
if (!MiriamType.HGNC_SYMBOL.equals(miriamData.getDataType())) {
throw new InvalidArgumentException(
"Only " + MiriamType.HGNC_SYMBOL.getCommonName() + " miriam registry is supported.");
}
String requestXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
requestXml += "<request>\n";
requestXml += " <species name=\"" + miriamData.getResource() + "\" type=\"PROTEIN\"/>\n";
requestXml += "</request>\n";
return requestXml;
}
/**
* This method parse a response xml from annotation service into a map. A key in
* the map is a name of species and value is a annotation received from the
* service.
*
* @param xml
* - xml string to be parsed
* @return a map with information about annotations. A key in the map is a name
* of species and value is a annotation received from the service.
* @throws InvalidXmlSchemaException
* thrown when there is a problem with xml
*/
Map<String, String> getAnnotationsFromXml(String xml) throws InvalidXmlSchemaException {
Map<String, String> result = new HashMap<String, String>();
// if xml is null or empty string then return empty map
if (xml == null) {
return result;
}
if (xml.isEmpty()) {
return result;
}
// there is a bug in annotation service that create incorrect xml, therefore
// we need to alter the xml
xml = correctInvalidXml(xml);
Document doc = XmlParser.getXmlDocumentFromString(xml);
result = getAnnotationsFromXmlNode(doc);
return result;
}
/**
* Transforms xml retrieved from Venkata server into map of annotations. A key
* in the map is a name of species and value is a annotation received from the
* service.
*
* @param doc
* - xml node
* @return a map with information about annotations. A key in the map is a
* name of species and value is a annotation received from the
* service.
*/
private Map<String, String> getAnnotationsFromXmlNode(Node doc) {
Map<String, String> result = new HashMap<String, String>();
NodeList root = doc.getChildNodes();
Node responseNode = XmlParser.getNode("response", root);
// root node is called "response"
if (responseNode == null) {
throw new InvalidArgumentException("Invalid xml returned by annotation service. No response root node");
}
NodeList list = responseNode.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
// all nodes in response are species
if (node.getNodeType() == Node.ELEMENT_NODE) {
if (node.getNodeName().equalsIgnoreCase("species")) {
String name = XmlParser.getNodeAttr("name", node).replaceAll("%0A", "\n");
String annotation = XmlParser.getNodeValue(node);
if (annotation.contains("Symbol: " + name.split(" ")[0].toUpperCase())) {
result.put(name, annotation);
} else {
logger.warn("Problem with annotation for: " + name);
result.put(name, "");
}
} else {
throw new InvalidArgumentException("Unknown node in xml response: " + node.getNodeName());
}
}
}
return result;
}
/**
* Corrects invalid xml retrieved from Venkata server.
*
* @param xml
* xml to correct
* @return corrected xml
*/
private String correctInvalidXml(String xml) {
int size = 0;
int size2 = 0;
do {
size = xml.length();
xml = xml.replaceAll("<species name=\"[^\"]*\" type=\"[^\"]*\">(\\s)*<species", "<species");
xml = xml.replaceAll("<species name=\"[^\"]*\" type=\"[^\"]*\">(\\s)*</response", "</response");
size2 = xml.length();
} while (size != size2);
return xml;
}
@Override
public ExternalServiceStatus getServiceStatus() {
ExternalServiceStatus status = new ExternalServiceStatus(getCommonName(), getUrl());
GeneralCacheInterface cacheCopy = getCache();
this.setCache(null);
try {
String annotations = getAnnotation(new MiriamData(MiriamType.HGNC_SYMBOL, "SNCA"));
status.setStatus(ExternalServiceStatusType.OK);
if (annotations == null) {
status.setStatus(ExternalServiceStatusType.DOWN);
} else if (!annotations.contains("ymbol")) {
status.setStatus(ExternalServiceStatusType.CHANGED);
}
} catch (Exception e) {
logger.error(status.getName() + " is down", e);
status.setStatus(ExternalServiceStatusType.DOWN);
}
this.setCache(cacheCopy);
return status;
}
@Override
public boolean annotateElement(BioEntityProxy element, MiriamData identifier, AnnotatorData parameters)
throws AnnotatorException {
try {
String annotationString = getAnnotation(identifier);
if (annotationString != null) {
element.addMiriamData(rap.getMiriamData(annotationString));
String annotations = "";
String[] string = annotationString.split("\n");
boolean remove = false;
for (String string2 : string) {
if (string2.startsWith("Symbol:")) {
remove = true;
}
if (remove) {
annotations += string2 + "\n";
}
if (string2.startsWith("Synonyms:")) {
remove = false;
}
}
element.setDescription(rap.getDescription(annotations));
element.setSymbol(rap.getSymbol(annotations));
element.setSynonyms(rap.getSynonyms(annotations));
element.setAbbreviation(rap.getAbbreviation(annotations));
element.setFormula(rap.getFormula(annotations));
element.setFullName(rap.getFullName(annotations));
element.setFormerSymbols(rap.getFormerSymbols(annotations));
return true;
}
return false;
} catch (IOException e) {
throw new AnnotatorException(e);
}
}
@Override
public String getCommonName() {
return "Biocompendium";
}
@Override
public String getUrl() {
return "http://biocompendium.embl.de/";
}
@Override
public List<AnnotatorInputParameter> getAvailableInputParameters() {
return Arrays.asList(new AnnotatorInputParameter(BioEntityField.NAME, MiriamType.HGNC_SYMBOL));
}
@Override
public List<AnnotatorOutputParameter> getAvailableOuputProperties() {
List<AnnotatorOutputParameter> result = new ArrayList<>();
for (NoteField field : NoteField.values()) {
if (field.getMiriamType() != null) {
result.add(new AnnotatorOutputParameter(field.getMiriamType()));
}
}
result.add(new AnnotatorOutputParameter(BioEntityField.SYMBOL));
result.add(new AnnotatorOutputParameter(BioEntityField.DESCRIPTION));
result.add(new AnnotatorOutputParameter(BioEntityField.PREVIOUS_SYMBOLS));
result.add(new AnnotatorOutputParameter(BioEntityField.SYNONYMS));
return result;
}
@Override
public MiriamData getExampleValidAnnotation() {
//we don't provide example because this annotator is unstable
return null;
}
}
...@@ -8,7 +8,6 @@ import org.junit.runners.Suite.SuiteClasses; ...@@ -8,7 +8,6 @@ import org.junit.runners.Suite.SuiteClasses;
@SuiteClasses({ AnnotatorExceptionTest.class, @SuiteClasses({ AnnotatorExceptionTest.class,
AnnotatorExceptionTest.class, AnnotatorExceptionTest.class,
BrendaAnnotatorTest.class, BrendaAnnotatorTest.class,
BiocompendiumAnnotatorTest.class,
CazyAnnotatorTest.class, CazyAnnotatorTest.class,
ChebiAnnotatorTest.class, ChebiAnnotatorTest.class,
ElementAnnotatorTest.class, ElementAnnotatorTest.class,
......
package lcsb.mapviewer.annotation.services.annotators;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Map;
import org.apache.logging.log4j.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import lcsb.mapviewer.annotation.AnnotationTestFunctions;
import lcsb.mapviewer.annotation.cache.GeneralCacheInterface;
import lcsb.mapviewer.annotation.cache.PermanentDatabaseLevelCacheInterface;
import lcsb.mapviewer.annotation.cache.SourceNotAvailable;
import lcsb.mapviewer.common.exception.InvalidArgumentException;
import lcsb.mapviewer.common.exception.InvalidXmlSchemaException;
import lcsb.mapviewer.model.map.MiriamData;
import lcsb.mapviewer.model.map.MiriamType;
public class BiocompendiumAnnotatorTest extends AnnotationTestFunctions {
Logger logger = LogManager.getLogger(BiocompendiumAnnotatorTest.class);
MiriamData camk4 = new MiriamData(MiriamType.HGNC_SYMBOL, "CAMK4");
MiriamData slc25a27 = new MiriamData(MiriamType.HGNC_SYMBOL, "SLC25A27");
MiriamData nsmf = new MiriamData(MiriamType.HGNC_SYMBOL, "NSMF");
MiriamData mir449a = new MiriamData(MiriamType.HGNC_SYMBOL, "MIR449A");
@Autowired
private GeneralCacheInterface cache;
@Autowired
private PermanentDatabaseLevelCacheInterface permanentDatabaseLevelCache;
@Autowired
private BiocompendiumAnnotator restService;
@Before
public void setUp() {
}
@After
public void tearDown() throws Exception {
}
@Test
@Ignore("Bug 32")
public void testGetAnnotationsForSpecies() throws Exception {
try {
String response = restService.getAnnotation(camk4);
assertNotNull(response);
assertTrue(response.contains("Symbol: CAMK4"));
response = restService.getAnnotation(slc25a27);
assertNotNull(response);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void testGetters() throws Exception {
try {
assertNotNull(restService.getCommonName());
assertNotNull(restService.getUrl());
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void testGetAnnotationsForInvalidMiriam() throws Exception {
try {
restService.getAnnotation(new MiriamData());
fail("Exception expected");
} catch (InvalidArgumentException e) {
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void testParseXml() throws Exception {
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader("testFiles/annotation/sampleResponse.xml"));
String line = null;
StringBuilder stringBuilder = new StringBuilder();
String ls = System.getProperty("line.separator");
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
stringBuilder.append(ls);
}
reader.close();
Map<String, String> res = restService.getAnnotationsFromXml(stringBuilder.toString());
assertEquals(2, res.keySet().size());
String response = res.get("CAMK4");
assertNotNull(response);
assertTrue(response.contains("Symbol: CAMK4"));
assertNotNull(res.get("SLC25A27"));
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test(timeout = 10000)
@Ignore("Bug 32")
public void testGetAnnotationsForMiceSpecies() throws Exception {
ArrayList<String> names = new ArrayList<String>();
names.add("Fmo3");
names.add("Nqo1");
names.add("Abcc12");
names.add("Mgst3");
names.add("Txnrd1");
names.add("Cbr3");
names.add("Hspa1b");
names.add("Prdx1");
names.add("Ppard");
names.add("Tgfb2");
names.add("Fth1");
names.add("Prdx6");
names.add("Nr4a1");
names.add("Tgfb1");
names.add("Abcc4");
names.add("Ager");
names.add("Gsr");
names.add("Sod3");
names.add("Maff");
names.add("Eif2ak3");
names.add("Tgfa");
names.add("Hbegf");
names.add("Mafg");
names.add("Adh7");
names.add("Slc7a11");
names.add("Epha3");
names.add("Blvrb");
// problematic one
// names.add("Me1");
names.add("Csnk2a2");
names.add("Gpx3");
names.add("Mapk8");
names.add("Gclm");
names.add("Epha2");
names.add("Bdnf");
// problematic one
// names.add("ACC2");
names.add("Ptgr1");
names.add("Pdgfb");
names.add("Mapk7");
names.add("Cbr1");
names.add("Hsp90aa1");
names.add("Pgd");
names.add("Sqstm1");
names.add("Aldh9a1");
names.add("Txn");
names.add("Txnrd3");
names.add("Srxn1");
names.add("Gpx2");
names.add("Npas4");
names.add("Mapk1");
names.add("Nrg1");
names.add("Cbr");
names.add("Hspa1a");
names.add("Mgst2");
names.add("Tgfbr2");
names.add("Ephx1");
names.add("Dnajb1");
names.add("Abcc2");
names.add("Gclc");
names.add("Abcc5");
names.add("Ggt1");
names.add("Ftl");
names.add("Egr1");
names.add("Fgf13");
// problematic one
// names.add("Hgf");
// problematic one
// names.add("UbcH7");
names.add("Abcc3");
names.add("Nfe2l2");
// problematic one
// names.add("Hsp70");
names.add("Hsp90ab1");
try {
for (int i = 0; i < names.size(); i++) {
String geneName = names.get(i);
String annotation = restService.getAnnotation(new MiriamData(MiriamType.HGNC_SYMBOL, geneName));
assertNotNull("Problem with annotation of mouse gene: " + geneName, annotation);
assertTrue("Problem with annotation of mouse gene: " + geneName, !annotation.trim().equals(""));
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
@Ignore("Bug 451")
public void testGetAnnotationsForNSMF() throws Exception {
try {
String response = restService.getAnnotation(nsmf);
assertNotNull(response);
assertFalse(response.trim().equals(""));
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
@Ignore("Bug 451")
public void testGetAnnotationsForMIR449A() throws Exception {
try {
String response = restService.getAnnotation(mir449a);
assertNotNull(response);
assertFalse(response.trim().equals(""));
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test(timeout = 15000)
public void testCachableInterfaceInvalidate() throws Exception {
String query = "GLUD1";
try {
String newRes = "hello";
cache.setCachedQuery(query, restService.getCacheType(), newRes);
String res = cache.getStringByQuery(query, restService.getCacheType());
assertEquals(newRes, res);
cache.invalidateByQuery(query, restService.getCacheType());
permanentDatabaseLevelCache.waitToFinishTasks();
res = cache.getStringByQuery(query, restService.getCacheType());
assertNotNull(res);
assertFalse("Value wasn't refreshed from db", newRes.equals(res));
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void testNameWithNewLine() throws Exception {
try {
String response = restService.getAnnotation(new MiriamData(MiriamType.HGNC_SYMBOL, "some\nname"));
assertNotNull(response);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void testRefreshInvalidValue() throws Exception {
try {
restService.refreshCacheQuery(new Object());
fail("Exception expected");
} catch (InvalidArgumentException e) {
assertTrue(e.getMessage().contains("Don't know what to do "));
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void testRefreshValueWhenProblemWithSource() throws Exception {
try {
BiocompendiumAnnotator annotatorUnderTest = Mockito.mock(BiocompendiumAnnotator.class,
Mockito.CALLS_REAL_METHODS);
when(annotatorUnderTest.getAnnotationsFromXml(anyString())).thenThrow(InvalidXmlSchemaException.class);
annotatorUnderTest.refreshCacheQuery(camk4.getResource());
fail("Exception expected");
} catch (SourceNotAvailable e) {
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void testGetInvalidAnnotations() throws Exception {
try {
restService.getAnnotation(new MiriamData(MiriamType.WIKIPEDIA, "world"));
fail("Exception expected");
} catch (InvalidArgumentException e) {
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void testInvalidDataToStrubg() throws Exception {
try {
restService.dataToString(new MiriamData(MiriamType.WIKIPEDIA, "world"));
fail("Exception expected");
} catch (InvalidArgumentException e) {
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void testGetAnnotationsFromInvaldXml() throws Exception {
try {
Map<String, String> map = restService.getAnnotationsFromXml("");
assertEquals(0, map.size());
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void testGetAnnotationsFromInvaldXml2() throws Exception {
try {
Map<String, String> map = restService.getAnnotationsFromXml(null);
assertEquals(0, map.size());
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
}
...@@ -24,9 +24,6 @@ public class MultipleAnnotatorsTest extends AnnotationTestFunctions { ...@@ -24,9 +24,6 @@ public class MultipleAnnotatorsTest extends AnnotationTestFunctions {
@Autowired @Autowired
HgncAnnotator hgncAnnotator; HgncAnnotator hgncAnnotator;
@Autowired
BiocompendiumAnnotator biocompendiumAnnotator;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
} }
......
delete from cache_query_table where type in (select id from cache_type_table where class_name ='lcsb.mapviewer.annotation.services.annotators.BiocompendiumAnnotator');
delete from cache_type_table where class_name ='lcsb.mapviewer.annotation.services.annotators.BiocompendiumAnnotator';
package lcsb.mapviewer.services.impl;
import java.util.ArrayList;
import java.util.List;
import lcsb.mapviewer.annotation.services.ChEMBLParser;
import lcsb.mapviewer.annotation.services.DrugbankHTMLParser;
import lcsb.mapviewer.annotation.services.ExternalServiceStatus;
import lcsb.mapviewer.annotation.services.IExternalService;
import lcsb.mapviewer.annotation.services.MiriamConnector;
import lcsb.mapviewer.annotation.services.PubmedParser;
import lcsb.mapviewer.annotation.services.ChemicalParser;
import lcsb.mapviewer.annotation.services.annotators.BiocompendiumAnnotator;
import lcsb.mapviewer.annotation.services.annotators.ChebiAnnotator;
import lcsb.mapviewer.annotation.services.annotators.EnsemblAnnotator;
import lcsb.mapviewer.annotation.services.annotators.EntrezAnnotator;
import lcsb.mapviewer.annotation.services.annotators.GoAnnotator;
import lcsb.mapviewer.annotation.services.annotators.HgncAnnotator;
import lcsb.mapviewer.annotation.services.annotators.UniprotAnnotator;
import lcsb.mapviewer.persist.DbUtils;
import lcsb.mapviewer.services.interfaces.IExternalServicesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Implementation of the service that retrieves information about services that
* access external resources (like chebi, chembl, etc.).
*
* @author Piotr Gawron
*
*/
@Service
public class ExternalServicesService implements IExternalServicesService {
/**
* List of services that should be checked for status.
*/
private List<IExternalService> services = new ArrayList<IExternalService>();
/**
* Service accessing <a href="http://www.drugbank.ca/">drugbank</a>.
*/
private DrugbankHTMLParser drugbankHTMLParser;
/**
* Service accessing <a href="http://ctdbase.org/">ctd</a>.
*/
private ChemicalParser ctdParser;
/**
* Service accessing <a
* href="https://www.ebi.ac.uk/chembl/compound/inspect/">chembl</a>.
*/
private ChEMBLParser chEMBLParser;
/**
* Service accessing <a
* href="http://www.ebi.ac.uk/chebi/webServices.do">chebi</a>.
*/
private ChebiAnnotator chebiBackend;
/**
* Service accessing <a
* href="http://europepmc.org/RestfulWebService">pubmed</a>.
*/
private PubmedParser pubmedParser;
/**
* Service accessing <a href= "http://www.ebi.ac.uk/miriam/main/" >miriam
* registry</a>.
*/
private MiriamConnector miriamConnector;
/**
* Service accessing <a href= "http://biocompendium.embl.de/" >internal
* annotating service</a>.
*/
private BiocompendiumAnnotator annotationRestService;
/**
* Service accessing <a href= "http://www.uniprot.org/" >uniprot</a>.
*/
private UniprotAnnotator uniprotAnnotator;
/**
* Service accessing Ensembl database.
*/
private EnsemblAnnotator ensemblAnnotator;
/**
* Service accessing Entrez database.
*/
private EntrezAnnotator entrezAnnotator;
/**
* Service accessing <a href= "http://www.ebi.ac.uk/QuickGO/" >Gene
* Ontology</a>.
*/
private GoAnnotator goBackend;
/**
* Service accessing HGNC restfull API .
*/
private HgncAnnotator hgncBackend;
/**
* Utils that help to manage the sessions in custom multithreaded
* implementation.
*/
private DbUtils dbUtils;
@Autowired
public ExternalServicesService(DrugbankHTMLParser drugbankHTMLParser,
ChemicalParser ctdParser,
ChEMBLParser chEMBLParser,
ChebiAnnotator chebiBackend,
PubmedParser pubmedParser,
MiriamConnector miriamConnector,
BiocompendiumAnnotator annotationRestService,
UniprotAnnotator uniprotAnnotator,
EnsemblAnnotator ensemblAnnotator,
EntrezAnnotator entrezAnnotator,
GoAnnotator goBackend,
HgncAnnotator hgncBackend,
DbUtils dbUtils) {
this.drugbankHTMLParser = drugbankHTMLParser;
this.ctdParser = ctdParser;
this.chEMBLParser = chEMBLParser;
this.chebiBackend = chebiBackend;
this.pubmedParser = pubmedParser;
this.miriamConnector = miriamConnector;
this.annotationRestService = annotationRestService;
this.uniprotAnnotator = uniprotAnnotator;
this.ensemblAnnotator = ensemblAnnotator;
this.entrezAnnotator = entrezAnnotator;
this.goBackend = goBackend;
this.hgncBackend = hgncBackend;
this.dbUtils = dbUtils;
}
@Override
public List<ExternalServiceStatus> getExternalServiceStatuses() {
List<ExternalServiceStatus> result = new ArrayList<ExternalServiceStatus>();
for (IExternalService service : services) {
boolean sessionOpened = false;
if (!dbUtils.isCustomSessionForCurrentThread()) {
sessionOpened = true;
dbUtils.createSessionForCurrentThread();
}
result.add(service.getServiceStatus());
if (sessionOpened) {
dbUtils.closeSessionForCurrentThread();
}
}
return result;
}
@Override
public void registerService(IExternalService service) {
services.add(service);
}
@Override
public void registerDefaultServices() {
registerService(drugbankHTMLParser);
registerService(chEMBLParser);
registerService(chebiBackend);
registerService(pubmedParser);
registerService(miriamConnector);
registerService(annotationRestService);
registerService(ensemblAnnotator);
registerService(entrezAnnotator);
registerService(goBackend);
registerService(ctdParser);
registerService(hgncBackend);
registerService(uniprotAnnotator);
}
@Override
public void clearServices() {
services.clear();
}
}
...@@ -28,9 +28,9 @@ import javax.xml.transform.TransformerFactory; ...@@ -28,9 +28,9 @@ import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource; import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamResult;
import org.apache.logging.log4j.*; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.LogEvent;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
...@@ -49,8 +49,6 @@ import org.xml.sax.SAXException; ...@@ -49,8 +49,6 @@ import org.xml.sax.SAXException;
import lcsb.mapviewer.annotation.services.ChEMBLParser; import lcsb.mapviewer.annotation.services.ChEMBLParser;
import lcsb.mapviewer.annotation.services.DrugbankHTMLParser; import lcsb.mapviewer.annotation.services.DrugbankHTMLParser;
import lcsb.mapviewer.annotation.services.ModelAnnotator; import lcsb.mapviewer.annotation.services.ModelAnnotator;
import lcsb.mapviewer.annotation.services.annotators.BiocompendiumAnnotator;
import lcsb.mapviewer.common.MinervaLoggerAppender; import lcsb.mapviewer.common.MinervaLoggerAppender;
import lcsb.mapviewer.common.exception.InvalidXmlSchemaException; import lcsb.mapviewer.common.exception.InvalidXmlSchemaException;
import lcsb.mapviewer.converter.ConverterParams; import lcsb.mapviewer.converter.ConverterParams;
...@@ -96,9 +94,6 @@ public abstract class ServiceTestFunctions { ...@@ -96,9 +94,6 @@ public abstract class ServiceTestFunctions {
@Autowired @Autowired
protected ModelAnnotator modelAnnotator; protected ModelAnnotator modelAnnotator;
@Autowired
protected BiocompendiumAnnotator restService;
public double EPSILON = 1e-6; public double EPSILON = 1e-6;
@Autowired @Autowired
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment