diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..4c8e77f73dc9ab17d7d6cec19defa40c7f5d9f30 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,12 @@ +image: node + +before_script: + - cd frontend-js + - npm install + - cd .. + +test_frontend: + script: + - cd frontend-js + - npm test + \ No newline at end of file diff --git a/CHANGELOG b/CHANGELOG index 5ddd8c6f4e09fcd6ca9040e2e1f8b6b705d83b68..1eb8ddc1b403c90693a938fee296419777858e4b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +minerva (11.0.1) stable; urgency=medium + * Bug fix: logout caused issues with session data + + -- Piotr Gawron <piotr.gawron@uni.lu> Fri, 08 Sep 2017 12:00:00 +0200 + minerva (11.0.0) stable; urgency=medium * Bug fix: security issue - access to specific map can be restricted diff --git a/README.md b/README.md index 861648d99c5e64126470d7438abf13c19892bd67..03e5b1befea38931a7909a47f346b260514e7e99 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[](https://git-r3lab.uni.lu/piotr.gawron/minerva/commits/207-continous-integration-tests) + # Rest API (version 11) ## Introduction diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/cache/CachableInterface.java b/annotation/src/main/java/lcsb/mapviewer/annotation/cache/CachableInterface.java index f271d6c39a716f6bbbce53cbd7bd77af10fc50ff..f2401af95111187f5dd2b868db1468029141856b 100644 --- a/annotation/src/main/java/lcsb/mapviewer/annotation/cache/CachableInterface.java +++ b/annotation/src/main/java/lcsb/mapviewer/annotation/cache/CachableInterface.java @@ -161,9 +161,9 @@ public abstract class CachableInterface extends XmlParser { public final void setCache(GeneralCacheInterface cache) { this.cache = cache; } - + /** - * Returns a content of the webpage for a given url. + * Returns a content of the webpage for a given url using GET request. * * @param accessUrl * webpage url address @@ -172,13 +172,36 @@ public abstract class CachableInterface extends XmlParser { * thrown when there are problems with connection to ChEMBL database */ protected final String getWebPageContent(String accessUrl) throws IOException { + return getWebPageContent(accessUrl, "GET", null); + } + + /** + * Returns a content of the webpage for a given url. If postData is not null, + * the page will be accessed using POST request. Otherwise GET will be used. + * + * @param accessUrl + * webpage url address + * @param httpRequestMethod + * type of HTTP request (GET, POST, PUT, PATCH, DELETE, ...) + * @param postData + * string to be sent in the body of the request + * @return content of the webpage + * @throws IOException + * thrown when there are problems with connection to ChEMBL database + */ + protected final String getWebPageContent(String accessUrl, String httpRequestMethod, String data) throws IOException { // check if we have the page in our internal cache + + String cacheKey = accessUrl; + if (data != null) { + cacheKey += data; + } - String result = getCacheValue(accessUrl); + String result = getCacheValue(cacheKey); if (result == null) { - result = webPageDownloader.getFromNetwork(accessUrl); + result = webPageDownloader.getFromNetwork(accessUrl, httpRequestMethod, data); if (result != null) { - setCacheValue(accessUrl, result); + setCacheValue(cacheKey, result); } } return result; diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/cache/WebPageDownloader.java b/annotation/src/main/java/lcsb/mapviewer/annotation/cache/WebPageDownloader.java index 80d2c2f7a7d76259ebfd9e032514fb1d70abf7be..c03944fd8fb1507836139a32d05ffcde9b3864d3 100644 --- a/annotation/src/main/java/lcsb/mapviewer/annotation/cache/WebPageDownloader.java +++ b/annotation/src/main/java/lcsb/mapviewer/annotation/cache/WebPageDownloader.java @@ -4,6 +4,7 @@ import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; +import java.io.DataOutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; @@ -26,6 +27,10 @@ import lcsb.mapviewer.annotation.services.WrongResponseCodeIOException; * @author Piotr Gawron * */ +/** + * @author Piotr Gawron + * + */ public class WebPageDownloader { /** @@ -50,17 +55,39 @@ public class WebPageDownloader { * receiving INTERNAL SERVER ERROR http response. */ private static final int HTTP_INTERNAL_ERROR_RECONNECT_TIMES = 2; - + + + /** - * Returns content of the webpage identified by url. + * Returns content of the webpage identified by url using GET. * * @param accessUrl * url of a webpage * @return content of the webpage identified by url * @throws IOException - * thrown when there is any problem with accesing webpage + * thrown when there is any problem with accessing webpage */ public String getFromNetwork(String accessUrl) throws IOException { + return getFromNetwork(accessUrl, "GET", null); + } + + + /** + * Returns content of the webpage identified by url. The HTTP query is done + * using the provided POST if postData is not null. + * + * + * @param accessUrl + * url of a webpage + * @param httpRequestMethod + * type of HTTP request (GET, POST, PUT, PATCH, DELETE, ...) + * @param data + * string to be sent in the body of the + * @return content of the webpage identified by url + * @throws IOException + * thrown when there is any problem with accessing webpage + */ + public String getFromNetwork(String accessUrl, String httpRequestMethod, String data) throws IOException { /** * Tasks that retrieves content from webpage @@ -77,12 +104,20 @@ public class WebPageDownloader { int code = HttpURLConnection.HTTP_INTERNAL_ERROR; HttpURLConnection urlConn = null; - // connect to the server, if HTTP_INTERNAL_ERROR occurres then try to + // connect to the server, if HTTP_INTERNAL_ERROR occurred then try to // reconnect HTTP_INTERNAL_ERROR_RECONNECT_TIMES times while (code == HttpURLConnection.HTTP_INTERNAL_ERROR || code == HttpURLConnection.HTTP_NOT_FOUND) { - urlConn = openConnection(accessUrl); - urlConn.setRequestMethod("GET"); + urlConn = openConnection(accessUrl); urlConn.addRequestProperty("User-Agent", "minerva-framework"); + + urlConn.setRequestMethod(httpRequestMethod); + if (data != null) { + urlConn.setDoOutput(true); + DataOutputStream wr = new DataOutputStream(urlConn.getOutputStream()); + wr.writeBytes(data); + wr.close(); + } + try { urlConn.connect(); code = urlConn.getResponseCode(); diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/cache/CachableInterfaceTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/cache/CachableInterfaceTest.java index f8b08ad58c37f168150c19efb19203eae0e5f954..d7f21ed334e040a47f925c142d6161b0465a08ef 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/cache/CachableInterfaceTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/cache/CachableInterfaceTest.java @@ -50,6 +50,27 @@ public class CachableInterfaceTest extends AnnotationTestFunctions { throw e; } } + + @Test + public void testGetWebPageGetCache() throws Exception { + try { + CachableInterfaceMock ci = new CachableInterfaceMock(CachableInterface.class); + + CacheTypeDao mock = Mockito.mock(CacheTypeDao.class); + when(mock.getByClassName(anyString())).thenReturn(new CacheType()); + ci.setCacheTypeDao(mock); + ci.setCache(new GeneralCache()); + + String cacheKey = "https://www.google.com/"; + String result = ci.getWebPageContent(cacheKey); + assertNotNull(result); + String cacheValue = ci.getCacheValue(cacheKey); + assertTrue(result.equals(cacheValue)); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } @Test public void testSetNode() throws Exception { diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/cache/WebPageDownloaderTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/cache/WebPageDownloaderTest.java index 8f58a75c427fea9dabc00e2b224d6452b310b9d3..d548f06e95733454bbf64761aa45f161f0d6c95d 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/cache/WebPageDownloaderTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/cache/WebPageDownloaderTest.java @@ -1,6 +1,7 @@ package lcsb.mapviewer.annotation.cache; import static org.junit.Assert.fail; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.net.HttpURLConnection; @@ -61,5 +62,37 @@ public class WebPageDownloaderTest { } catch (IOException e) { } } + + @Test + public void testSend1() { + WebPageDownloader downloader = new WebPageDownloader(); + try { + String result = downloader.getFromNetwork("https://www.google.com/"); + assertNotNull("GET request to Google should return non-null result", result); + } catch (IOException e) { + } + } + + @Test + public void testPost1() { + WebPageDownloader downloader = new WebPageDownloader(); + try { + String result = downloader.getFromNetwork("https://www.ebi.ac.uk/pdbe/api/mappings/best_structures/", "POST", "P29373"); + assertNotNull("POST request to Uniprot should return non-null result", result); + } catch (IOException e) { + } + + } + + @Test + public void testInvalidHttpRequestType() { + WebPageDownloader downloader = new WebPageDownloader(); + try { + String result = downloader.getFromNetwork("https://www.ebi.ac.uk/pdbe/api/mappings/best_structures/", "XXX", "P29373"); + fail("Invalid request exception expected"); + } catch (IOException e) { + } + + } } diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/ChEMBLParserTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/ChEMBLParserTest.java index 8a2ccae9ca521c17970dc194fe339b1ff1308628..90b26f72ff4c3f6524a35975e7ed10abda0e9bde 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/ChEMBLParserTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/ChEMBLParserTest.java @@ -297,7 +297,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("invalid xml"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("invalid xml"); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getTargetFromId(new MiriamData(MiriamType.CHEMBL_TARGET, "water")); fail("Exception expected"); @@ -319,7 +319,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("invalid xml"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("invalid xml"); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.findDrug("test"); fail("Exception expected"); @@ -341,7 +341,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getTargetFromId(new MiriamData(MiriamType.CHEMBL_TARGET, "water")); fail("Exception expected"); @@ -403,7 +403,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("<target><unk/></target>"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("<target><unk/></target>"); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getTargetFromId(new MiriamData(MiriamType.CHEMBL_TARGET, "water")); assertEquals(1, getWarnings().size()); @@ -422,7 +422,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("<target><target_components><target_component/></target_components></target>"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("<target><target_components><target_component/></target_components></target>"); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getTargetFromId(new MiriamData(MiriamType.CHEMBL_TARGET, "water")); assertEquals(1, getWarnings().size()); @@ -441,7 +441,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("<target><target_chembl_id>inv id</target_chembl_id></target>"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("<target><target_chembl_id>inv id</target_chembl_id></target>"); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getTargetFromId(new MiriamData(MiriamType.CHEMBL_TARGET, "water")); assertEquals(1, getWarnings().size()); @@ -836,7 +836,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { // simulate problem with downloading WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.refreshCacheQuery("http://google.pl/"); fail("Exception expected"); @@ -860,7 +860,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { // simulate problem with downloading WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getDrugsByChemblTarget(new MiriamData()); @@ -886,7 +886,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { // simulate problem with downloading WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn(""); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(""); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getDrugsByChemblTarget(new MiriamData()); @@ -914,7 +914,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { // simulate problem with downloading WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.refreshCacheQuery(query); fail("Exception expected"); @@ -943,7 +943,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { WebPageDownloader downloader = chemblParser.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); chemblParser.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, chemblParser.getServiceStatus().getStatus()); } catch (Exception e) { @@ -959,7 +959,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { WebPageDownloader downloader = chemblParser.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("<response><molecules/></response>"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("<response><molecules/></response>"); chemblParser.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, chemblParser.getServiceStatus().getStatus()); } catch (Exception e) { @@ -977,7 +977,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); // valid xml but with empty data - when(mockDownloader.getFromNetwork(anyString())).thenReturn( + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn( "<response><molecules>" + "<molecule><pref_name/><max_phase/><molecule_chembl_id/><molecule_synonyms/></molecule>" + "</molecules><mechanisms/><molecule_forms/></response>"); chemblParser.setWebPageDownloader(mockDownloader); @@ -1016,7 +1016,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("invalid xml"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("invalid xml"); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getTargetsByDrugId(new MiriamData(MiriamType.CHEMBL_COMPOUND, "123")); fail("Exception expected"); @@ -1036,7 +1036,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getTargetsByDrugId(new MiriamData(MiriamType.CHEMBL_COMPOUND, "123")); fail("Exception expected"); @@ -1056,7 +1056,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getDrugListByTarget(new MiriamData(MiriamType.UNIPROT, "O60391")); fail("Exception expected"); @@ -1077,7 +1077,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("invalid xml"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("invalid xml"); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getDrugListByTarget(new MiriamData(MiriamType.UNIPROT, "O60391")); fail("Exception expected"); @@ -1140,7 +1140,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("invalid xml"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("invalid xml"); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getDrugById(new MiriamData(MiriamType.CHEMBL_COMPOUND, "")); fail("Exception expected"); @@ -1160,7 +1160,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getDrugById(new MiriamData(MiriamType.CHEMBL_COMPOUND, "")); fail("Exception expected"); @@ -1193,7 +1193,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getTargetsForChildElements(new MiriamData()); fail("Exception expected"); @@ -1213,7 +1213,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("invalid xml"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("invalid xml"); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getTargetsForChildElements(new MiriamData()); fail("Exception expected"); @@ -1233,7 +1233,7 @@ public class ChEMBLParserTest extends AnnotationTestFunctions { try { chemblParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("<response><molecule_forms><node/></molecule_forms></response>"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("<response><molecule_forms><node/></molecule_forms></response>"); chemblParser.setWebPageDownloader(mockDownloader); chemblParser.getTargetsForChildElements(new MiriamData()); assertEquals(1, getWarnings().size()); diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/ChemicalParserTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/ChemicalParserTest.java index f03eb92e179fd32c00e3ac5686e069374d0d8a32..8fc7c418987177d2d153cd58ca73816a35ef8517 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/ChemicalParserTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/ChemicalParserTest.java @@ -77,7 +77,7 @@ public class ChemicalParserTest extends AnnotationTestFunctions { // skip first call to cache, so we will have to at least parse the data chemicalParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); chemicalParser.setWebPageDownloader(mockDownloader); // Parkinson disease MiriamData diseaseID = new MiriamData(MiriamType.MESH_2012, "D010300"); @@ -431,7 +431,7 @@ public class ChemicalParserTest extends AnnotationTestFunctions { // simulate problem with downloading WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn(""); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(""); chemicalParser.setWebPageDownloader(mockDownloader); chemicalParser.refreshCacheQuery(query); fail("Exception expected"); @@ -460,7 +460,7 @@ public class ChemicalParserTest extends AnnotationTestFunctions { WebPageDownloader downloader = chemicalParser.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); chemicalParser.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, chemicalParser.getServiceStatus().getStatus()); } catch (Exception e) { @@ -476,7 +476,7 @@ public class ChemicalParserTest extends AnnotationTestFunctions { WebPageDownloader downloader = chemicalParser.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn(""); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(""); chemicalParser.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, chemicalParser.getServiceStatus().getStatus()); } catch (Exception e) { @@ -559,7 +559,7 @@ public class ChemicalParserTest extends AnnotationTestFunctions { chemicalParser.setCache(new GeneralCacheWithExclusion(chemicalParser.getCache(), 1)); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); chemicalParser.setWebPageDownloader(mockDownloader); try { chemicalParser.getChemicals(diseaseID, idsList); diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/DrugbankHTMLParserTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/DrugbankHTMLParserTest.java index 98ad19ad4dc01856566b7fefaa0ad30befe659ba..92e47385e96e2b236654cd938046a279d230d407 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/DrugbankHTMLParserTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/DrugbankHTMLParserTest.java @@ -597,7 +597,7 @@ public class DrugbankHTMLParserTest extends AnnotationTestFunctions { WebPageDownloader downloader = drugBankHTMLParser.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); drugBankHTMLParser.setWebPageDownloader(mockDownloader); drugBankHTMLParser.refreshCacheQuery("http://google.pl/"); fail("Exception expected"); @@ -616,7 +616,7 @@ public class DrugbankHTMLParserTest extends AnnotationTestFunctions { GeneralCacheInterface cache = drugBankHTMLParser.getCache(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); drugBankHTMLParser.setWebPageDownloader(mockDownloader); drugBankHTMLParser.setCache(null); @@ -709,7 +709,7 @@ public class DrugbankHTMLParserTest extends AnnotationTestFunctions { WebPageDownloader downloader = drugBankHTMLParser.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); drugBankHTMLParser.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, drugBankHTMLParser.getServiceStatus().getStatus()); } catch (Exception e) { @@ -725,7 +725,7 @@ public class DrugbankHTMLParserTest extends AnnotationTestFunctions { WebPageDownloader downloader = drugBankHTMLParser.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn(""); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(""); drugBankHTMLParser.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, drugBankHTMLParser.getServiceStatus().getStatus()); } catch (Exception e) { diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/MeSHParserTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/MeSHParserTest.java index b0812d94b85ce8118767e20e84aa733981a39179..dad33fc058968a8dbf3b8cb930a39d050941904f 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/MeSHParserTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/MeSHParserTest.java @@ -169,7 +169,7 @@ public class MeSHParserTest extends AnnotationTestFunctions { MiriamData meshID = new MiriamData(MiriamType.MESH_2012, "D004298"); MeSHParser parserUnderTest = new MeSHParser(); WebPageDownloader webPageDownloader = Mockito.mock(WebPageDownloader.class); - when(webPageDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(webPageDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); parserUnderTest.setWebPageDownloader(webPageDownloader); parserUnderTest.getMeSH(meshID); @@ -276,7 +276,7 @@ public class MeSHParserTest extends AnnotationTestFunctions { try { meshParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); meshParser.setWebPageDownloader(mockDownloader); MiriamData meshID = new MiriamData(MiriamType.MESH_2012, "D010300"); @@ -299,7 +299,7 @@ public class MeSHParserTest extends AnnotationTestFunctions { WebPageDownloader downloader = meshParser.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); meshParser.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, meshParser.getServiceStatus().getStatus()); } catch (Exception e) { @@ -315,7 +315,7 @@ public class MeSHParserTest extends AnnotationTestFunctions { WebPageDownloader downloader = meshParser.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new WrongResponseCodeIOException(null, HttpStatus.SC_NOT_FOUND)); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new WrongResponseCodeIOException(null, HttpStatus.SC_NOT_FOUND)); meshParser.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, meshParser.getServiceStatus().getStatus()); } catch (Exception e) { diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/MiriamConnectorTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/MiriamConnectorTest.java index 8814930e8ddd1ff50b723d84098f482f71d18d8c..86d950eeae2c6e0e99f4326ae8a688b830a49046 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/MiriamConnectorTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/MiriamConnectorTest.java @@ -227,7 +227,7 @@ public class MiriamConnectorTest extends AnnotationTestFunctions { // exclude first cached value miriamConnector.setCache(new GeneralCacheWithExclusion(cache, 1)); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); miriamConnector.setWebPageDownloader(mockDownloader); miriamConnector.getUrlString2(TaxonomyBackend.HUMAN_TAXONOMY); @@ -251,7 +251,7 @@ public class MiriamConnectorTest extends AnnotationTestFunctions { // exclude first cached value miriamConnector.setCache(new GeneralCacheWithExclusion(cache, 1)); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn(""); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(""); miriamConnector.setWebPageDownloader(mockDownloader); miriamConnector.getUrlString2(TaxonomyBackend.HUMAN_TAXONOMY); @@ -273,7 +273,7 @@ public class MiriamConnectorTest extends AnnotationTestFunctions { WebPageDownloader downloader = miriamConnector.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); miriamConnector.setWebPageDownloader(mockDownloader); miriamConnector.refreshCacheQuery("http://google.pl/"); fail("Exception expected"); diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/PubmedParserTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/PubmedParserTest.java index 06f813e37e4ee83f231db96b20f68b234ec2f513..bb4b0b68f3e02fc3f3aab621247718b1753bf037 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/PubmedParserTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/PubmedParserTest.java @@ -232,7 +232,7 @@ public class PubmedParserTest extends AnnotationTestFunctions { try { pubmedParser.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); pubmedParser.setWebPageDownloader(mockDownloader); String query = PubmedParser.PUBMED_PREFIX + PubmedParser.SERVICE_STATUS_PUBMED_ID; @@ -289,7 +289,7 @@ public class PubmedParserTest extends AnnotationTestFunctions { WebPageDownloader downloader = pubmedParser.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); pubmedParser.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, pubmedParser.getServiceStatus().getStatus()); } catch (Exception e) { @@ -305,7 +305,7 @@ public class PubmedParserTest extends AnnotationTestFunctions { WebPageDownloader downloader = pubmedParser.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())) + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())) .thenReturn("<responseWrapper><version>" + PubmedParser.SUPPORTED_VERSION + "</version></responseWrapper>"); pubmedParser.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, pubmedParser.getServiceStatus().getStatus()); @@ -322,7 +322,7 @@ public class PubmedParserTest extends AnnotationTestFunctions { WebPageDownloader downloader = pubmedParser.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())) + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())) .thenReturn("<responseWrapper><version>" + PubmedParser.SUPPORTED_VERSION + "blabla</version></responseWrapper>"); pubmedParser.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, pubmedParser.getServiceStatus().getStatus()); @@ -350,7 +350,7 @@ public class PubmedParserTest extends AnnotationTestFunctions { pubmedParser.setCache(null); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("unknown response"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("unknown response"); pubmedParser.setWebPageDownloader(mockDownloader); pubmedParser.getApiVersion(); fail("Exception expected"); @@ -370,7 +370,7 @@ public class PubmedParserTest extends AnnotationTestFunctions { pubmedParser.setCache(null); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("<xml/>"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("<xml/>"); pubmedParser.setWebPageDownloader(mockDownloader); assertNull(pubmedParser.getApiVersion()); } catch (Exception e) { @@ -388,7 +388,7 @@ public class PubmedParserTest extends AnnotationTestFunctions { pubmedParser.setCache(null); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); pubmedParser.setWebPageDownloader(mockDownloader); pubmedParser.getApiVersion(); fail("Exception expected"); diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/TaxonomyBackendTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/TaxonomyBackendTest.java index 611295b0f3c183697a2e537b1b67b8394ce04ddd..3c8b521e144a99725ba4a3d7910c72872828b5dc 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/TaxonomyBackendTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/TaxonomyBackendTest.java @@ -123,7 +123,7 @@ public class TaxonomyBackendTest extends AnnotationTestFunctions { WebPageDownloader downloader = taxonomyBackend.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); taxonomyBackend.setWebPageDownloader(mockDownloader); taxonomyBackend.setCache(null); taxonomyBackend.getNameForTaxonomy(new MiriamData(MiriamType.TAXONOMY, "9606")); @@ -265,7 +265,7 @@ public class TaxonomyBackendTest extends AnnotationTestFunctions { WebPageDownloader downloader = taxonomyBackend.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); taxonomyBackend.setWebPageDownloader(mockDownloader); taxonomyBackend.refreshCacheQuery("http://google.pl/"); fail("Exception expected"); @@ -293,7 +293,7 @@ public class TaxonomyBackendTest extends AnnotationTestFunctions { WebPageDownloader downloader = taxonomyBackend.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); taxonomyBackend.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, taxonomyBackend.getServiceStatus().getStatus()); } catch (Exception e) { @@ -309,7 +309,7 @@ public class TaxonomyBackendTest extends AnnotationTestFunctions { WebPageDownloader downloader = taxonomyBackend.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn(""); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(""); taxonomyBackend.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, taxonomyBackend.getServiceStatus().getStatus()); } catch (Exception e) { @@ -325,7 +325,7 @@ public class TaxonomyBackendTest extends AnnotationTestFunctions { WebPageDownloader downloader = taxonomyBackend.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("<em>Taxonomy ID: </em>1234"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("<em>Taxonomy ID: </em>1234"); taxonomyBackend.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, taxonomyBackend.getServiceStatus().getStatus()); } catch (Exception e) { diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/EnsemblAnnotatorTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/EnsemblAnnotatorTest.java index ffcbd0d3d44f0042f0f4bac79ccfc14e74b6908f..8366b4f6c7766a789235186030f86aa89f126138 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/EnsemblAnnotatorTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/EnsemblAnnotatorTest.java @@ -177,7 +177,7 @@ public class EnsemblAnnotatorTest extends AnnotationTestFunctions { ensemblAnnotator.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); ensemblAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, ensemblAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { @@ -200,7 +200,7 @@ public class EnsemblAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); String dataXml = "<opt></opt>"; String versionXml = "<opt><data release=\"" + EnsemblAnnotator.SUPPORTED_VERSION + "\"/></opt>"; - when(mockDownloader.getFromNetwork(anyString())).thenReturn(dataXml).thenReturn(versionXml); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(dataXml).thenReturn(versionXml); ensemblAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, ensemblAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { @@ -223,7 +223,7 @@ public class EnsemblAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); String dataXml = "<opt></opt>"; String versionXml = "<opt><data release=\"blablabla\"/></opt>"; - when(mockDownloader.getFromNetwork(anyString())).thenReturn(dataXml).thenReturn(versionXml); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(dataXml).thenReturn(versionXml); ensemblAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, ensemblAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { @@ -279,7 +279,7 @@ public class EnsemblAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = ensemblAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new WrongResponseCodeIOException(null, 0)); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new WrongResponseCodeIOException(null, 0)); ensemblAnnotator.setWebPageDownloader(mockDownloader); Species proteinAlias = new GenericProtein("id"); proteinAlias.addMiriamData(new MiriamData(MiriamType.ENSEMBL, "1234")); @@ -302,7 +302,7 @@ public class EnsemblAnnotatorTest extends AnnotationTestFunctions { ensemblAnnotator.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); ensemblAnnotator.setWebPageDownloader(mockDownloader); ensemblAnnotator.refreshCacheQuery("http://google.pl/"); fail("Exception expected"); diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/EntrezAnnotatorTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/EntrezAnnotatorTest.java index 40b24bc0e229e5a026e377b048fb0cbd2b9c649a..be988ab5020c6a4ae950d3184a2d05e82f1693e6 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/EntrezAnnotatorTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/EntrezAnnotatorTest.java @@ -141,7 +141,7 @@ public class EntrezAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = entrezAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); entrezAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, entrezAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { @@ -270,7 +270,7 @@ public class EntrezAnnotatorTest extends AnnotationTestFunctions { entrezAnnotator.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); entrezAnnotator.setWebPageDownloader(mockDownloader); entrezAnnotator.refreshCacheQuery("http://google.pl/"); fail("Exception expected"); @@ -293,7 +293,7 @@ public class EntrezAnnotatorTest extends AnnotationTestFunctions { entrezAnnotator.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); entrezAnnotator.setWebPageDownloader(mockDownloader); entrezAnnotator.refreshCacheQuery(EntrezAnnotator.ENTREZ_DATA_PREFIX + "6647"); fail("Exception expected"); @@ -359,7 +359,7 @@ public class EntrezAnnotatorTest extends AnnotationTestFunctions { entrezAnnotator.setCache(null); String response = super.readFile("testFiles/annotation/entrezResponse.xml"); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn(response); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(response); entrezAnnotator.setWebPageDownloader(mockDownloader); EntrezData data = entrezAnnotator.getEntrezForMiriamData(new MiriamData(), ""); boolean ensembl = false; @@ -394,7 +394,7 @@ public class EntrezAnnotatorTest extends AnnotationTestFunctions { entrezAnnotator.setCache(null); String response = ""; WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn(response); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(response); entrezAnnotator.setWebPageDownloader(mockDownloader); entrezAnnotator.getEntrezForMiriamData(new MiriamData(), ""); fail("Exception expected"); @@ -416,7 +416,7 @@ public class EntrezAnnotatorTest extends AnnotationTestFunctions { try { entrezAnnotator.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new WrongResponseCodeIOException(null, 404)); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new WrongResponseCodeIOException(null, 404)); entrezAnnotator.setWebPageDownloader(mockDownloader); entrezAnnotator.getEntrezForMiriamData(new MiriamData(), ""); fail("Exception expected"); diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/GoAnnotatorTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/GoAnnotatorTest.java index ce4045811d0c0d2e4de8c34a71092946ed8d1e00..3f410c345bc04e18408c2bb29af39dab5dbc908f 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/GoAnnotatorTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/GoAnnotatorTest.java @@ -82,7 +82,7 @@ public class GoAnnotatorTest extends AnnotationTestFunctions { GoAnnotator annotator = new GoAnnotator(); annotator.setMc(goAnnotator.getMc()); WebPageDownloader downloader = Mockito.mock(WebPageDownloader.class); - when(downloader.getFromNetwork(anyString())).thenReturn(""); + when(downloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(""); annotator.setWebPageDownloader(downloader); annotator.getGoElement(md); fail("Exception expected"); @@ -126,7 +126,7 @@ public class GoAnnotatorTest extends AnnotationTestFunctions { goAnnotator.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); goAnnotator.setWebPageDownloader(mockDownloader); goAnnotator.refreshCacheQuery("http://google.pl/"); fail("Exception expected"); @@ -192,7 +192,7 @@ public class GoAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = goAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); goAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, goAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { @@ -208,7 +208,7 @@ public class GoAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = goAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("<obo><term><name/><def><defstr/></def></term></obo>"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("<obo><term><name/><def><defstr/></def></term></obo>"); goAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, goAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { @@ -224,7 +224,7 @@ public class GoAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = goAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("<obo><term><name>some_name</name><def><defstr/></def></term></obo>"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("<obo><term><name>some_name</name><def><defstr/></def></term></obo>"); goAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, goAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/HgncAnnotatorTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/HgncAnnotatorTest.java index d9c60e80eadcfb8f3a1707c8b434bbbf7a13d6d9..2a286755299c830ffaa48e1c6a8ba7157c467f2c 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/HgncAnnotatorTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/HgncAnnotatorTest.java @@ -496,7 +496,7 @@ public class HgncAnnotatorTest extends AnnotationTestFunctions { hgncAnnotator.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); hgncAnnotator.setWebPageDownloader(mockDownloader); hgncAnnotator.refreshCacheQuery("http://google.pl/"); fail("Exception expected"); @@ -515,7 +515,7 @@ public class HgncAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = hgncAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); hgncAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, hgncAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { @@ -531,7 +531,7 @@ public class HgncAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = hgncAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("<response><result/></response>"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("<response><result/></response>"); hgncAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, hgncAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/ReconAnnotatorTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/ReconAnnotatorTest.java index 78fe4d4a99c7f8b02e0467cf0fdd345543fc140e..b70fe82bdfabbcbfa40783db536a92d0c659e17f 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/ReconAnnotatorTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/ReconAnnotatorTest.java @@ -83,7 +83,7 @@ public class ReconAnnotatorTest extends AnnotationTestFunctions { reconAnnotator.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn(""); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(""); reconAnnotator.setWebPageDownloader(mockDownloader); reconAnnotator.annotateElement(ion); @@ -112,7 +112,7 @@ public class ReconAnnotatorTest extends AnnotationTestFunctions { String response = super.readFile("testFiles/annotation/recon_reaction_response.json"); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn(response); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(response); reconAnnotator.setWebPageDownloader(mockDownloader); reconAnnotator.annotateElement(ion); @@ -142,7 +142,7 @@ public class ReconAnnotatorTest extends AnnotationTestFunctions { String response = super.readFile("testFiles/annotation/recon_chemical_response.json"); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn(response); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(response); reconAnnotator.setWebPageDownloader(mockDownloader); reconAnnotator.annotateElement(reaction); @@ -282,7 +282,7 @@ public class ReconAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = reconAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); reconAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, reconAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { @@ -298,7 +298,7 @@ public class ReconAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = reconAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("{\"results\":[{}]}"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("{\"results\":[{}]}"); reconAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, reconAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { @@ -314,7 +314,7 @@ public class ReconAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = reconAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("{\"results\":[{\"keggId\":\"C00001\",\"xxx\":\"yyy\"}]}"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("{\"results\":[{\"keggId\":\"C00001\",\"xxx\":\"yyy\"}]}"); reconAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, reconAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { @@ -334,7 +334,7 @@ public class ReconAnnotatorTest extends AnnotationTestFunctions { reconAnnotator.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); reconAnnotator.setWebPageDownloader(mockDownloader); reconAnnotator.refreshCacheQuery("http://google.pl/"); fail("Exception expected"); diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/UniprotAnnotatorTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/UniprotAnnotatorTest.java index 8f7b2edc3bde536c68846e5529e046a16038b830..c27be152ae03470035eab296978d066bcdcd7488 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/UniprotAnnotatorTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/annotators/UniprotAnnotatorTest.java @@ -240,7 +240,7 @@ public class UniprotAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = uniprotAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); uniprotAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, uniprotAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { @@ -258,7 +258,7 @@ public class UniprotAnnotatorTest extends AnnotationTestFunctions { uniprotAnnotator.setCache(new GeneralCacheWithExclusion(cache, 1)); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); uniprotAnnotator.setWebPageDownloader(mockDownloader); Species protein = new GenericProtein("id"); protein.addMiriamData(new MiriamData(MiriamType.UNIPROT, "P01308")); @@ -279,7 +279,7 @@ public class UniprotAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = uniprotAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn(""); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn(""); uniprotAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.DOWN, uniprotAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { @@ -295,7 +295,7 @@ public class UniprotAnnotatorTest extends AnnotationTestFunctions { WebPageDownloader downloader = uniprotAnnotator.getWebPageDownloader(); try { WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenReturn("GN Name=ACSS2; Synonyms=ACAS2;"); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenReturn("GN Name=ACSS2; Synonyms=ACAS2;"); uniprotAnnotator.setWebPageDownloader(mockDownloader); assertEquals(ExternalServiceStatusType.CHANGED, uniprotAnnotator.getServiceStatus().getStatus()); } catch (Exception e) { diff --git a/annotation/src/test/java/lcsb/mapviewer/annotation/services/genome/UcscReferenceGenomeConnectorTest.java b/annotation/src/test/java/lcsb/mapviewer/annotation/services/genome/UcscReferenceGenomeConnectorTest.java index c27bb7764c643c7b9290e1fabd8dc48fea5a387a..5ff31b7460e125167a6e4df0574204fe723c3de1 100644 --- a/annotation/src/test/java/lcsb/mapviewer/annotation/services/genome/UcscReferenceGenomeConnectorTest.java +++ b/annotation/src/test/java/lcsb/mapviewer/annotation/services/genome/UcscReferenceGenomeConnectorTest.java @@ -146,7 +146,7 @@ public class UcscReferenceGenomeConnectorTest extends AnnotationTestFunctions { connector.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); connector.setWebPageDownloader(mockDownloader); connector.getAvailableOrganisms(); fail("Exception expected"); @@ -760,7 +760,7 @@ public class UcscReferenceGenomeConnectorTest extends AnnotationTestFunctions { // exclude first cached value connector.setCache(null); WebPageDownloader mockDownloader = Mockito.mock(WebPageDownloader.class); - when(mockDownloader.getFromNetwork(anyString())).thenThrow(new IOException()); + when(mockDownloader.getFromNetwork(anyString(), anyString(), anyString())).thenThrow(new IOException()); connector.setWebPageDownloader(mockDownloader); connector.refreshCacheQuery("http://google.pl/"); fail("Exception expected"); diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/ImageGenerators.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/ImageGenerators.java index def4fbc887b886ef0abcce359c77e7b2ea308ba3..96bc681dfb4643be61cea44c3d3128d5eff44e00 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/ImageGenerators.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/ImageGenerators.java @@ -54,7 +54,7 @@ public class ImageGenerators { generatorInstances = new ArrayList<>(); generatorInstances.add(new PngImageGenerator(params)); generatorInstances.add(new PdfImageGenerator(params)); - // generatorInstances.add(new SvgImageGenerator(params)); + generatorInstances.add(new SvgImageGenerator(params)); // generatorInstances.add(new JpgImageGenerator(params)); for (AbstractImageGenerator abstractImageGenerator : generatorInstances) { availableGenerators diff --git a/frontend-js/.idea/codeStyleSettings.xml b/frontend-js/.idea/codeStyleSettings.xml new file mode 100644 index 0000000000000000000000000000000000000000..5555dd266682059e1b1fed89915c4ef70b2bba45 --- /dev/null +++ b/frontend-js/.idea/codeStyleSettings.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectCodeStyleSettingsManager"> + <option name="PER_PROJECT_SETTINGS"> + <value /> + </option> + <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" /> + </component> +</project> \ No newline at end of file diff --git a/frontend-js/.idea/frontend-js.iml b/frontend-js/.idea/frontend-js.iml index 24643cc37449b4bde54411a80b8ed61258225e34..b6d6506e8893d7574cd478c3f94f16a0d3a0f679 100644 --- a/frontend-js/.idea/frontend-js.iml +++ b/frontend-js/.idea/frontend-js.iml @@ -4,6 +4,7 @@ <content url="file://$MODULE_DIR$"> <excludeFolder url="file://$MODULE_DIR$/.tmp" /> <excludeFolder url="file://$MODULE_DIR$/temp" /> + <excludeFolder url="file://$MODULE_DIR$/dist" /> <excludeFolder url="file://$MODULE_DIR$/tmp" /> </content> <orderEntry type="inheritedJdk" /> diff --git a/frontend-js/.idea/preferred-vcs.xml b/frontend-js/.idea/preferred-vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..848cfc44550cbfba31b047a54bb77ecd25feb0c7 --- /dev/null +++ b/frontend-js/.idea/preferred-vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="PreferredVcsStorage"> + <preferredVcsName>ApexVCS</preferredVcsName> + </component> +</project> \ No newline at end of file diff --git a/frontend-js/package.json b/frontend-js/package.json index 06d8f040f920227de9465f5986979172a0e8d438..f6835c3aa6fbc7e47cdfce0cc8f261720d330d01 100644 --- a/frontend-js/package.json +++ b/frontend-js/package.json @@ -26,9 +26,9 @@ "exorcist": "^0.4.0", "file-url": "^2.0.0", "istanbul": "0.4.5", - "jquery": "3.1.1", - "jquery-ui-dist": "^1.12.1", - "jsdom": "^11.1.0", + "jquery": "1.12.1", + "jquery-ui-dist": "1.12.1", + "jsdom": "11.1.0", "jsdom-global": "^2.1.1", "jshint": "^2.9.4", "log4js-memory-appender": "1.0.5", @@ -37,7 +37,8 @@ }, "dependencies": { "del": "^3.0.0", - "dual-listbox": "^1.0.3", + "dual-listbox": "^1.0.7", + "file-saver": "^1.3.3", "http-status-codes": "^1.1.6", "js-cookie": "^2.1.3", "log4js": "0.6.38", diff --git a/frontend-js/src/main/js/Export.js b/frontend-js/src/main/js/Export.js index e425dbb06dd9c436840e07ad3b93aa501c9d48d9..d2233fc56f90e66111ccfa589b2337d247e69ff5 100644 --- a/frontend-js/src/main/js/Export.js +++ b/frontend-js/src/main/js/Export.js @@ -24,6 +24,7 @@ var Functions = require('./Functions'); function Export(options) { var self = this; self._panels = []; + self._tabIdCount = 0; if (!(options instanceof CustomMapOptions)) { options = new CustomMapOptions(options); } @@ -90,7 +91,7 @@ Export.prototype.addTab = function(params, navElement, contentElement) { var name = params.name; - var tabId = "left_panel_ab_" + this._tabIdCount; + var tabId = "export_panel_tab_" + this._tabIdCount; self._tabIdCount++; var navClass = ''; @@ -130,7 +131,7 @@ Export.prototype.addTab = function(params, navElement, contentElement) { this._panels.push(new params.panelClass({ element : contentDiv, project : self.getProject(), - configuration: self.getConfiguration(), + configuration : self.getConfiguration(), })); }; diff --git a/frontend-js/src/main/js/GuiConnector.js b/frontend-js/src/main/js/GuiConnector.js index f89dd7c10d0586264413dd6af7eb1b8bb62be362..1e05d57715704904ae833534af9e89bb1f08c29a 100644 --- a/frontend-js/src/main/js/GuiConnector.js +++ b/frontend-js/src/main/js/GuiConnector.js @@ -4,6 +4,7 @@ var logger = require('./logger'); var Functions = require('./Functions'); var SecurityError = require('./SecurityError'); +var GuiMessageError = require('./gui/GuiMessageError'); var NetworkError = require('./NetworkError'); /** @@ -177,6 +178,8 @@ GuiConnector.alert = function (error) { } var message = error; if (message instanceof SecurityError) { + message = error.message + "<p>Please <a href=\"login.xhtml\">login</a> to access this resuorce</p>"; + } else if (message instanceof GuiMessageError) { message = error.message + "<p>Please <a href=\"login.xhtml\">login</a> to access this resource</p>"; } else if (message instanceof NetworkError && (error.message === "XHR error" || error.message === "Failed to fetch")) { message = "File to big.<br>Please reduce file size or contact administrators."; diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index 8e87692ac119f866cd3cd88cbddd4783c1dfafba..b7454ef5074a92c0c1c33437a43a4ab95854b3e1 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -248,15 +248,14 @@ ServerConnector.getToken = function (token) { var self = this; token = self.getSessionData(null).getToken(); - if (token === undefined) { + var login = self.getSessionData(null).getLogin() + if (token === undefined || login === undefined) { return self.login(); } else { // if the project is not initialized then check if we can download data // using current token if (self.getSessionData().getProject() === null) { - return self.getConfiguration({ - token: token - }).then(function () { + return self.getConfiguration().then(function () { return token; }, function () { return self.login(); @@ -376,6 +375,12 @@ ServerConnector.loginUrl = function () { }); }; +ServerConnector.logoutUrl = function () { + return this.getApiUrl({ + type: "/doLogout", + }); +}; + ServerConnector.getSuggestedQueryListUrl = function (queryParams, filterParams) { return this.getApiUrl({ url: this.getBioEntitiesUrl(queryParams) + "suggestedQueryList/", @@ -603,10 +608,7 @@ ServerConnector.getUserUrl = function (queryParams, filterParams) { }); }; -ServerConnector.getConfiguration = function (params) { - if (params === undefined) { - params = {}; - } +ServerConnector.getConfiguration = function () { var self = this; if (this._configuration === undefined) { return self.readFile(self.getConfigurationUrl()).then(function (content) { @@ -836,6 +838,12 @@ ServerConnector.getOverlayById = function (overlayId, projectId) { ServerConnector.getReactions = function (params) { var self = this; var queryParams = {}; + if (params.ids === undefined) { + params.ids = []; + } + if (params.participantId === undefined) { + params.participantId = []; + } var filterParams = { id: params.ids, columns: params.columns, @@ -843,7 +851,12 @@ ServerConnector.getReactions = function (params) { }; return self.getProjectId(params.projectId).then(function (result) { queryParams.projectId = result; - return self.readFile(self.getReactionsUrl(queryParams, filterParams)); + if (filterParams.id.length > 100 || filterParams.participantId.length > 100) { + return self.sendPostRequest(self.getReactionsUrl(queryParams), filterParams); + } else { + return self.readFile(self.getReactionsUrl(queryParams, filterParams)); + } + }).then(function (content) { var array = JSON.parse(content); var result = []; @@ -862,10 +875,19 @@ ServerConnector.getAliases = function (params) { if (params.ids === undefined) { params.ids = []; } + if (params.includedCompartmentIds === undefined) { + params.includedCompartmentIds = []; + } + if (params.excludedCompartmentIds === undefined) { + params.excludedCompartmentIds = []; + } var filterParams = { id: params.ids, columns: params.columns, type: params.type, + excludedCompartmentIds: params.excludedCompartmentIds, + includedCompartmentIds: params.includedCompartmentIds, + }; return self.getProjectId(params.projectId).then(function (result) { queryParams.projectId = result; @@ -947,7 +969,7 @@ ServerConnector.getClosestElementsByCoordinates = function (params) { ServerConnector.login = function (login, password) { var self = this; var params = {}; - if (login !== undefined) { + if (login !== undefined && login !== "") { params.login = login; params.password = password; } else { @@ -970,7 +992,7 @@ ServerConnector.logout = function () { var self = this; self.getSessionData().setToken(undefined); self.getSessionData().setLogin(undefined); - return Promise.resolve(); + return self.readFile(self.logoutUrl()); }; ServerConnector.getElementsByQuery = function (params) { diff --git a/frontend-js/src/main/js/gui/GuiMessageError.js b/frontend-js/src/main/js/gui/GuiMessageError.js new file mode 100644 index 0000000000000000000000000000000000000000..52ccf03be23abafbcad02be87411e6aeea94734d --- /dev/null +++ b/frontend-js/src/main/js/gui/GuiMessageError.js @@ -0,0 +1,15 @@ +"use strict"; + +/* exported logger */ + +var logger = require('../logger'); + +function GuiMessageError(message) { + this.message = message; + this.stack = (new Error()).stack; +} + +GuiMessageError.prototype = Object.create(Error.prototype); +GuiMessageError.prototype.constructor = GuiMessageError; + +module.exports = GuiMessageError; diff --git a/frontend-js/src/main/js/gui/export/AbstractExportPanel.js b/frontend-js/src/main/js/gui/export/AbstractExportPanel.js new file mode 100644 index 0000000000000000000000000000000000000000..c55f8063bcd6e589b72962ebd8e3cb77c07a7680 --- /dev/null +++ b/frontend-js/src/main/js/gui/export/AbstractExportPanel.js @@ -0,0 +1,445 @@ +"use strict"; + +/* exported logger */ + +var Panel = require('../Panel'); + +var GuiConnector = require('../../GuiConnector'); +var logger = require('../../logger'); +var Functions = require('../../Functions'); +var DualListbox = require('dual-listbox').DualListbox; +var Promise = require("bluebird"); + +function AbstractExportPanel(params) { + params.scrollable = true; + Panel.call(this, params); + +} + +AbstractExportPanel.prototype = Object.create(Panel.prototype); +AbstractExportPanel.prototype.constructor = AbstractExportPanel; + +AbstractExportPanel.prototype.init = function() { + +}; + +function compareSimple(val1, val2) { + if (val1 < val2) { + return -1; + } else if (val1 > val2) { + return 1; + } else { + return 0; + } +} + +AbstractExportPanel.prototype._createMiriamTypeDiv = function(annotations) { + var self = this; + var typeDiv = Functions.createElement({ + type : "div", + name : "miriamSelectDiv", + className : "minerva-export-dual-listbox-container", + }); + typeDiv.appendChild(Functions.createElement({ + type : "h4", + content : " Annotations:", + })); + + var selectElement = Functions.createElement({ + type : "select", + className : "minerva-multi-select", + }); + typeDiv.appendChild(selectElement); + + function compare(entry1, entry2) { + if ((entry1.count === 0 && entry2.count === 0) || (entry1.count !== 0 && entry2.count !== 0)) { + return compareSimple(entry1.miriamType.getCommonName(), entry2.miriamType.getCommonName()); + } else { + return compareSimple(-entry1.count, -entry2.count); + } + } + annotations.sort(compare); + + for (var i = 0; i < annotations.length; i++) { + var miriamType = annotations[i].miriamType; + var count = annotations[i].count; + + var option = new Option(); + option.value = miriamType.getName(); + if (count > 0) { + option.innerHTML = "<div class='minerva-multi-select-special'>" + miriamType.getCommonName() + " (" + count + + ")</div>"; + } else { + option.innerHTML = "<div >" + miriamType.getCommonName() + "</div>"; + } + selectElement.appendChild(option); + } + + self.setMiriamTypesDualListbox(self.createDualListbox(selectElement)); + return typeDiv; +}; + +AbstractExportPanel.prototype.createDualListbox = function(selectElement) { + return new DualListbox(selectElement, { + availableTitle : 'Available', + selectedTitle : 'Used', + addButtonText : '>', + removeButtonText : '<', + addAllButtonText : '>>', + removeAllButtonText : '<<' + }); +}; + +AbstractExportPanel.prototype._createSelectTypeDiv = function(elementTypes) { + var typeDiv = Functions.createElement({ + type : "div", + name : "typeSelectDiv", + }); + typeDiv.appendChild(Functions.createElement({ + type : "h4", + content : " TYPE:", + })); + var choicesContainer = Functions.createElement({ + type : "ul", + className : "minerva-checkbox-grid" + }); + typeDiv.appendChild(choicesContainer); + for (var i = 0; i < elementTypes.length; i++) { + var elementType = elementTypes[i]; + var row = Functions.createElement({ + type : "li", + content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"" + elementType + "\" value=\"" + + elementType + "\" />" + elementType + "</label></div>" + }); + choicesContainer.appendChild(row); + } + choicesContainer.appendChild(Functions.createElement({ + type : "li", + content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"ALL\" value=\"ALL\" />ALL</label></div>" + })); + return typeDiv; +}; + +AbstractExportPanel.prototype.getSelectedTypes = function() { + var self = this; + + var div = $("div[name='typeSelectDiv']", $(self.getElement()))[0]; + var result = []; + var selectedAll = false; + $(":checked", $(div)).each(function(index, element) { + if (element.value === "ALL") { + selectedAll = true; + } + result.push(element.value); + }); + if (selectedAll) { + return ServerConnector.getConfiguration().then(function(configuration) { + return configuration.getElementTypes(); + }); + } + + return Promise.resolve(result); +}; + +AbstractExportPanel.prototype.setMiriamTypesDualListbox = function(dualListbox) { + this._miriamTypesDualListbox = dualListbox; +}; +AbstractExportPanel.prototype.getMiriamTypesDualListbox = function() { + return this._miriamTypesDualListbox; +}; + +AbstractExportPanel.prototype._createSelectColumnDiv = function(columnTypes) { + var columnDiv = Functions.createElement({ + type : "div", + name : "columnSelectDiv", + }); + columnDiv.appendChild(Functions.createElement({ + type : "h4", + content : " COLUMN:", + })); + var choicesContainer = Functions.createElement({ + type : "ul", + className : "minerva-checkbox-grid" + }); + + columnDiv.appendChild(choicesContainer); + for (var i = 0; i < columnTypes.length; i++) { + var columnType = columnTypes[i]; + var row = Functions.createElement({ + type : "li", + content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"column_" + columnType.columnName + + "\" value=\"" + columnType.columnName + "\" />" + columnType.name + "</label></div>" + }); + choicesContainer.appendChild(row); + } + choicesContainer.appendChild(Functions.createElement({ + type : "li", + content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"ALL\" value=\"ALL\" />ALL</label></div>" + })); + return columnDiv; +}; + +AbstractExportPanel.prototype.getSelectedMiriamTypes = function() { + var self = this; + return ServerConnector.getConfiguration().then(function(configuration) { + var selected = self.getMiriamTypesDualListbox().selected; + var result = []; + for (var i = 0; i < selected.length; i++) { + var miriamType = configuration.getMiriamTypeByName(selected[i].dataset.id); + result.push(miriamType); + } + return result; + }); +}; + +AbstractExportPanel.prototype.getSelectedColumns = function() { + var self = this; + + var div = $("div[name='columnSelectDiv']", $(self.getElement()))[0]; + var selectedColumnMap = []; + var selectedAll = false; + $(":checked", $(div)).each(function(index, element) { + if (element.value === "ALL") { + selectedAll = true; + } + selectedColumnMap[element.value] = true; + }); + var columnTypes = self.getAllColumns(); + + if (selectedAll) { + return Promise.resolve(columnTypes); + } + + var result = []; + + for (var i = 0; i < columnTypes.length; i++) { + var columnType = columnTypes[i]; + if (selectedColumnMap[columnType.columnName] === true) { + result.push(columnType); + } + } + return Promise.resolve(result); +}; + +AbstractExportPanel.prototype._getCompartmentNames = function() { + var self = this; + var compartments = []; + return self._getAllCompartments().then(function(result) { + + var addedNames = []; + for (var i = 0; i < result.length; i++) { + if (addedNames[result[i].getName()] === undefined) { + compartments.push(result[i].getName()); + addedNames[result[i].getName()] = true; + } + } + compartments.sort(compareSimple); + return compartments; + }); +}; + +AbstractExportPanel.prototype.getModels = function() { + var self = this; + var models = [ self.getProject().getModel() ]; + for (var i = 0; i < self.getProject().getModel().getSubmodels().length; i++) { + models.push(self.getProject().getModel().getSubmodels()[i]); + } + return models; +}; + +AbstractExportPanel.prototype._getAllCompartments = function() { + var self = this; + var compartments = []; + + var models = self.getModels(); + + var promises = []; + for (var i = 0; i < models.length; i++) { + promises.push(models[i].getCompartments()); + } + + return Promise.all(promises).then(function(result) { + for (var i = 0; i < result.length; i++) { + var modelCompartments = result[i]; + for (var j = 0; j < modelCompartments.length; j++) { + compartments.push(modelCompartments[j]); + } + } + return compartments; + }); +}; + +AbstractExportPanel.prototype._createDownloadButton = function() { + var self = this; + var downloadDiv = Functions.createElement({ + type : "div", + name : "downloadDiv", + style : "clear:both; padding: 10px;", + }); + var button = Functions.createElement({ + type : "button", + name : "downloadButton", + content : " Download", + onclick : function() { + GuiConnector.showProcessing(); + return self.createResponseString().then(function(result) { + var blob = new Blob([ result ], { + type : "text/plain;charset=utf-8" + }); + var FileSaver = require("file-saver"); + return FileSaver.saveAs(blob, self.getSaveFilename()); + }).then(function() { + GuiConnector.hideProcessing(); + }, function(error) { + GuiConnector.hideProcessing(); + GuiConnector.alert(error); + }); + }, + }); + downloadDiv.appendChild(button); + + return downloadDiv; +}; + +AbstractExportPanel.prototype.getSaveFilename = function() { + var self = this; + return self.getProject().getProjectId() + "-" + self.getPanelName() + ".txt"; +}; + +AbstractExportPanel.prototype._createSelectIncludedCompartmentDiv = function() { + var self = this; + var typeDiv = Functions.createElement({ + type : "div", + name : "includedCompartmentSelectDiv", + className : "minerva-export-dual-listbox-container", + }); + typeDiv.appendChild(Functions.createElement({ + type : "h4", + content : " Included compartment/pathways:", + })); + + return self._getCompartmentNames().then(function(compartmentNames) { + + var selectElement = Functions.createElement({ + type : "select", + className : "minerva-multi-select", + }); + typeDiv.appendChild(selectElement); + + for (var i = 0; i < compartmentNames.length; i++) { + var name = compartmentNames[i]; + + var option = new Option(); + option.value = name; + option.innerHTML = "<div >" + name + "</div>"; + selectElement.appendChild(option); + } + self.setIncludedCompartmentsDualListbox(self.createDualListbox(selectElement)); + return typeDiv; + }); +}; + +AbstractExportPanel.prototype._createSelectExcludedCompartmentDiv = function() { + var self = this; + var typeDiv = Functions.createElement({ + type : "div", + name : "excludedCompartmentSelectDiv", + className : "minerva-export-dual-listbox-container", + }); + typeDiv.appendChild(Functions.createElement({ + type : "h4", + content : " Excluded compartment/pathways:", + })); + + return self._getCompartmentNames().then(function(compartmentNames) { + + var selectElement = Functions.createElement({ + type : "select", + className : "minerva-multi-select", + }); + typeDiv.appendChild(selectElement); + + for (var i = 0; i < compartmentNames.length; i++) { + var name = compartmentNames[i]; + + var option = new Option(); + option.value = name; + option.innerHTML = "<div >" + name + "</div>"; + selectElement.appendChild(option); + } + self.setExcludedCompartmentsDualListbox(self.createDualListbox(selectElement)); + return typeDiv; + }); +}; + +AbstractExportPanel.prototype.setIncludedCompartmentsDualListbox = function(dualListbox) { + this._includedCompartmentsDualListbox = dualListbox; +}; +AbstractExportPanel.prototype.getIncludedCompartmentsDualListbox = function() { + return this._includedCompartmentsDualListbox; +}; + +AbstractExportPanel.prototype.getSelectedIncludedCompartments = function() { + var self = this; + var list = self.getIncludedCompartmentsDualListbox().selected; + var names = []; + var result = []; + for (var i = 0; i < list.length; i++) { + var element = list[i]; + names[element.dataset.id] = true; + } + return self._getAllCompartments().then(function(compartments) { + for (var i = 0; i < compartments.length; i++) { + var compartment = compartments[i]; + if (names[compartment.getName()]) { + result.push(compartment); + } + } + return result; + }); +}; + +AbstractExportPanel.prototype.setExcludedCompartmentsDualListbox = function(dualListbox) { + this._excludedCompartmentsDualListbox = dualListbox; +}; +AbstractExportPanel.prototype.getExcludedCompartmentsDualListbox = function() { + return this._excludedCompartmentsDualListbox; +}; + +AbstractExportPanel.prototype.getSelectedExcludedCompartments = function() { + var self = this; + var list = self.getExcludedCompartmentsDualListbox().selected; + var names = []; + var result = []; + for (var i = 0; i < list.length; i++) { + var element = list[i]; + names[element.dataset.id] = true; + } + return self._getAllCompartments().then(function(compartments) { + for (var i = 0; i < compartments.length; i++) { + var compartment = compartments[i]; + if (names[compartment.getName()]) { + result.push(compartment); + } + } + return result; + }); +}; + +AbstractExportPanel.prototype.createResponseHeader = function(columns, miriamTypes) { + var stringBuilder = []; + var i; + for (i = 0; i < columns.length; i++) { + var column = columns[i]; + stringBuilder.push(column.name); + } + for (i = 0; i < miriamTypes.length; i++) { + var miriamType = miriamTypes[i]; + stringBuilder.push(miriamType.getCommonName()); + } + var result = stringBuilder.join("\t"); + return result; + +}; + +module.exports = AbstractExportPanel; diff --git a/frontend-js/src/main/js/gui/export/ElementExportPanel.js b/frontend-js/src/main/js/gui/export/ElementExportPanel.js index c38301e725da2fb0b0c9198502dcf3afd031cc4f..59868a6b1ba66ad71ef3c8ae2247ff815f027c4b 100644 --- a/frontend-js/src/main/js/gui/export/ElementExportPanel.js +++ b/frontend-js/src/main/js/gui/export/ElementExportPanel.js @@ -2,40 +2,21 @@ /* exported logger */ -var Panel = require('../Panel'); +var AbstractExportPanel = require('./AbstractExportPanel'); +var GuiMessageError = require('../GuiMessageError'); -var DualListbox = require('dual-listbox').DualListbox; var logger = require('../../logger'); -var Functions = require('../../Functions'); var Promise = require("bluebird"); function ElementExportPanel(params) { params.panelName = "elementExport"; - params.scrollable = true; - Panel.call(this, params); - - var self = this; - self._createGui(); + AbstractExportPanel.call(this, params); } -ElementExportPanel.prototype = Object.create(Panel.prototype); +ElementExportPanel.prototype = Object.create(AbstractExportPanel.prototype); ElementExportPanel.prototype.constructor = ElementExportPanel; -function compareSimple(val1, val2) { - if (val1 < val2) { - return -1; - } else if (val1 > val2) { - return 1; - } else { - return 0; - } -} - -ElementExportPanel.prototype._createGui = function() { - -}; - ElementExportPanel.prototype.init = function() { var self = this; var element = self.getElement(); @@ -44,148 +25,29 @@ ElementExportPanel.prototype.init = function() { configuration = result; var typeDiv = self._createSelectTypeDiv(configuration.getElementTypes()); element.appendChild(typeDiv); - element.appendChild(self._createSelectColumnDiv()); + element.appendChild(self._createSelectColumnDiv(self.getAllColumns())); return ServerConnector.getProjectStatistics(self.getProject().getProjectId()); }).then(function(statistics) { - var miriamDiv = self._createMiriamTypeDiv(statistics); - element.appendChild(miriamDiv); - self.setMiriamTypesDualListbox(new DualListbox("#miriamTypeSelect", { - availableTitle : 'Available', - selectedTitle : 'Used', - addButtonText : '>', - removeButtonText : '<', - addAllButtonText : '>>', - removeAllButtonText : '<<' - })); - }).then(function() { + return self._createMiriamTypeDiv(statistics.getElementAnnotations()); + }).then(function(div) { + element.appendChild(div); return self._createSelectIncludedCompartmentDiv(); - }).then(function(selectIncludedCompartmentDiv) { - element.appendChild(selectIncludedCompartmentDiv); - self.setIncludedCompartmentsDualListbox(new DualListbox("#includedCompartmentsSelect", { - availableTitle : 'Available', - selectedTitle : 'Used', - addButtonText : '>', - removeButtonText : '<', - addAllButtonText : '>>', - removeAllButtonText : '<<' - })); + }).then(function(div) { + element.appendChild(div); return self._createSelectExcludedCompartmentDiv(); - }).then(function(selectExcludedCompartmentDiv) { - element.appendChild(selectExcludedCompartmentDiv); - self.setExcludedCompartmentsDualListbox(new DualListbox("#excludedCompartmentsSelect", { - availableTitle : 'Available', - selectedTitle : 'Used', - addButtonText : '>', - removeButtonText : '<', - addAllButtonText : '>>', - removeAllButtonText : '<<' - })); + }).then(function(div) { + element.appendChild(div); element.appendChild(self._createDownloadButton()); }).then(function() { $(window).trigger('resize'); }); }; -ElementExportPanel.prototype._createSelectTypeDiv = function(elementTypes) { - var typeDiv = Functions.createElement({ - type : "div", - name : "typeSelectDiv", - }); - typeDiv.appendChild(Functions.createElement({ - type : "h4", - content : " TYPE:", - })); - var choicesContainer = Functions.createElement({ - type : "ul", - className : "minerva-checkbox-grid" - }); - typeDiv.appendChild(choicesContainer); - for (var i = 0; i < elementTypes.length; i++) { - var elementType = elementTypes[i]; - var row = Functions.createElement({ - type : "li", - content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"" + elementType + "\" value=\"" - + elementType + "\" />" + elementType + "</label></div>" - }); - choicesContainer.appendChild(row); - } - choicesContainer.appendChild(Functions.createElement({ - type : "li", - content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"ALL\" value=\"ALL\" />ALL</label></div>" - })); - return typeDiv; -}; - -ElementExportPanel.prototype._createMiriamTypeDiv = function(statistics) { - var typeDiv = Functions.createElement({ - type : "div", - name : "miriamSelectDiv", - className : "minerva-export-dual-listbox-container", - }); - typeDiv.appendChild(Functions.createElement({ - type : "h4", - content : " Annotations:", - })); - - var annotations = statistics.getElementAnnotations(); - - var selectElement = Functions.createElement({ - type : "select", - className : "minerva-multi-select", - id : "miriamTypeSelect", - }); - typeDiv.appendChild(selectElement); - - function compare(entry1, entry2) { - if ((entry1.count === 0 && entry2.count === 0) || (entry1.count !== 0 && entry2.count !== 0)) { - return compareSimple(entry1.miriamType.getCommonName(), entry2.miriamType.getCommonName()); - } else { - return compareSimple(-entry1.count, -entry2.count); - } - } - annotations.sort(compare); - - for (var i = 0; i < annotations.length; i++) { - var miriamType = annotations[i].miriamType; - var count = annotations[i].count; - - var option = new Option(); - option.value = miriamType.getName(); - if (count > 0) { - option.innerHTML = "<div class='minerva-multi-select-special'>" + miriamType.getCommonName() + " (" + count - + ")</div>"; - } else { - option.innerHTML = "<div >" + miriamType.getCommonName() + "</div>"; - } - selectElement.appendChild(option); - } - return typeDiv; -}; - -ElementExportPanel.prototype._createDownloadButton = function() { - var self = this; - var downloadDiv = Functions.createElement({ - type : "div", - name : "downloadDiv", - style : "clear:both; padding: 10px;", - }); - var button = Functions.createElement({ - type : "button", - content : " Download", - onclick : function() { - return self.createResponseString().then(function(result) { - logger.info(result); - }); - }, - }); - downloadDiv.appendChild(button); - - return downloadDiv; -}; - ElementExportPanel.prototype.createResponseString = function() { var self = this; - var types; + var types, miriamTypes; + var includedCompartmentIds = []; + var excludedCompartmentIds = []; var models = [ self.getProject().getModel() ]; for (var i = 0; i < self.getProject().getModel().getSubmodels().length; i++) { models.push(self.getProject().getModel().getSubmodels()[i]); @@ -193,12 +55,28 @@ ElementExportPanel.prototype.createResponseString = function() { var elements = []; return self.getSelectedTypes().then(function(result) { + if (result.length === 0) { + return Promise.reject(new GuiMessageError("You must select at least one type")); + } types = result; + return self.getSelectedIncludedCompartments(); + }).then(function(result) { + result.forEach(function(compartment) { + includedCompartmentIds.push(compartment.getId()); + }); + return self.getSelectedExcludedCompartments(); + }).then(function(result) { + result.forEach(function(compartment) { + excludedCompartmentIds.push(compartment.getId()); + }); + var promises = []; for (var i = 0; i < models.length; i++) { promises.push(models[i].getAliases({ type : types, complete : true, + includedCompartmentIds : includedCompartmentIds, + excludedCompartmentIds : excludedCompartmentIds, })); } return Promise.all(promises); @@ -208,183 +86,53 @@ ElementExportPanel.prototype.createResponseString = function() { elements.push(aliasesByModel[i][j]); } } + + return self.getSelectedMiriamTypes(); + }).then(function(result) { + miriamTypes = result; return self.getSelectedColumns(); }).then(function(selectedColumns) { + if (selectedColumns.length === 0) { + return Promise.reject(new GuiMessageError("You must select at least one column")); + } var rows = []; - rows.push(self.createResponseHeader(selectedColumns)); + rows.push(self.createResponseHeader(selectedColumns, miriamTypes)); for (var i = 0; i < elements.length; i++) { - rows.push(self.createResponseRow(elements[i], selectedColumns)); + rows.push(self.createResponseRow(elements[i], selectedColumns, miriamTypes)); } return rows.join("\n"); }); }; -ElementExportPanel.prototype.createResponseHeader = function(columns) { +ElementExportPanel.prototype.createResponseRow = function(alias, columns, miriamTypes) { var stringBuilder = []; - for (var i = 0; i < columns.length; i++) { + var i, value; + for (i = 0; i < columns.length; i++) { var column = columns[i]; - stringBuilder.push(column.name); - } - var result = stringBuilder.join("\t"); - return result; - -}; - -ElementExportPanel.prototype.createResponseRow = function(alias, columns) { - var stringBuilder = []; - for (var i = 0; i < columns.length; i++) { - var column = columns[i]; - var value = alias[column.method](); + value = alias[column.method](); if (column.formatFunction !== undefined) { value = column.formatFunction(value); } - stringBuilder.push(value); - - } - var result = stringBuilder.join("\t"); - return result; -}; - -ElementExportPanel.prototype._createSelectIncludedCompartmentDiv = function() { - var self = this; - var typeDiv = Functions.createElement({ - type : "div", - name : "includedCompartmentSelectDiv", - className : "minerva-export-dual-listbox-container", - }); - typeDiv.appendChild(Functions.createElement({ - type : "h4", - content : " Included compartment/pathways:", - })); - - return self._getCompartmentNames().then(function(compartmentNames) { - - var selectElement = Functions.createElement({ - type : "select", - className : "minerva-multi-select", - id : "includedCompartmentsSelect", - }); - typeDiv.appendChild(selectElement); - - for (var i = 0; i < compartmentNames.length; i++) { - var name = compartmentNames[i]; - - var option = new Option(); - option.value = name; - option.innerHTML = "<div >" + name + "</div>"; - selectElement.appendChild(option); - } - return typeDiv; - }); -}; - -ElementExportPanel.prototype._createSelectExcludedCompartmentDiv = function() { - var self = this; - var typeDiv = Functions.createElement({ - type : "div", - name : "excludedCompartmentSelectDiv", - className : "minerva-export-dual-listbox-container", - }); - typeDiv.appendChild(Functions.createElement({ - type : "h4", - content : " Excluded compartment/pathways:", - })); - - return self._getCompartmentNames().then(function(compartmentNames) { - - var selectElement = Functions.createElement({ - type : "select", - className : "minerva-multi-select", - id : "excludedCompartmentsSelect", - }); - typeDiv.appendChild(selectElement); - - for (var i = 0; i < compartmentNames.length; i++) { - var name = compartmentNames[i]; - - var option = new Option(); - option.value = name; - option.innerHTML = "<div >" + name + "</div>"; - selectElement.appendChild(option); + if (value instanceof String || typeof value === "string") { + value = value.replace(/[\n\r]/g, ' '); } - return typeDiv; - }); -}; - -ElementExportPanel.prototype._getAllCompartments = function() { - var self = this; - var compartments = []; - var i; - - var models = [ self.getProject().getModel() ]; - for (i = 0; i < self.getProject().getModel().getSubmodels().length; i++) { - models.push(self.getProject().getModel().getSubmodels()[i]); - } - - var promises = []; - for (i = 0; i < models.length; i++) { - promises.push(models[i].getCompartments()); + stringBuilder.push(value); } - - return Promise.all(promises).then(function(result) { - for (var i = 0; i < result.length; i++) { - var modelCompartments = result[i]; - for (var j = 0; j < modelCompartments.length; j++) { - compartments.push(modelCompartments[j]); + for (i = 0; i < miriamTypes.length; i++) { + value = ""; + var miriamType = miriamTypes[i]; + var references = alias.getReferences(); + for (var j = 0; j < references.length; j++) { + var reference = references[j]; + if (reference.getType() === miriamType.getName()) { + value += reference.getResource() + ","; } } - return compartments; - }); -}; -ElementExportPanel.prototype._getCompartmentNames = function() { - var self = this; - var compartments = []; - return self._getAllCompartments().then(function(result) { - - var addedNames = []; - for (var i = 0; i < result.length; i++) { - if (addedNames[result[i].getName()] === undefined) { - compartments.push(result[i].getName()); - addedNames[result[i].getName()] = true; - } - } - compartments.sort(compareSimple); - return compartments; - }); -}; - -ElementExportPanel.prototype._createSelectColumnDiv = function() { - var self = this; - var columnDiv = Functions.createElement({ - type : "div", - name : "columnSelectDiv", - }); - columnDiv.appendChild(Functions.createElement({ - type : "h4", - content : " COLUMN:", - })); - var choicesContainer = Functions.createElement({ - type : "ul", - className : "minerva-checkbox-grid" - }); - var columnTypes = self.getAllColumns(); - - columnDiv.appendChild(choicesContainer); - for (var i = 0; i < columnTypes.length; i++) { - var columnType = columnTypes[i]; - var row = Functions.createElement({ - type : "li", - content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"column_" + columnType.columnName - + "\" value=\"" + columnType.columnName + "\" />" + columnType.name + "</label></div>" - }); - choicesContainer.appendChild(row); + stringBuilder.push(value); } - choicesContainer.appendChild(Functions.createElement({ - type : "li", - content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"ALL\" value=\"ALL\" />ALL</label></div>" - })); - return columnDiv; + var result = stringBuilder.join("\t"); + return result; }; ElementExportPanel.prototype.getAllColumns = function() { @@ -467,128 +215,5 @@ ElementExportPanel.prototype.getAllColumns = function() { }, ]; }; -ElementExportPanel.prototype.getSelectedTypes = function() { - var self = this; - - var div = $("div[name='typeSelectDiv']", $(self.getElement()))[0]; - var result = []; - var selectedAll = false; - $(":checked", $(div)).each(function(index, element) { - if (element.value === "ALL") { - selectedAll = true; - } - result.push(element.value); - }); - if (selectedAll) { - return ServerConnector.getConfiguration().then(function(configuration) { - return configuration.getElementTypes(); - }); - } - - return Promise.resolve(result); -}; - -ElementExportPanel.prototype.setMiriamTypesDualListbox = function(dualListbox) { - this._miriamTypesDualListbox = dualListbox; -}; -ElementExportPanel.prototype.getMiriamTypesDualListbox = function() { - return this._miriamTypesDualListbox; -}; - -ElementExportPanel.prototype.setIncludedCompartmentsDualListbox = function(dualListbox) { - this._includedCompartmentsDualListbox = dualListbox; -}; -ElementExportPanel.prototype.getIncludedCompartmentsDualListbox = function() { - return this._includedCompartmentsDualListbox; -}; - -ElementExportPanel.prototype.getSelectedIncludedCompartments = function() { - var self = this; - var list = self.getIncludedCompartmentsDualListbox().selected; - var names = []; - var result = []; - for (var i = 0; i < list.length; i++) { - var element = list[i]; - names[element.dataset.id] = true; - } - return self._getAllCompartments().then(function(compartments) { - for (var i = 0; i < compartments.length; i++) { - var compartment = compartments[i]; - if (names[compartment.getName()]) { - result.push(compartment); - } - } - return result; - }); -}; - -ElementExportPanel.prototype.setExcludedCompartmentsDualListbox = function(dualListbox) { - this._excludedCompartmentsDualListbox = dualListbox; -}; -ElementExportPanel.prototype.getExcludedCompartmentsDualListbox = function() { - return this._excludedCompartmentsDualListbox; -}; - -ElementExportPanel.prototype.getSelectedExcludedCompartments = function() { - var self = this; - var list = self.getExcludedCompartmentsDualListbox().selected; - var names = []; - var result = []; - for (var i = 0; i < list.length; i++) { - var element = list[i]; - names[element.dataset.id] = true; - } - return self._getAllCompartments().then(function(compartments) { - for (var i = 0; i < compartments.length; i++) { - var compartment = compartments[i]; - if (names[compartment.getName()]) { - result.push(compartment); - } - } - return result; - }); -}; - -ElementExportPanel.prototype.getSelectedMiriamTypes = function() { - var self = this; - return ServerConnector.getConfiguration().then(function(configuration) { - var selected = self.getMiriamTypesDualListbox().selected; - var result = []; - for (var i = 0; i < selected.length; i++) { - var miriamType = configuration.getMiriamTypeByName(selected[i].dataset.id); - result.push(miriamType); - } - return result; - }); -}; - -ElementExportPanel.prototype.getSelectedColumns = function() { - var self = this; - - var div = $("div[name='columnSelectDiv']", $(self.getElement()))[0]; - var selectedColumnMap = []; - var selectedAll = false; - $(":checked", $(div)).each(function(index, element) { - if (element.value === "ALL") { - selectedAll = true; - } - selectedColumnMap[element.value] = true; - }); - var columnTypes = self.getAllColumns(); - - if (selectedAll) { - return Promise.resolve(columnTypes); - } - - var result = []; - - for (var i = 0; i < columnTypes.length; i++) { - var columnType = columnTypes[i]; - if (selectedColumnMap[columnType.columnName] === true) { - result.push(columnType); - } - } - return Promise.resolve(result); -}; module.exports = ElementExportPanel; diff --git a/frontend-js/src/main/js/gui/export/GraphicsExportPanel.js b/frontend-js/src/main/js/gui/export/GraphicsExportPanel.js index 6bf41a4246b1695a8bedde1007e23741acf6ad4c..4e2f7103a850a8a55e62ec42efbb08da47c9ba5c 100644 --- a/frontend-js/src/main/js/gui/export/GraphicsExportPanel.js +++ b/frontend-js/src/main/js/gui/export/GraphicsExportPanel.js @@ -2,21 +2,156 @@ /* exported logger */ -var Panel = require('../Panel'); +var AbstractExportPanel = require('./AbstractExportPanel'); +var Functions = require('../../Functions'); var logger = require('../../logger'); function GraphicsExportPanel(params) { - params.panelName = "elementExport"; - params.scrollable = true; - Panel.call(this, params); + params.panelName = "graphicsExport"; + AbstractExportPanel.call(this, params); } -GraphicsExportPanel.prototype = Object.create(Panel.prototype); +GraphicsExportPanel.prototype = Object.create(AbstractExportPanel.prototype); GraphicsExportPanel.prototype.constructor = GraphicsExportPanel; GraphicsExportPanel.prototype.init = function() { + var self = this; + var element = self.getElement(); + var configuration; + element.appendChild(self._createSelectProjectDiv()); + var configuration; + return ServerConnector.getConfiguration().then(function(result) { + configuration = result; + element.appendChild(self._createSelectGraphicsFormatDiv(configuration.getImageConverters())); + element.appendChild(self._createDownloadButton()); + }).then(function() { + $(window).trigger('resize'); + }); +}; + +GraphicsExportPanel.prototype._createSelectProjectDiv = function(annotations) { + var self = this; + var project = self.getProject(); + var typeDiv = Functions.createElement({ + type : "div", + name : "modelSelectDiv", + }); + typeDiv.appendChild(Functions.createElement({ + type : "h4", + content : "(Sub)map:", + })); + + var choicesContainer = Functions.createElement({ + type : "ul", + }); + typeDiv.appendChild(choicesContainer); + + var models = self.getModels(); + + for (var i = 0; i < models.length; i++) { + var model = models[i]; + var checkedString = ""; + if (i === 0) { + checkedString = ' checked="checked" '; + } + var row = Functions.createElement({ + type : "li", + content : '<div><label> <input type="radio" name="model" value="' + model.getId() + '"' + checkedString + '/>' + + model.getName() + '</label></div>', + }); + choicesContainer.appendChild(row); + } + + return typeDiv; +}; + +GraphicsExportPanel.prototype._createSelectGraphicsFormatDiv = function(formats) { + var self = this; + var project = self.getProject(); + var typeDiv = Functions.createElement({ + type : "div", + name : "formatSelectDiv", + }); + typeDiv.appendChild(Functions.createElement({ + type : "h4", + content : "Format:", + })); + + var choicesContainer = Functions.createElement({ + type : "ul", + }); + typeDiv.appendChild(choicesContainer); + + for (var i = 0; i < formats.length; i++) { + var format = formats[i]; + var checkedString = ""; + if (i === 0) { + checkedString = ' checked="checked" '; + } + var row = Functions.createElement({ + type : "li", + content : '<div><label> <input type="radio" name="format" value="' + format.handler + '"' + checkedString + '/>' + + format.name + '</label></div>', + }); + choicesContainer.appendChild(row); + } + + return typeDiv; +}; + +GraphicsExportPanel.prototype.getSubmapId = function() { + var self = this; + var div = $("div[name='modelSelectDiv']", $(self.getElement()))[0]; + var id = null; + $(":checked", $(div)).each(function(index, element) { + id = element.value; + }); + return id; +}; +GraphicsExportPanel.prototype.getFormatHandler = function() { + var self = this; + var div = $("div[name='formatSelectDiv']", $(self.getElement()))[0]; + var format = null; + $(":checked", $(div)).each(function(index, element) { + format = element.value; + }); + return format; +}; + +GraphicsExportPanel.prototype._createDownloadButton = function() { + var self = this; + var downloadDiv = Functions.createElement({ + type : "div", + name : "downloadDiv", + style : "clear:both; padding: 10px;", + }); + var button = Functions.createElement({ + type : "button", + name : "downloadButton", + content : " Download", + onclick : function() { + var identifier = null; + var defaultOverlayName = "Network"; + for (var i = 0; i < self.getProject().getModel().getLayouts().length; i++) { + var layout = self.getProject().getModel().getLayouts()[i]; + if (identifier === null || layout.getName() === defaultOverlayName) { + identifier = layout.getId(); + } + } + + return ServerConnector.getImageDownloadUrl({ + modelId : self.getSubmapId(), + backgroundOverlayId : identifier, + handlerClass : self.getFormatHandler(), + }).then(function(url) { + return self.downloadFile(url); + }).then(null, GuiConnector.alert); + }, + }); + downloadDiv.appendChild(button); + return downloadDiv; }; module.exports = GraphicsExportPanel; diff --git a/frontend-js/src/main/js/gui/export/NetworkExportPanel.js b/frontend-js/src/main/js/gui/export/NetworkExportPanel.js index 6f770c99ff870a433843a68a6208d5d8c7031689..d93fdebae2f51ca83c232a5cd181b5d0f5b342ad 100644 --- a/frontend-js/src/main/js/gui/export/NetworkExportPanel.js +++ b/frontend-js/src/main/js/gui/export/NetworkExportPanel.js @@ -2,22 +2,254 @@ /* exported logger */ -var Panel = require('../Panel'); +var AbstractExportPanel = require('./AbstractExportPanel'); +var Promise = require("bluebird"); var logger = require('../../logger'); +var GuiMessageError = require('../GuiMessageError'); -function NetworkExportPanel(params) { - params.panelName = "elementExport"; - params.scrollable = true; - Panel.call(this, params); +function NetworkExportPanel(params) { + params.panelName = "networkExport"; + AbstractExportPanel.call(this, params); } -NetworkExportPanel.prototype = Object.create(Panel.prototype); +NetworkExportPanel.prototype = Object.create(AbstractExportPanel.prototype); NetworkExportPanel.prototype.constructor = NetworkExportPanel; NetworkExportPanel.prototype.init = function() { + var self = this; + var element = self.getElement(); + var configuration; + return ServerConnector.getConfiguration().then(function(result) { + configuration = result; + var typeDiv = self._createSelectTypeDiv(configuration.getElementTypes()); + element.appendChild(typeDiv); + element.appendChild(self._createSelectColumnDiv(self.getAllColumns())); + return ServerConnector.getProjectStatistics(self.getProject().getProjectId()); + }).then(function(statistics) { + return self._createMiriamTypeDiv(statistics.getReactionAnnotations()); + }).then(function(div) { + element.appendChild(div); + return self._createSelectIncludedCompartmentDiv(); + }).then(function(div) { + element.appendChild(div); + return self._createSelectExcludedCompartmentDiv(); + }).then(function(div) { + element.appendChild(div); + element.appendChild(self._createDownloadButton()); + }).then(function() { + $(window).trigger('resize'); + }); + +}; + +NetworkExportPanel.prototype.getAllColumns = function() { + return [ { + "columnName" : "elements", + "method" : "getElements", + "name" : "Elements", + "formatFunction" : function(elements, reaction, elementIds) { + var stringBuilder = []; + var type; + var elementFormat = function(element) { + if (elementIds[element.getId()]) { + stringBuilder.push(type + ":" + element.getId()); + } + }; + type = "REACTANT"; + reaction.getReactants().forEach(elementFormat); + type = "PRODUCT"; + reaction.getProducts().forEach(elementFormat); + type = "MODIFIER"; + reaction.getModifiers().forEach(elementFormat); + + return stringBuilder.join(","); + }, + }, { + "columnName" : "id", + "method" : "getId", + "name" : "Id", + }, { + "columnName" : "description", + "method" : "getDescription", + "name" : "Description", + }, { + "columnName" : "modelId", + "method" : "getModelId", + "name" : "Model", + }, { + "columnName" : "type", + "method" : "getType", + "name" : "Type", + }, { + "columnName" : "symbol", + "method" : "getSymbol", + "name" : "Symbol", + }, { + "columnName" : "abbreviation", + "method" : "getAbbreviation", + "name" : "Abbreviation", + }, { + "columnName" : "formula", + "method" : "getFormula", + "name" : "Formula", + }, { + "columnName" : "synonyms", + "method" : "getSynonyms", + "name" : "Synonyms", + }, { + "columnName" : "references", + "method" : "getReferences", + "name" : "References", + "formatFunction" : function(references) { + var stringBuilder = []; + for (var i = 0; i < references.length; i++) { + var reference = references[i]; + stringBuilder.push(reference.getType() + ":" + reference.getResource()); + } + return stringBuilder.join(","); + }, + }, { + "columnName" : "reactionId", + "method" : "getReactionId", + "name" : "Element external id", + }, { + "columnName" : "mechanicalConfidenceScore", + "method" : "getMechanicalConfidenceScore", + "name" : "Mechanical Confidence Score", + }, { + "columnName" : "lowerBound", + "method" : "getLowerBound", + "name" : "Lower Bound", + }, { + "columnName" : "upperBound", + "method" : "getUpperBound", + "name" : "Upper Bound", + }, { + "columnName" : "geneProteinReaction", + "method" : "getGeneProteinReaction", + "name" : "Gene Protein Reaction", + }, { + "columnName" : "subsystem", + "method" : "getSubsystem", + "name" : "Subsystem", + }, ]; +}; + +function matchReaction(reaction, elementIds) { + var count = 0; + reaction.getElements().forEach(function(element) { + if (elementIds[element.getId()]) { + count++; + } + }); + return count > 1; +} + +NetworkExportPanel.prototype.createResponseString = function() { + var self = this; + var types, miriamTypes; + var includedCompartmentIds = []; + var excludedCompartmentIds = []; + var models = [ self.getProject().getModel() ]; + for (var i = 0; i < self.getProject().getModel().getSubmodels().length; i++) { + models.push(self.getProject().getModel().getSubmodels()[i]); + } + + var elementIds = []; + var reactions = []; + return self.getSelectedTypes().then(function(result) { + if (result.length === 0) { + return Promise.reject(new GuiMessageError("You must select at least one type")); + } + types = result; + return self.getSelectedIncludedCompartments(); + }).then(function(result) { + result.forEach(function(compartment) { + includedCompartmentIds.push(compartment.getId()); + }); + return self.getSelectedExcludedCompartments(); + }).then(function(result) { + result.forEach(function(compartment) { + excludedCompartmentIds.push(compartment.getId()); + }); + + var promises = []; + for (var i = 0; i < models.length; i++) { + promises.push(models[i].getAliases({ + type : types, + complete : true, + includedCompartmentIds : includedCompartmentIds, + excludedCompartmentIds : excludedCompartmentIds, + })); + } + return Promise.all(promises); + }).then(function(aliasesByModel) { + var promises = []; + for (var i = 0; i < models.length; i++) { + promises.push(models[i].getReactionsForElements(aliasesByModel[i], true)); + for (var j = 0; j < aliasesByModel[i].length; j++) { + elementIds[aliasesByModel[i][j].getId()] = true; + } + } + return Promise.all(promises); + }).then(function(reactionsByModel) { + for (var i = 0; i < models.length; i++) { + for (var j = 0; j < reactionsByModel[i].length; j++) { + var reaction = reactionsByModel[i][j]; + if (matchReaction(reaction, elementIds)) { + reactions.push(reaction); + } + } + } + return self.getSelectedMiriamTypes(); + }).then(function(result) { + miriamTypes = result; + return self.getSelectedColumns(); + }).then(function(selectedColumns) { + if (selectedColumns.length === 0) { + return Promise.reject(new GuiMessageError("You must select at least one column")); + } + + var rows = []; + rows.push(self.createResponseHeader(selectedColumns, miriamTypes)); + for (var i = 0; i < reactions.length; i++) { + rows.push(self.createResponseRow(reactions[i], selectedColumns, miriamTypes, elementIds)); + } + return rows.join("\n"); + }); +}; + +NetworkExportPanel.prototype.createResponseRow = function(reaction, columns, miriamTypes, elementIds) { + var stringBuilder = []; + var i, value; + for (i = 0; i < columns.length; i++) { + var column = columns[i]; + value = reaction[column.method](); + if (column.formatFunction !== undefined) { + value = column.formatFunction(value, reaction, elementIds); + } + if (value instanceof String || typeof value === "string") { + value = value.replace(/[\n\r]/g, ' '); + } + stringBuilder.push(value); + } + for (i = 0; i < miriamTypes.length; i++) { + value = ""; + var miriamType = miriamTypes[i]; + var references = reaction.getReferences(); + for (var j = 0; j < references.length; j++) { + var reference = references[j]; + if (reference.getType() === miriamType.getName()) { + value += reference.getResource() + ","; + } + } + stringBuilder.push(value); + } + var result = stringBuilder.join("\t"); + return result; }; module.exports = NetworkExportPanel; diff --git a/frontend-js/src/main/js/map/data/MapModel.js b/frontend-js/src/main/js/map/data/MapModel.js index fe059bcad1102b1473ec065ed0961fdd9d406226..2d921edb045e3224891e0b539096dec2c8102733 100644 --- a/frontend-js/src/main/js/map/data/MapModel.js +++ b/frontend-js/src/main/js/map/data/MapModel.js @@ -103,12 +103,15 @@ MapModel.prototype.getLayouts = function() { MapModel.prototype.getAliases = function(params) { var self = this; return ServerConnector.getAliases({ - columns : "id,bounds,modelId", + columns : "id,modelId", type : params.type, modelId : self.getId(), - }).then(function(lightAliases){ + includedCompartmentIds : params.includedCompartmentIds, + excludedCompartmentIds : params.excludedCompartmentIds, + + }).then(function(lightAliases) { var identifiedElements = []; - for (var i=0;i<lightAliases.length;i++) { + for (var i = 0; i < lightAliases.length; i++) { self.addAlias(lightAliases[i]); identifiedElements.push(new IdentifiedElement(lightAliases[i])); } @@ -180,45 +183,41 @@ MapModel.prototype.getReactionById = function(id, complete) { } }; +MapModel.prototype._getMissingReactionsElementIds = function(reactions) { + var self = this; + var result = []; + var ids = []; + for (var i = 0; i < reactions.length; i++) { + var reaction = reactions[i]; + var elements = reaction.getElements(); + for (var j = 0; j < elements.length; j++) { + var element = elements[j]; + if (!(element instanceof Alias)) { + if (self._aliases[element] === undefined || !self._aliases[element].isComplete()) { + if (!ids[element]) { + ids[element] = true; + result.push(element); + } + } + } + } + } + return result; +}; + MapModel.prototype.getCompleteReactionById = function(id) { var self = this; if (self._reactions[id] instanceof Reaction && self._reactions[id].isComplete()) { return Promise.resolve(self._reactions[id]); } else { var result; - return self.getReactionById(id).then( - function(result) { - var ids = []; - var i; - for (i = 0; i < result.getReactants().length; i++) { - if (!(result.getReactants()[i] instanceof Alias)) { - if (self._aliases[result.getReactants()[i]] === undefined - || !self._aliases[result.getReactants()[i]].isComplete()) { - ids.push(result.getReactants()[i]); - } - } - } - for (i = 0; i < result.getProducts().length; i++) { - if (!(result.getProducts()[i] instanceof Alias)) { - if (self._aliases[result.getProducts()[i]] === undefined - || !self._aliases[result.getProducts()[i]].isComplete()) { - ids.push(result.getProducts()[i]); - } - } - } - for (i = 0; i < result.getModifiers().length; i++) { - if (!(result.getModifiers()[i] instanceof Alias)) { - if (self._aliases[result.getModifiers()[i]] === undefined - || !self._aliases[result.getModifiers()[i]].isComplete()) { - ids.push(result.getModifiers()[i]); - } - } - } - return self.getMissingElements({ - aliasIds : ids, - complete : true - }); - }).then(function() { + return self.getReactionById(id).then(function(result) { + var ids = self._getMissingReactionsElementIds([ result ]); + return self.getMissingElements({ + aliasIds : ids, + complete : true + }); + }).then(function() { var i; result = self._reactions[id]; for (i = 0; i < result.getReactants().length; i++) { @@ -308,16 +307,20 @@ MapModel.prototype.getMissingElements = function(elements) { } } + var result = []; return Promise.all([ reactionPromise, aliasPromise ]).then(function(values) { - var result = [], i; + var i; var reactions = values[0]; var aliases = values[1]; + var ids = []; + if (reactions !== null) { for (i = 0; i < reactions.length; i++) { var reaction = reactions[i]; self.addReaction(reaction); result.push(reaction); } + ids = self._getMissingReactionsElementIds(reactions); } if (aliases !== null) { for (i = 0; i < aliases.length; i++) { @@ -326,6 +329,15 @@ MapModel.prototype.getMissingElements = function(elements) { result.push(alias); } } + if (ids.length > 0) { + return self.getMissingElements({ + aliasIds : ids, + complete : true + }); + } else { + return Promise.resolve([]); + } + }).then(function() { return result; }); }; @@ -731,9 +743,13 @@ MapModel.prototype.getReactionsForElements = function(elements, complete) { return Promise.all(promises); } } + + var result = []; return ServerConnector.getReactions({ participantId : ids, }).then(function(reactions) { + result = reactions; + var promises = []; for (var i = 0; i < reactions.length; i++) { var reaction = reactions[i]; @@ -743,7 +759,16 @@ MapModel.prototype.getReactionsForElements = function(elements, complete) { } else { self._reactions[id].update(reaction); } - promises.push(self.getReactionById(id, complete)); + } + var ids = self._getMissingReactionsElementIds(reactions); + return self.getMissingElements({ + aliasIds : ids, + complete : true + }); + }).then(function() { + var promises = []; + for (var i=0;i<result.length;i++) { + promises.push(self.getCompleteReactionById(result[i].getId())); } return Promise.all(promises); }); diff --git a/frontend-js/src/main/js/map/data/ProjectStatistics.js b/frontend-js/src/main/js/map/data/ProjectStatistics.js index e30fe8b0cbb34f7021b6e3fabec5dd60cc5bda45..0e5cd484641a1a04e88b51e38391628854617a04 100644 --- a/frontend-js/src/main/js/map/data/ProjectStatistics.js +++ b/frontend-js/src/main/js/map/data/ProjectStatistics.js @@ -49,6 +49,9 @@ ProjectStatistics.prototype.setElementAnnotations = function(elementAnnotations, ProjectStatistics.prototype.getElementAnnotations = function() { return this._elementAnnotations; }; +ProjectStatistics.prototype.getReactionAnnotations = function() { + return this._reactionAnnotations; +}; ProjectStatistics.prototype.setPublicationCount = function(count) { this._publicationsCount = count; diff --git a/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js b/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js index 05146b3859b76a192316df4e0eade26c6c238564..209fd20b97e369a40fdc584c867db855aa3be2b4 100644 --- a/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js +++ b/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js @@ -3,6 +3,7 @@ /* exported logger */ var ElementExportPanel = require('../../../../main/js/gui/export/ElementExportPanel'); +var GuiMessageError = require('../../../../main/js/gui/GuiMessageError'); var MiriamType = require('../../../../main/js/map/data/MiriamType'); var logger = require('../../logger'); @@ -217,6 +218,9 @@ describe('ElementExportPanel', function() { $("input[name='ALL']", $(testDiv)).each(function(index, element) { element.checked = true; }); + var dlb = exportObject.getMiriamTypesDualListbox(); + var listItem = dlb.available[0]; + dlb.addSelected(listItem); return exportObject.createResponseString(); }).then(function(result) { // protein id @@ -224,6 +228,62 @@ describe('ElementExportPanel', function() { assert.ok(result.indexOf("329156") >= 0); }); }); + it('get invalid', function() { + var exportObject; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + exportObject = new ElementExportPanel({ + element : testDiv, + project : project, + configuration : configuration, + }); + return exportObject.init(); + }).then(function() { + return exportObject.createResponseString(); + }).then(null, function(error) { + assert.ok(error instanceof GuiMessageError); + }); + }); + }); + + it('download file', function() { + var exportObject; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + exportObject = new ElementExportPanel({ + element : testDiv, + project : project, + configuration : configuration, + }); + return exportObject.init(); + }).then(function() { + $("input[name='ALL']", $(testDiv)).each(function(index, element) { + element.checked = true; + }); + var element = $("[name='downloadButton']", $(testDiv))[0]; + return element.onclick(); + }); + }); + + describe('createResponseRow', function() { + it('description with new line', function() { + var exportObject = new ElementExportPanel({ + element : testDiv, + project : helper.createProject(), + configuration : helper.getConfiguration(), + }); + var alias = helper.createAlias(); + var desc = "test\ntest2\n"; + alias.setDescription(desc); + var rowString = exportObject.createResponseRow(alias, exportObject.getAllColumns(), []); + assert.ok(rowString.indexOf("test\ntest2\n") === -1); + }); }); }); diff --git a/frontend-js/src/test/js/gui/export/GraphicsExportPanel-test.js b/frontend-js/src/test/js/gui/export/GraphicsExportPanel-test.js new file mode 100644 index 0000000000000000000000000000000000000000..a2b91b43d1f71c2c2ccae68098c6ed749fb6ee06 --- /dev/null +++ b/frontend-js/src/test/js/gui/export/GraphicsExportPanel-test.js @@ -0,0 +1,68 @@ +"use strict"; + +/* exported logger */ + +var GraphicsExportPanel = require('../../../../main/js/gui/export/GraphicsExportPanel'); +var logger = require('../../logger'); +var assert = require('assert'); + +describe('GraphicsExportPanel', function() { + + it('getModelId', function() { + var exportObject; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + exportObject = new GraphicsExportPanel({ + element : testDiv, + project : project, + configuration : configuration, + }); + return exportObject.init(); + }).then(function() { + var id = exportObject.getSubmapId(); + assert.ok(id); + }); + }); + + it('getFormatHandler', function() { + var exportObject; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + exportObject = new GraphicsExportPanel({ + element : testDiv, + project : project, + configuration : configuration, + }); + return exportObject.init(); + }).then(function() { + var format = exportObject.getFormatHandler(); + assert.ok(format); + }); + }); + + it('download file', function() { + var exportObject; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + exportObject = new GraphicsExportPanel({ + element : testDiv, + project : project, + configuration : configuration, + }); + return exportObject.init(); + }).then(function() { + var element = $("[name='downloadButton']", $(testDiv))[0]; + return element.onclick(); + }); + }); + +}); diff --git a/frontend-js/src/test/js/gui/export/NetworkExportPanel-test.js b/frontend-js/src/test/js/gui/export/NetworkExportPanel-test.js new file mode 100644 index 0000000000000000000000000000000000000000..1badab9af1c93d8f392d50ae969c9e3d34b91b29 --- /dev/null +++ b/frontend-js/src/test/js/gui/export/NetworkExportPanel-test.js @@ -0,0 +1,32 @@ +"use strict"; + +/* exported logger */ + +var NetworkExportPanel = require('../../../../main/js/gui/export/NetworkExportPanel'); +var logger = require('../../logger'); + +describe('NetworkExportPanel', function() { + + it('download file', function() { + var exportObject; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + exportObject = new NetworkExportPanel({ + element : testDiv, + project : project, + configuration : configuration, + }); + return exportObject.init(); + }).then(function() { + $("input[name='ALL']", $(testDiv)).each(function(index, element) { + element.checked = true; + }); + var element = $("[name='downloadButton']", $(testDiv))[0]; + return element.onclick(); + }); + }); + +}); diff --git a/frontend-js/src/test/js/mocha-config.js b/frontend-js/src/test/js/mocha-config.js index 4b4438049ae2ebac08f04cac10d1bc2716cb853a..fa68c112a618f9833c4ab9600a398ff92e48effd 100644 --- a/frontend-js/src/test/js/mocha-config.js +++ b/frontend-js/src/test/js/mocha-config.js @@ -24,6 +24,8 @@ global.window.$ = $; // additions to jsdom implementations: global.Option = window.Option; +global.Blob = window.Blob; +global.MouseEvent = window.MouseEvent; var originalCreateElement = document.createElement; document.createElement = function(arg) { @@ -42,6 +44,9 @@ window.open = function() { }; return result; }; +window.URL.createObjectURL = function(){ + +}; // pileup is using heavily some browser defined javascript var pileup = require('pileup'); diff --git a/frontend-js/testFiles/apiCalls/doLogout b/frontend-js/testFiles/apiCalls/doLogout new file mode 100644 index 0000000000000000000000000000000000000000..1a36cf5fc27a0920a9f3668225f9d7aec239566e --- /dev/null +++ b/frontend-js/testFiles/apiCalls/doLogout @@ -0,0 +1 @@ +{"status":"ok"} \ No newline at end of file diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/15781/bioEntities/elements/columns=id,modelId&type=Drug,Complex,Phenotype,Gene,RNA,Unknown,Degraded,Antisense RNA,Ion,Simple molecule,Protein,Compartment&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/15781/bioEntities/elements/columns=id,modelId&type=Drug,Complex,Phenotype,Gene,RNA,Unknown,Degraded,Antisense RNA,Ion,Simple molecule,Protein,Compartment&token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..b6d21d318c262584cb47a6fa481b462fdfdec7ac --- /dev/null +++ b/frontend-js/testFiles/apiCalls/projects/sample/models/15781/bioEntities/elements/columns=id,modelId&type=Drug,Complex,Phenotype,Gene,RNA,Unknown,Degraded,Antisense RNA,Ion,Simple molecule,Protein,Compartment&token=MOCK_TOKEN_ID& @@ -0,0 +1 @@ +[{"modelId":15781,"id":329180},{"modelId":15781,"id":329166},{"modelId":15781,"id":329183},{"modelId":15781,"id":329158},{"modelId":15781,"id":329175},{"modelId":15781,"id":329160},{"modelId":15781,"id":329176},{"modelId":15781,"id":329161},{"modelId":15781,"id":329164},{"modelId":15781,"id":329171},{"modelId":15781,"id":329157},{"modelId":15781,"id":329181},{"modelId":15781,"id":329165},{"modelId":15781,"id":329184},{"modelId":15781,"id":329156},{"modelId":15781,"id":329185},{"modelId":15781,"id":329169},{"modelId":15781,"id":329162},{"modelId":15781,"id":329167},{"modelId":15781,"id":329178},{"modelId":15781,"id":329170},{"modelId":15781,"id":329163},{"modelId":15781,"id":329173},{"modelId":15781,"id":329168},{"modelId":15781,"id":329174},{"modelId":15781,"id":329182},{"modelId":15781,"id":329159},{"modelId":15781,"id":329172},{"modelId":15781,"id":329177},{"modelId":15781,"id":329179}] \ No newline at end of file diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329167,329168,329169,329172,329173,329179&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329167,329168,329169,329172,329173,329179&token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..ec53d5a3b9547671ae3a2d1bddac3b521d2664db --- /dev/null +++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329167,329168,329169,329172,329173,329179&token=MOCK_TOKEN_ID& @@ -0,0 +1 @@ +[{"elementId":"sa5","symbol":null,"formerSymbols":[],"other":{"structuralState":"usual","modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"RNA","abbreviation":null,"compartmentId":null,"name":"s5","bounds":{"x":0.0,"width":90.0,"y":118.5,"height":25.0},"formula":null,"id":329168,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa1","symbol":null,"formerSymbols":[],"other":{"structuralState":null,"modifications":[]},"notes":"description of S1\r\nthird line","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s1","bounds":{"x":12.0,"width":80.0,"y":6.0,"height":40.0},"formula":null,"id":329173,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa6","symbol":null,"formerSymbols":[],"other":{"structuralState":"usual","modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Antisense RNA","abbreviation":null,"compartmentId":null,"name":"s6","bounds":{"x":101.0,"width":90.0,"y":129.5,"height":25.0},"formula":null,"id":329167,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa11","symbol":null,"formerSymbols":[],"other":{"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Unknown","abbreviation":null,"compartmentId":null,"name":"s11","bounds":{"x":105.0,"width":70.0,"y":203.5,"height":25.0},"formula":null,"id":329169,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa7","symbol":null,"formerSymbols":[],"other":{"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Phenotype","abbreviation":null,"compartmentId":null,"name":"s7","bounds":{"x":213.0,"width":80.0,"y":128.0,"height":30.0},"formula":null,"id":329172,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa2","symbol":null,"formerSymbols":[],"other":{"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s2","bounds":{"x":165.0,"width":80.0,"y":43.0,"height":50.0},"formula":null,"id":329179,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}] \ No newline at end of file diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/reactions/participantId=329156,329157,329158,329159,329160,329161,329162,329163,329164,329165,329166,329167,329168,329169,329170,329171,329172,329173,329174,329175,329176,329177,329178,329179,329180,329181,329182,329183,329184,329185&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/reactions/participantId=329156,329157,329158,329159,329160,329161,329162,329163,329164,329165,329166,329167,329168,329169,329170,329171,329172,329173,329174,329175,329176,329177,329178,329179,329180,329181,329182,329183,329184,329185&token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..90a3c4b7c4fa022979780b493c9d025900e264eb --- /dev/null +++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/reactions/participantId=329156,329157,329158,329159,329160,329161,329162,329163,329164,329165,329166,329167,329168,329169,329170,329171,329172,329173,329174,329175,329176,329177,329178,329179,329180,329181,329182,329183,329184,329185&token=MOCK_TOKEN_ID& @@ -0,0 +1 @@ +[{"notes":"","references":[],"modelId":15781,"reactants":"329161","reactionId":"re20","id":153497,"type":"State transition","lines":[{"start":{"x":465.68408727882723,"y":173.00924235519662},"end":{"x":427.95591606364394,"y":159.05933030924652},"type":"START"},{"start":{"x":420.45240587887884,"y":156.28492318210644},"end":{"x":382.72423466369554,"y":142.33501113615634},"type":"END"}],"modifiers":"","centerPoint":{"x":424.2041609712614,"y":157.67212674567648},"products":"329165","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329172","reactionId":"re12","id":153522,"type":"State transition","lines":[{"start":{"x":282.92735502516456,"y":131.66828304872405},"end":{"x":349.0890546595849,"y":106.61676571141928},"type":"START"},{"start":{"x":356.5706947317768,"y":103.78391170350197},"end":{"x":422.7323943661972,"y":78.73239436619717},"type":"END"}],"modifiers":"","centerPoint":{"x":352.82987469568087,"y":105.20033870746062},"products":"329182","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329157","reactionId":"re14","id":153502,"type":"State transition","lines":[{"start":{"x":369.0,"y":60.84615384615386},"end":{"x":390.00425356060526,"y":61.8155809335664},"type":"START"},{"start":{"x":397.99574643939474,"y":62.18441906643361},"end":{"x":419.0,"y":63.15384615384615},"type":"END"}],"modifiers":"","centerPoint":{"x":394.0,"y":62.00000000000001},"products":"329182","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329172","reactionId":"re11","id":153516,"type":"State transition","lines":[{"start":{"x":266.57142857142856,"y":128.0},"end":{"x":286.0544419422188,"y":106.46614311649508},"type":"START"},{"start":{"x":291.4217485339718,"y":100.53385688350491},"end":{"x":310.904761904762,"y":79.0},"type":"END"}],"modifiers":"","centerPoint":{"x":288.7380952380953,"y":103.5},"products":"329157","hierarchyVisibilityLevel":null},{"notes":"","references":[{"resource":"REACT_1493.4","link":null,"id":860354,"type":"REACTOME"}],"modelId":15781,"reactants":"329181","reactionId":"re29","id":153506,"type":"State transition","lines":[{"start":{"x":1065.943922652377,"y":210.4515058436089},"end":{"x":1076.3953582603178,"y":134.9622060910266},"type":"START"},{"start":{"x":1077.4924870444363,"y":127.03779390897431},"end":{"x":1087.943922652377,"y":51.548494156391996},"type":"END"},{"start":{"x":1225.7682370820664,"y":95.9386128624158},"end":{"x":1081.8966802661598,"y":131.68570549007447},"type":"MIDDLE"}],"modifiers":"329170","centerPoint":{"x":1076.943922652377,"y":131.00000000000045},"products":"329164","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329169","reactionId":"re8","id":153518,"type":"State transition","lines":[{"start":{"x":141.01308884552796,"y":203.5052375718217},"end":{"x":142.676524190943,"y":182.98953497836953},"type":"START"},{"start":{"x":143.32305114107143,"y":175.01570259345215},"end":{"x":144.98648648648648,"y":154.5},"type":"END"}],"modifiers":"","centerPoint":{"x":142.99978766600722,"y":179.00261878591084},"products":"329167","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329177","reactionId":"re6","id":153507,"type":"State transition","lines":[{"start":{"x":73.33333333333336,"y":205.99999999999997},"end":{"x":86.57623440706466,"y":207.9864351610597},"type":"START"},{"start":{"x":94.48772523001104,"y":209.17315878450162},"end":{"x":107.73062630374235,"y":211.15959394556134},"type":"END"}],"modifiers":"","centerPoint":{"x":90.53197981853785,"y":208.57979697278066},"products":"329169","hierarchyVisibilityLevel":null},{"notes":"","references":[{"resource":"REACT_631.3","link":null,"id":860356,"type":"REACTOME"}],"modelId":15781,"reactants":"329164,329163,329184","reactionId":"re28","id":153517,"type":"State transition","lines":[{"start":{"x":1141.5196031834896,"y":51.548494156391996},"end":{"x":1132.7196031834897,"y":115.10969883127876},"type":"START"},{"start":{"x":1219.548247311565,"y":134.3979536254443},"end":{"x":1132.7196031834897,"y":115.10969883127876},"type":"START"},{"start":{"x":1246.1690051005714,"y":32.36583419471002},"end":{"x":1132.7196031834897,"y":115.10969883127876},"type":"START"},{"start":{"x":1128.3196031834896,"y":146.89030116872215},"end":{"x":1119.5196031834896,"y":210.4515058436089},"type":"END"},{"start":{"x":1270.6053791059244,"y":190.1518729146033},"end":{"x":1236.597255534866,"y":287.5959827975124},"type":"END"},{"start":{"x":1128.3196031834896,"y":146.89030116872215},"end":{"x":1270.6053791059244,"y":190.1518729146033},"type":"MIDDLE"},{"start":{"x":1225.7682370820664,"y":100.0252191528203},"end":{"x":1135.4723607972724,"y":131.68570549007447},"type":"MIDDLE"},{"start":{"x":1132.7196031834897,"y":115.10969883127876},"end":{"x":1131.0681675755488,"y":127.03779390897431},"type":"MIDDLE"},{"start":{"x":1128.3196031834896,"y":146.89030116872215},"end":{"x":1129.9710387914304,"y":134.9622060910266},"type":"MIDDLE"}],"modifiers":"329170","centerPoint":{"x":1130.5196031834896,"y":131.00000000000045},"products":"329181,329185","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329167","reactionId":"re3","id":153504,"type":"State transition","lines":[{"start":{"x":155.9662162162162,"y":129.5},"end":{"x":169.67962640764847,"y":112.300129590407},"type":"START"},{"start":{"x":174.6668714987086,"y":106.04494083212823},"end":{"x":188.38028169014086,"y":88.84507042253522},"type":"END"}],"modifiers":"","centerPoint":{"x":172.17324895317853,"y":109.17253521126761},"products":"329179","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329182,329158","reactionId":"re24","id":153501,"type":"Heterodimer association","lines":[{"start":{"x":483.0,"y":84.29763533176055},"end":{"x":533.8361728854625,"y":125.17338224867643},"type":"START"},{"start":{"x":533.8361728854625,"y":125.17338224867643},"end":{"x":570.5932207804386,"y":141.9996978678854},"type":"MIDDLE"},{"start":{"x":570.5932207804386,"y":141.9996978678854},"end":{"x":598.9999999999998,"y":233.5000000000009},"type":"MIDDLE"},{"start":{"x":372.0,"y":278.9000000000001},"end":{"x":598.9999999999998,"y":233.5000000000009},"type":"START"},{"start":{"x":534.1902877883472,"y":223.71375982660487},"end":{"x":502.38530409965,"y":193.69120244400173},"type":"END"},{"start":{"x":537.8602347616395,"y":200.9555550930127},"end":{"x":534.1902877883472,"y":223.71375982660487},"type":"MIDDLE"},{"start":{"x":598.9999999999998,"y":233.5000000000009},"end":{"x":560.730886628659,"y":215.4609444653865},"type":"MIDDLE"},{"start":{"x":560.730886628659,"y":215.4609444653865},"end":{"x":542.8037939212006,"y":170.29938150667186},"type":"MIDDLE"},{"start":{"x":542.8037939212006,"y":170.29938150667186},"end":{"x":539.1338469479083,"y":193.05758624026404},"type":"MIDDLE"}],"modifiers":"","centerPoint":{"x":538.4970408547739,"y":197.00657066663837},"products":"329161","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329179","reactionId":"re13","id":153498,"type":"State transition","lines":[{"start":{"x":245.0,"y":65.09677419354836},"end":{"x":263.01049445505964,"y":63.78956088632629},"type":"START"},{"start":{"x":270.98950554494036,"y":63.210439113673665},"end":{"x":289.00000000000006,"y":61.9032258064516},"type":"END"}],"modifiers":"","centerPoint":{"x":267.0,"y":63.49999999999998},"products":"329157","hierarchyVisibilityLevel":null},{"notes":"asd","references":[],"modelId":15781,"reactants":"329183,329176","reactionId":"re27","id":153503,"type":"State transition","lines":[{"start":{"x":736.0,"y":62.0},"end":{"x":857.8666666666667,"y":65.99999999999984},"type":"START"},{"start":{"x":718.0,"y":157.0},"end":{"x":857.8666666666667,"y":65.99999999999984},"type":"START"},{"start":{"x":1036.7448052448904,"y":161.82878519089866},"end":{"x":695.0,"y":259.0},"type":"END"},{"start":{"x":918.8000000000001,"y":67.99999999999976},"end":{"x":1040.6666666666667,"y":71.9999999999996},"type":"MIDDLE"},{"start":{"x":1040.6666666666667,"y":71.9999999999996},"end":{"x":1036.7448052448904,"y":161.82878519089866},"type":"MIDDLE"},{"start":{"x":918.8000000000001,"y":67.99999999999976},"end":{"x":854.0,"y":159.0},"type":"END"},{"start":{"x":857.8666666666667,"y":65.99999999999984},"end":{"x":884.3354862606928,"y":66.86877963656522},"type":"MIDDLE"},{"start":{"x":918.8000000000001,"y":67.99999999999976},"end":{"x":892.3311804059739,"y":67.13122036343438},"type":"MIDDLE"}],"modifiers":"","centerPoint":{"x":888.3333333333334,"y":66.9999999999998},"products":"329178,329160","hierarchyVisibilityLevel":null},{"notes":"notes for reaction","references":[{"resource":"123","link":"http://www.ncbi.nlm.nih.gov/pubmed/123","id":860355,"type":"PUBMED","article":{"title":"The importance of an innervated and intact antrum and pylorus in preventing postoperative duodenogastric reflux and gastritis.","authors":["Keighley MR"," Asquith P"," Edwards JA"," Alexander-Williams J."],"journal":"The British journal of surgery","year":1975,"link":"http://www.ncbi.nlm.nih.gov/pubmed/123","id":"123","citationCount":12,"stringAuthors":"Keighley MR, Asquith P, Edwards JA, Alexander-Williams J."}}],"modelId":15781,"reactants":"329166","reactionId":"re21","id":153508,"type":"State transition","lines":[{"start":{"x":129.00000000000003,"y":269.9853478599471},"end":{"x":217.3857151822324,"y":271.4614610007049},"type":"START"},{"start":{"x":217.3857151822324,"y":271.4614610007049},"end":{"x":217.98919008325365,"y":297.73178548394236},"type":"MIDDLE"},{"start":{"x":218.17291548409574,"y":305.7296755167626},"end":{"x":218.77639038511697,"y":332.0},"type":"END"}],"modifiers":"","centerPoint":{"x":218.0810527836747,"y":301.7307305003525},"products":"329171","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329174,329180","reactionId":"re26","id":153515,"type":"State transition","lines":[{"start":{"x":792.0,"y":404.0},"end":{"x":868.3333333333338,"y":377.9999999999997},"type":"START"},{"start":{"x":868.3333333333338,"y":377.9999999999997},"end":{"x":893.6666666666671,"y":378.00000000000017},"type":"MIDDLE"},{"start":{"x":884.0,"y":334.0},"end":{"x":893.6666666666671,"y":378.00000000000017},"type":"START"},{"start":{"x":931.666666666667,"y":378.0000000000009},"end":{"x":918.0,"y":447.0},"type":"END"},{"start":{"x":906.3333333333337,"y":378.00000000000045},"end":{"x":931.666666666667,"y":378.0000000000009},"type":"MIDDLE"},{"start":{"x":906.3333333333337,"y":378.00000000000045},"end":{"x":994.0,"y":296.0},"type":"END"},{"start":{"x":893.6666666666671,"y":378.00000000000017},"end":{"x":896.0000000000005,"y":378.0000000000003},"type":"MIDDLE"},{"start":{"x":906.3333333333337,"y":378.00000000000045},"end":{"x":904.0000000000005,"y":378.0000000000004},"type":"MIDDLE"}],"modifiers":"","centerPoint":{"x":900.0000000000005,"y":378.00000000000034},"products":"329162,329156","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329172","reactionId":"re19","id":153514,"type":"State transition","lines":[{"start":{"x":291.5480933063571,"y":141.36660621583232},"end":{"x":321.0332360186737,"y":140.1172357619206},"type":"START"},{"start":{"x":329.02606383097014,"y":139.7785566173318},"end":{"x":358.51120654328673,"y":138.52918616342006},"type":"END"}],"modifiers":"","centerPoint":{"x":325.0296499248219,"y":139.9478961896262},"products":"329165","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329182","reactionId":"re15","id":153520,"type":"State transition","lines":[{"start":{"x":464.2991452991452,"y":84.99999999999999},"end":{"x":474.4764759147595,"y":123.41121554925371},"type":"START"},{"start":{"x":476.52543302899414,"y":131.14437627071987},"end":{"x":486.7027636446084,"y":169.5555918199736},"type":"END"}],"modifiers":"","centerPoint":{"x":475.5009544718768,"y":127.27779590998679},"products":"329161","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329167","reactionId":"re10","id":153499,"type":"State transition","lines":[{"start":{"x":180.0362865221489,"y":142.31809613572102},"end":{"x":192.68309645382215,"y":142.43629062106376},"type":"START"},{"start":{"x":200.68274710121602,"y":142.5110537112263},"end":{"x":213.32955703288923,"y":142.62924819656908},"type":"END"}],"modifiers":"","centerPoint":{"x":196.68292177751908,"y":142.47367216614504},"products":"329172","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329158","reactionId":"re9","id":153523,"type":"State transition","lines":[{"start":{"x":321.85186623410436,"y":207.00000000000003},"end":{"x":321.9270873884931,"y":189.4702285640532},"type":"START"},{"start":{"x":321.9270873884931,"y":189.4702285640532},"end":{"x":229.04799778942134,"y":218.492600831302},"type":"MIDDLE"},{"start":{"x":229.04799778942134,"y":218.492600831302},"end":{"x":237.43474907751033,"y":192.0589999282645},"type":"MIDDLE"},{"start":{"x":239.85410636945107,"y":184.4336009030375},"end":{"x":248.24085765754003,"y":158.0},"type":"END"}],"modifiers":"","centerPoint":{"x":238.6444277234807,"y":188.246300415651},"products":"329172","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329169","reactionId":"re7","id":153500,"type":"State transition","lines":[{"start":{"x":163.2392208530345,"y":225.3469042549395},"end":{"x":213.40853059287068,"y":245.52519412275237},"type":"START"},{"start":{"x":220.83069026016378,"y":248.51041536634685},"end":{"x":270.99999999999994,"y":268.6887052341597},"type":"END"}],"modifiers":"","centerPoint":{"x":217.11961042651723,"y":247.0178047445496},"products":"329158","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329158","reactionId":"re18","id":153524,"type":"State transition","lines":[{"start":{"x":372.0,"y":268.1587301587302},"end":{"x":386.60500853172016,"y":262.1312663202425},"type":"START"},{"start":{"x":394.0,"y":259.0793650793651},"end":{"x":408.6050085317202,"y":253.05190124087738},"type":"END"}],"modifiers":"","centerPoint":{"x":390.3025042658601,"y":260.6053156998038},"products":"329175","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329158","reactionId":"re23","id":153521,"type":"Dissociation","lines":[{"start":{"x":371.99999999999994,"y":315.10161915826575},"end":{"x":411.64153465957406,"y":335.590891248036},"type":"START"},{"start":{"x":508.05348418531685,"y":279.95891320505365},"end":{"x":379.6820939222325,"y":146.9928441065957},"type":"END"},{"start":{"x":543.7499999999999,"y":362.874999999999},"end":{"x":508.05348418531685,"y":279.95891320505365},"type":"MIDDLE"},{"start":{"x":449.8434737629195,"y":307.88463901503604},"end":{"x":270.9073813308621,"y":158.0},"type":"END"},{"start":{"x":543.7499999999999,"y":362.874999999999},"end":{"x":546.6153123135401,"y":307.94923690478544},"type":"MIDDLE"},{"start":{"x":546.6153123135401,"y":307.94923690478544},"end":{"x":449.8434737629195,"y":307.88463901503604},"type":"MIDDLE"},{"start":{"x":543.7499999999999,"y":362.874999999999},"end":{"x":500.90979517443395,"y":356.00742559541567},"type":"MIDDLE"},{"start":{"x":500.90979517443395,"y":356.00742559541567},"end":{"x":458.3899053124841,"y":359.75342920945576},"type":"MIDDLE"},{"start":{"x":458.3899053124841,"y":359.75342920945576},"end":{"x":418.7483706529099,"y":339.2641571196856},"type":"MIDDLE"}],"modifiers":"","centerPoint":{"x":415.194952656242,"y":337.4275241838608},"products":"329165,329172","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329168","reactionId":"re4","id":153512,"type":"State transition","lines":[{"start":{"x":75.73715058611361,"y":134.3476104598738},"end":{"x":88.18325303297577,"y":135.7031265679479},"type":"START"},{"start":{"x":96.13622466620043,"y":136.56929179532878},"end":{"x":108.58232711306259,"y":137.92480790340286},"type":"END"}],"modifiers":"","centerPoint":{"x":92.15973884958811,"y":136.13620918163832},"products":"329167","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329168","reactionId":"re2","id":153511,"type":"State transition","lines":[{"start":{"x":45.833333333333336,"y":118.49999999999999},"end":{"x":47.983923957904906,"y":86.24114063142645},"type":"START"},{"start":{"x":48.516076042095094,"y":78.25885936857357},"end":{"x":50.666666666666664,"y":46.0},"type":"END"}],"modifiers":"","centerPoint":{"x":48.25,"y":82.25},"products":"329173","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329171","reactionId":"re22","id":153505,"type":"Positive influence","lines":[{"start":{"x":169.66666666666666,"y":332.0},"end":{"x":149.31765717927775,"y":319.13724818355684},"type":"START"},{"start":{"x":142.5553586937381,"y":314.86275181644316},"end":{"x":122.2063492063492,"y":302.0},"type":"END"}],"modifiers":"","centerPoint":{"x":145.93650793650792,"y":317.0},"products":"329166","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329177","reactionId":"re1","id":153519,"type":"State transition","lines":[{"start":{"x":41.07142857142857,"y":186.0},"end":{"x":42.30429751433407,"y":168.73983479932295},"type":"START"},{"start":{"x":42.87427391423735,"y":160.76016520067705},"end":{"x":44.107142857142854,"y":143.5},"type":"END"}],"modifiers":"","centerPoint":{"x":42.58928571428571,"y":164.75},"products":"329168","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329182","reactionId":"re16","id":153513,"type":"State transition","lines":[{"start":{"x":434.8904109589041,"y":85.0},"end":{"x":410.8341500923087,"y":104.95576185524392},"type":"START"},{"start":{"x":404.6769250286157,"y":110.06345991944379},"end":{"x":380.62066416202026,"y":130.0192217746877},"type":"END"}],"modifiers":"","centerPoint":{"x":407.7555375604622,"y":107.50961088734385},"products":"329165","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329165","reactionId":"re17","id":153509,"type":"State transition","lines":[{"start":{"x":375.66023326033917,"y":149.5988027812886},"end":{"x":392.8475673435525,"y":192.3761676106196},"type":"START"},{"start":{"x":395.8301166301696,"y":199.7994013906443},"end":{"x":413.0174507133829,"y":242.5767662199753},"type":"END"}],"modifiers":"","centerPoint":{"x":394.33884198686104,"y":196.08778450063195},"products":"329175","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329173","reactionId":"re5","id":153510,"type":"State transition","lines":[{"start":{"x":92.0,"y":36.98039215686274},"end":{"x":124.64269540833152,"y":45.94113207287532},"type":"START"},{"start":{"x":132.35730459166848,"y":48.05886792712468},"end":{"x":165.0,"y":57.01960784313726},"type":"END"},{"start":{"x":144.03021943732247,"y":129.5},"end":{"x":131.99804583067973,"y":53.145215648491444},"type":"MIDDLE"}],"modifiers":"329167","centerPoint":{"x":128.5,"y":47.0},"products":"329179","hierarchyVisibilityLevel":null}] \ No newline at end of file diff --git a/model/src/main/java/lcsb/mapviewer/model/map/model/Model.java b/model/src/main/java/lcsb/mapviewer/model/map/model/Model.java index 5df367d06fe0e9da343d11e186252eaea20c8f03..9b09e2708b9244f8798fef693184859756ec2ccc 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/model/Model.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/model/Model.java @@ -389,7 +389,7 @@ public interface Model { * element database identifier ({@link Element#id}) * @return {@link Element} for a given id */ - Element getElementByDbId(Integer dbId); + <T extends Element> T getElementByDbId(Integer dbId); /** * Returns {@link Reaction} for given database identifier. diff --git a/persist/src/db/11.0.1/fix_db_20170908.sql b/persist/src/db/11.0.1/fix_db_20170908.sql new file mode 100644 index 0000000000000000000000000000000000000000..a33b6ad89d4881c84fb355b8c56d309760e66b70 --- /dev/null +++ b/persist/src/db/11.0.1/fix_db_20170908.sql @@ -0,0 +1 @@ +-- empty file to force directory to be commited to git repo diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java index 668985f097cfc601ef841129dfc8aa372df3eaff..843edf209d9f71f8ea1c36e93041eab82f99ed15 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java @@ -91,12 +91,14 @@ public class ConfigurationRestImpl { userService.getToken(token); List<Map<String, Object>> result = new ArrayList<>(); - List<Pair<String, Class<? extends AbstractImageGenerator>>> imageGenerators = new ImageGenerators().getAvailableImageGenerators(); + ImageGenerators imageGenerators = new ImageGenerators(); + List<Pair<String, Class<? extends AbstractImageGenerator>>> imageGeneratorList = imageGenerators.getAvailableImageGenerators(); - for (Pair<String, Class<? extends AbstractImageGenerator>> element : imageGenerators) { + for (Pair<String, Class<? extends AbstractImageGenerator>> element : imageGeneratorList) { Map<String, Object> row = new HashMap<>(); row.put("name", element.getLeft()); row.put("handler", element.getRight().getCanonicalName()); + row.put("extension", imageGenerators.getExtension(element.getRight())); result.add(row); } return result; @@ -114,6 +116,7 @@ public class ConfigurationRestImpl { Map<String, Object> row = new HashMap<>(); row.put("name", converter.getCommonName()); row.put("handler", converter.getClass().getCanonicalName()); + row.put("extension", converter.getFileExtension()); result.add(row); } return result; diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsController.java index 21b5336199ad0f71bc68dd588c58abfa50d53081..d7bdf466830f02f9d5ee3b8f61d96fe0981415da 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsController.java @@ -29,9 +29,11 @@ public class ElementsController extends BaseController { @RequestParam(value = "id", defaultValue = "") String id, // @RequestParam(value = "type", defaultValue = "") String type, // @RequestParam(value = "columns", defaultValue = "") String columns, // + @RequestParam(value = "includedCompartmentIds", defaultValue = "") String includedCompartmentIds, // + @RequestParam(value = "excludedCompartmentIds", defaultValue = "") String excludedCompartmentIds, // @CookieValue(value = Configuration.AUTH_TOKEN) String token// ) throws SecurityException { - return projectController.getElements(projectId, id, columns, modelId, token, type); + return projectController.getElements(projectId, id, columns, modelId, token, type, includedCompartmentIds, excludedCompartmentIds); } } \ No newline at end of file diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsRestImpl.java index c30f92abc8903929a1c1ddabb55d9fca647f7acf..9348dc68691f9a30029e51ad2e5a5934b8459939 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsRestImpl.java @@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import lcsb.mapviewer.api.BaseRestImpl; +import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.species.AntisenseRna; import lcsb.mapviewer.model.map.species.Element; @@ -35,8 +36,8 @@ public class ElementsRestImpl extends BaseRestImpl { @Autowired private OverviewImageViewFactory factory; - public List<Map<String, Object>> getElements(String projectId, String id, String columns, String modelId, String token, String type) - throws UserAccessException, SecurityException { + public List<Map<String, Object>> getElements(String projectId, String id, String columns, String modelId, String token, String type, + String includedCompartmentIds, String excludedCompartmentIds) throws UserAccessException, SecurityException { Set<Integer> ids = new HashSet<>(); if (!id.equals("")) { for (String str : id.split(",")) { @@ -49,18 +50,21 @@ public class ElementsRestImpl extends BaseRestImpl { types.add(str.toLowerCase()); } } + List<Model> models = getModels(projectId, modelId, token); + Set<Compartment> includedCompartments = getCompartments(includedCompartmentIds, models); + Set<Compartment> excludedCompartments = getCompartments(excludedCompartmentIds, models); Set<String> columnsSet = createElementColumnSet(columns); List<Map<String, Object>> result = new ArrayList<>(); - List<Model> models = getModels(projectId, modelId, token); - for (Model model2 : models) { for (Element element : model2.getElements()) { if (ids.size() == 0 || ids.contains(element.getId())) { if (types.size() == 0 || types.contains(element.getStringType().toLowerCase())) { - result.add(preparedElement(element, columnsSet)); + if (matchIncludedExcludedCompartments(element, includedCompartments, excludedCompartments)) { + result.add(preparedElement(element, columnsSet)); + } } } } @@ -69,6 +73,53 @@ public class ElementsRestImpl extends BaseRestImpl { return result; } + private boolean matchIncludedExcludedCompartments(Element element, Set<Compartment> includedCompartments, Set<Compartment> excludedCompartments) { + boolean matchIncluded = true; + boolean matchExcluded = false; + + if (includedCompartments.size() > 0) { + matchIncluded = matchCompartments(element, includedCompartments); + } + if (excludedCompartments.size() > 0) { + matchExcluded = matchCompartments(element, excludedCompartments); + } + + return matchIncluded && !matchExcluded; + } + + private boolean matchCompartments(Element element, Set<Compartment> compartmentList) { + boolean isInside = false; + if (element != null) { + for (Compartment compartment : compartmentList) { + if (compartment.contains(element) && element.getModel().getId().equals(compartment.getModel().getId())) { + isInside = true; + } + } + } + return isInside; + } + + private Set<Compartment> getCompartments(String includedCompartmentIds, List<Model> models) { + Set<Compartment> includedCompartments = new HashSet<>(); + int count = 0; + if (!includedCompartmentIds.isEmpty()) { + for (String compartmentId : includedCompartmentIds.split(",")) { + Integer integerId = Integer.valueOf(compartmentId); + for (Model model : models) { + Compartment compartment = model.getElementByDbId(integerId); + if (compartment != null) { + includedCompartments.add(compartment); + } + } + count++; + } + if (count > 0 && includedCompartments.size() == 0) { + includedCompartments.add(new Compartment("empty_comp_to_reject_all_elements")); + } + } + return includedCompartments; + } + private Map<String, Object> preparedElement(Element element, Set<String> columnsSet) { Map<String, Object> result = new HashMap<>(); for (String string : columnsSet) { diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java index 0d3e0349126edced91c82d2ad674c564cbd97505..44257fd6b443e375a2b1f6321cb44f8212392170 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java @@ -29,9 +29,7 @@ import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.reaction.Reaction; import lcsb.mapviewer.model.map.species.Element; import lcsb.mapviewer.services.SecurityException; -import lcsb.mapviewer.services.interfaces.IModelService; import lcsb.mapviewer.services.interfaces.ISearchService; -import lcsb.mapviewer.services.interfaces.IUserService; import lcsb.mapviewer.services.view.OverviewImageViewFactory; @Transactional(value = "txManager") @@ -42,12 +40,6 @@ public class PublicationsRestImpl extends BaseRestImpl { */ private Logger logger = Logger.getLogger(PublicationsRestImpl.class); - @Autowired - private IUserService userService; - - @Autowired - private IModelService modelService; - @Autowired private ISearchService searchService; @@ -89,40 +81,6 @@ public class PublicationsRestImpl extends BaseRestImpl { return publications; } - /** - * @return the userService - * @see #userService - */ - public IUserService getUserService() { - return userService; - } - - /** - * @param userService - * the userService to set - * @see #userService - */ - public void setUserService(IUserService userService) { - this.userService = userService; - } - - /** - * @return the modelService - * @see #modelService - */ - public IModelService getModelService() { - return modelService; - } - - /** - * @param modelService - * the modelService to set - * @see #modelService - */ - public void setModelService(IModelService modelService) { - this.modelService = modelService; - } - /** * @return the searchService * @see #searchService diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserController.java b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserController.java index a7b6b76983ee2adc818f58b8529eacd1e123fac5..d85484790e2f2380db8344c9dd8418d38ae340f2 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserController.java @@ -78,11 +78,27 @@ public class UserController extends BaseController { } @RequestMapping(value = "/doLogout", method = { RequestMethod.GET, RequestMethod.POST }, produces = { MediaType.APPLICATION_JSON_VALUE }) - public Map<String, String> logout(@CookieValue(value = Configuration.AUTH_TOKEN) String token) throws SecurityException { + public Map<String, String> logout(@CookieValue(value = Configuration.AUTH_TOKEN) String token, + HttpServletResponse response // + ) throws SecurityException, IOException { userService.logout(token); - Map<String, String> response = new HashMap<>(); - response.put("status", "OK"); - return response; + Map<String, String> result = new HashMap<>(); + result.put("status", "OK"); + + final Boolean useSecureCookie = false; + final String cookiePath = "/"; + + Cookie cookie = new Cookie("MINERVA_AUTH_TOKEN", token); + + cookie.setSecure(useSecureCookie); + cookie.setMaxAge(0); + cookie.setPath(cookiePath); + + response.addCookie(cookie); + response.getWriter().write("{\"status\":\"OK\"}"); + response.getWriter().flush(); + response.getWriter().close(); + return result; } /** diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java index 60e3837712d839ffd77e188018a37d6f166f3601..d6b904ceb9dfadc1c4f8b52b554efe6cb6b5d19d 100644 --- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java +++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java @@ -8,14 +8,12 @@ import lcsb.mapviewer.api.projects.chemicals.AllChemicalTests; import lcsb.mapviewer.api.projects.drugs.AllDrugTests; import lcsb.mapviewer.api.projects.mirnas.AllMiRnaTests; import lcsb.mapviewer.api.projects.models.AllModelsTests; -import lcsb.mapviewer.api.projects.overlays.AllOverlaysTests; @RunWith(Suite.class) @SuiteClasses({ AllChemicalTests.class, // AllDrugTests.class, // AllMiRnaTests.class, // AllModelsTests.class, // - AllOverlaysTests.class, // ModelMetaDataTest.class, // ProjectRestImplTest.class }) public class AllProjectTests { diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java index 12a789d393bd4674120a9568735b6ac54bae29e6..0699aadfa0bbbe9acec86e910789e83bb1382c4d 100644 --- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java +++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java @@ -24,6 +24,7 @@ import lcsb.mapviewer.api.RestTestFunctions; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.converter.graphics.PdfImageGenerator; import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser; +import lcsb.mapviewer.model.cache.FileEntry; import lcsb.mapviewer.model.map.MiriamType; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.services.interfaces.IModelService; @@ -50,7 +51,7 @@ public class ProjectRestImplTest extends RestTestFunctions { } @Test - public void testGetModelAsImage() throws Exception { + public void testGetModelAsImageForInvalidConverter() throws Exception { try { ProjectRestImpl projectRest = createMockProjectRest("testFiles/model/sample.xml"); projectRest.getModelAsImage(token.getId(), "sample", "0", "", "", "", "", ""); @@ -62,6 +63,18 @@ public class ProjectRestImplTest extends RestTestFunctions { } } + @Test + public void testGetModelAsImage() throws Exception { + try { + ProjectRestImpl projectRest = createMockProjectRest("testFiles/model/sample.xml"); + FileEntry result = projectRest.getModelAsImage(token.getId(), "sample", "0", PdfImageGenerator.class.getCanonicalName(), "", "", "", ""); + assertNotNull(result); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + @Test(expected = ObjectNotFoundException.class) public void testGetInvalidMetaData() throws Exception { _projectRestImpl.getMetaData("unknown_model_id", token.getId()); diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java index 7da42635f993dc74e3cbeed463dec330876ce993..19cc3a66c98d2cc2f09e10d94d8709cf6831b841 100644 --- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java +++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java @@ -55,7 +55,7 @@ public class ElementRestImplTest extends RestTestFunctions { public void testGetElementsProcessAllColumns() throws Exception { try { ElementsRestImpl projectRest = createMockElementRest("testFiles/model/sample.xml"); - List<Map<String, Object>> result = projectRest.getElements("sample", "", "", "*", token.getId(), ""); + List<Map<String, Object>> result = projectRest.getElements("sample", "", "", "*", token.getId(), "", "", ""); for (Map<String, Object> element : result) { for (String paramName : element.keySet()) { Object val = element.get(paramName); @@ -80,7 +80,7 @@ public class ElementRestImplTest extends RestTestFunctions { try { String proteinType = new GenericProtein("1").getStringType(); ElementsRestImpl elementRest = createMockElementRest("testFiles/model/sample.xml"); - List<Map<String, Object>> result = elementRest.getElements("sample", "", "", "*", token.getId(), proteinType); + List<Map<String, Object>> result = elementRest.getElements("sample", "", "", "*", token.getId(), proteinType, "", ""); assertEquals(12, result.size()); } catch (Exception e) { @@ -93,7 +93,7 @@ public class ElementRestImplTest extends RestTestFunctions { public void testGetElementsVisibility() throws Exception { try { ElementsRestImpl elementRest = createMockElementRest("testFiles/model/sample.xml"); - List<Map<String, Object>> result = elementRest.getElements("sample", "", "", "*", token.getId(), ""); + List<Map<String, Object>> result = elementRest.getElements("sample", "", "", "*", token.getId(), "", "", ""); for (Map<String, Object> map : result) { assertTrue(map.get("hierarchyVisibilityLevel") instanceof String); } diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java deleted file mode 100644 index daf60c8088672175d23a5947536c5a6f62a42f8d..0000000000000000000000000000000000000000 --- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java +++ /dev/null @@ -1,11 +0,0 @@ -package lcsb.mapviewer.api.projects.overlays; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -@SuiteClasses({ }) -public class AllOverlaysTests { - -}