// WikiPathways Java library, // Copyright 2014 WikiPathways // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // package org.molgenis.wikipathways.client; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.message.BasicNameValuePair; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; import org.molgenis.wikipathways.utils.Utils; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * connects to the new WikiPathways REST webservice * * @author msk */ public class WikiPathwaysRESTBindingStub implements WikiPathwaysPortType { private HttpClient client; private String baseUrl; public WikiPathwaysRESTBindingStub(HttpClient client, String baseUrl) { this.client = client; this.baseUrl = baseUrl; } @Override public WSSearchResult[] findInteractions(String query) throws RemoteException { try { query = query.replace(" ", "+"); String url = baseUrl + "/findInteractions?query=" + query; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren("result", WSNamespaces.NS1); WSSearchResult[] res = new WSSearchResult[list.size()]; for (int i = 0; i < list.size(); i++) { res[i] = Utils.parseWSSearchResult(list.get(i)); } return res; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSSearchResult[] findPathwaysByLiterature(String query) throws RemoteException { try { query = query.replace(" ", "+"); String url = baseUrl + "/findPathwaysByLiterature?query=" + query; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren("result", WSNamespaces.NS1); WSSearchResult[] res = new WSSearchResult[list.size()]; for (int i = 0; i < list.size(); i++) { res[i] = Utils.parseWSSearchResult(list.get(i)); } return res; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSSearchResult[] findPathwaysByText(String query, String species) throws RemoteException { try { query = query.replace(" ", "+"); String url = baseUrl + "/findPathwaysByText?query=" + query; if (species != null) { species = species.replace(" ", "+"); url = url + "&species=" + species; } Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren("result", WSNamespaces.NS1); WSSearchResult[] res = new WSSearchResult[list.size()]; for (int i = 0; i < list.size(); i++) { res[i] = Utils.parseWSSearchResult(list.get(i)); } return res; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSSearchResult[] findPathwaysByXref(String[] ids, String[] codes) throws RemoteException { try { String url = baseUrl + "/findPathwaysByXref"; int count = 0; for (String i : ids) { if (count == 0) { url = url + "?ids=" + i; count++; } else { url = url + "&ids=" + i; } } for (String c : codes) { url = url + "&codes=" + c; } Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren("result", WSNamespaces.NS1); WSSearchResult[] res = new WSSearchResult[list.size()]; for (int i = 0; i < list.size(); i++) { res[i] = Utils.parseWSSearchResult(list.get(i)); } return res; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public byte[] getColoredPathway(String pwId, String revision, String[] graphId, String[] color, String fileType) throws RemoteException { try { String url = baseUrl + "/getColoredPathway?pwId=" + pwId + "&revision=" + revision; for (String g : graphId) { url = url + "&graphId=" + g; } for (String c : color) { url = url + "&color=" + c; } url = url + "&fileType=" + fileType; Document jdomDocument = Utils.connect(url, client); Element data = jdomDocument.getRootElement().getChild("data", WSNamespaces.NS1); return Base64.decodeBase64(data.getValue()); } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSCurationTagHistory[] getCurationTagHistory(String pwId, String timestamp) throws RemoteException { try { String url = baseUrl + "/getCurationTagHistory?pwId=" + pwId; if (timestamp != null) { url = url + "×tamp=" + timestamp; } Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren("history", WSNamespaces.NS1); WSCurationTagHistory[] hist = new WSCurationTagHistory[list.size()]; for (int i = 0; i < list.size(); i++) { hist[i] = Utils.parseCurationTagHistory(list.get(i)); } return hist; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSCurationTag[] getCurationTags(String pwId) throws RemoteException { try { String url = baseUrl + "/getCurationTags?pwId=" + pwId; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren("tags", WSNamespaces.NS1); WSCurationTag[] tags = new WSCurationTag[list.size()]; for (int i = 0; i < list.size(); i++) { tags[i] = Utils.parseCurationTag(list.get(i)); } return tags; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSCurationTag[] getCurationTagsByName(String tagName) throws RemoteException { try { String url = baseUrl + "/getCurationTagsByName?tagName=" + tagName; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren("tags", WSNamespaces.NS1); WSCurationTag[] tags = new WSCurationTag[list.size()]; for (int i = 0; i < list.size(); i++) { tags[i] = Utils.parseCurationTag(list.get(i)); } return tags; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSOntologyTerm[] getOntologyTermsByPathway(String pwId) throws RemoteException { try { String url = baseUrl + "/getOntologyTermsByPathway?pwId=" + pwId; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren("terms", WSNamespaces.NS1); WSOntologyTerm[] terms = new WSOntologyTerm[list.size()]; for (int i = 0; i < list.size(); i++) { terms[i] = Utils.parseOntologyTerm(list.get(i)); } return terms; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSPathway getPathway(String pwId, int revision) throws RemoteException { try { String url = baseUrl + "/getPathway?pwId=" + pwId; if (revision != 0) { url = url + "&revision=" + revision; } Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); Element p = root.getChild("pathway", WSNamespaces.NS1); return Utils.parsePathway(p); } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public byte[] getPathwayAs(String fileType, String pwId, int revision) throws RemoteException { InputStream instream = null; try { String url = baseUrl; if (url.contains("webservice/webservice.php")) { url = url.replace("webservice/webservice.php", "wpi.php"); } else if (url.contains("webservicetest")) { url = url.replace("webservicetest/webservice.php", "wpi.php"); } else if (url.contains("webservice.wikipathways.org")) { url = "http://www.wikipathways.org/wpi/wpi.php"; } url = url + "?action=downloadFile&type=" + fileType + "&pwTitle=Pathway:" + pwId + "&oldid=" + revision; HttpGet httpget = new HttpGet(url); HttpResponse response = client.execute(httpget); HttpEntity entity = response.getEntity(); instream = entity.getContent(); return IOUtils.toByteArray(instream); } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } finally { try { if (instream != null) { instream.close(); } } catch (IOException e) { throw new RemoteException(e.getMessage(), e.getCause()); } } } @Override public WSPathwayInfo[] getPathwaysByOntologyTerm(String term) throws RemoteException { try { term = term.replace(" ", "+"); String url = baseUrl + "/getPathwaysByOntologyTerm?term=" + term; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren("pathways", WSNamespaces.NS1); WSPathwayInfo[] info = new WSPathwayInfo[list.size()]; for (int i = 0; i < list.size(); i++) { info[i] = Utils.parseWSPathwayInfo(list.get(i)); } return info; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSPathwayInfo[] getPathwaysByParentOntologyTerm(String term) throws RemoteException { try { String url = baseUrl + "/getPathwaysByParentOntologyTerm?term=" + term; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren("pathways", WSNamespaces.NS1); WSPathwayInfo[] info = new WSPathwayInfo[list.size()]; for (int i = 0; i < list.size(); i++) { info[i] = Utils.parseWSPathwayInfo(list.get(i)); } return info; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSPathwayHistory getPathwayHistory(String pwId, String timestamp) throws RemoteException { try { String url = baseUrl + "/getPathwayHistory?pwId=" + pwId + "×tamp=" + timestamp; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); Element hist = root.getChild("history", WSNamespaces.NS1); return Utils.parsePathwayHistory(hist); } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSPathwayInfo getPathwayInfo(String pwId) throws RemoteException { try { String url = baseUrl + "/getPathwayInfo?pwId=" + pwId; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); Element p = root.getChild("pathwayInfo", WSNamespaces.NS1); return Utils.parseWSPathwayInfo(p); } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSPathwayInfo[] getRecentChanges(String timestamp) throws RemoteException { try { String url = baseUrl + "/getRecentChanges?timestamp=" + timestamp; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren("pathways", WSNamespaces.NS1); WSPathwayInfo[] info = new WSPathwayInfo[list.size()]; for (int i = 0; i < list.size(); i++) { info[i] = Utils.parseWSPathwayInfo(list.get(i)); } return info; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public String getUserByOrcid(String orcid) throws RemoteException { try { String url = baseUrl + "/getUserByOrcid?orcid=" + orcid; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); return root.getChildText("Result", WSNamespaces.NS1).substring(5); } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public String[] getXrefList(String pwId, String code) throws RemoteException { try { String url = baseUrl + "/getXrefList?pwId=" + pwId + "&code=" + code; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren(); String[] xrefs = new String[list.size()]; for (int i = 0; i < list.size(); i++) { xrefs[i] = list.get(i).getValue(); } return xrefs; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public String[] listOrganisms() throws RemoteException { try { String url = baseUrl + "/listOrganisms"; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren(); String[] organisms = new String[list.size()]; for (int i = 0; i < list.size(); i++) { organisms[i] = list.get(i).getValue(); } return organisms; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public WSPathwayInfo[] listPathways(String organism) throws RemoteException { try { String url = ""; if (organism == null) { url = baseUrl + "/listPathways"; } else { organism = organism.replace(" ", "+"); url = baseUrl + "/listPathways?organism=" + organism; } Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); List<Element> list = root.getChildren("pathways", WSNamespaces.NS1); WSPathwayInfo[] info = new WSPathwayInfo[list.size()]; for (int i = 0; i < list.size(); i++) { info[i] = Utils.parseWSPathwayInfo(list.get(i)); } return info; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public String login(String name, String pass) throws RemoteException { try { String url = baseUrl + "/login?name=" + name + "&pass=" + pass; Document jdomDocument = Utils.connect(url, client); Element root = jdomDocument.getRootElement(); String auth = root.getChildText("auth", WSNamespaces.NS1); if (auth == null) { throw new RemoteException("Invalid username or password"); } return auth; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public boolean removeCurationTag(String pwId, String tagName, WSAuth auth) throws RemoteException { try { String url = baseUrl + "/removeCurationTag?pwId=" + pwId + "&tagName=" + tagName + "&auth=" + auth.getKey() + "&username=" + auth.getUser(); Document jdomDocument = Utils.connect(url, client); String success = jdomDocument.getRootElement().getChild("success", WSNamespaces.NS1).getValue(); if (success.equals("1")) { return true; } return false; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public boolean saveCurationTag(String pwId, String tagName, String tagText, int revision, WSAuth auth) throws RemoteException { try { String url = baseUrl + "/saveCurationTag?pwId=" + pwId + "&tagName=" + tagName + "&text=" + URLEncoder .encode(tagText, "UTF-8") + "&revision=" + revision + "&auth=" + auth.getKey() + "&username=" + auth .getUser(); Document jdomDocument = Utils.connect(url, client); String success = jdomDocument.getRootElement().getChild("success", WSNamespaces.NS1).getValue(); if (success.equals("1")) { return true; } return false; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public boolean saveOntologyTag(String pwId, String term, String termId, WSAuth auth) throws RemoteException { try { String url = baseUrl + "/saveOntologyTag?pwId=" + pwId + "&term=" + URLEncoder.encode(term, "UTF-8") + "&termId=" + termId + "&auth=" + auth.getKey() + "&user=" + auth.getUser(); Document jdomDocument = Utils.connect(url, client); String success = jdomDocument.getRootElement().getChild("success", WSNamespaces.NS1).getValue(); if (success.equals("1")) { return true; } return false; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public boolean removeOntologyTag(String pwId, String termId, WSAuth auth) throws RemoteException { try { String url = baseUrl + "/removeOntologyTag?pwId=" + pwId + "&termId=" + termId + "&auth=" + auth.getKey() + "&user=" + auth.getUser(); Document jdomDocument = Utils.connect(url, client); String success = jdomDocument.getRootElement().getChild("success", WSNamespaces.NS1).getValue(); if (success.equals("1")) { return true; } return false; } catch (Exception e) { throw new RemoteException(e.getMessage(), e.getCause()); } } @Override public boolean updatePathway(String pwId, String description, String gpml, int revision, WSAuth auth) throws RemoteException { try { Map<String, String> map = new HashMap<String, String>(); map.put("pwId", pwId); map.put("description", description); map.put("gpml", gpml); map.put("revision", revision + ""); map.put("auth", auth.getKey()); map.put("username", auth.getUser()); String url = baseUrl + "/updatePathway"; String success = Utils.update(url, client, map); if (success.equals("1")) { return true; } } catch (Exception e) { e.printStackTrace(); throw new RemoteException(e.getMessage(), e.getCause()); } return false; } @Override public WSPathwayInfo createPathway(String gpml, WSAuth auth) throws RemoteException { try { Map<String, String> map = new HashMap<String, String>(); map.put("gpml", gpml); map.put("auth", auth.getKey()); map.put("username", auth.getUser()); String url = baseUrl + "/createPathway"; HttpPost httpost = new HttpPost(url); // Adding all form parameters in a List of type NameValuePair List<NameValuePair> nvps = new ArrayList<NameValuePair>(); for (String key : map.keySet()) { nvps.add(new BasicNameValuePair(key, map.get(key))); } httpost.addHeader("Accept-Encoding", "application/xml"); httpost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); HttpResponse response = client.execute(httpost); SAXBuilder jdomBuilder = new SAXBuilder(); Document jdomDocument = jdomBuilder.build(response.getEntity().getContent()); Element root = jdomDocument.getRootElement(); Element p = root.getChild("pathwayInfo", WSNamespaces.NS1); return Utils.parseWSPathwayInfo(p); } catch (Exception e) { e.printStackTrace(); throw new RemoteException(e.getMessage(), e.getCause()); } } }