/* * Created on Jul 6, 2006 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ /** * @author Betsy Rolland * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ package org.biomediator.wrappers; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.*; import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.biomediator.util.AttribOption; import org.biomediator.util.StringUtility; import com.oroinc.text.regex.Perl5StreamInput; import java.io.FileReader; import java.util.*; import org.biomediator.util.AttribOption; import org.biomediator.util.StringUtility; import org.biomediator.xml.XMLParser; import org.biomediator.xml.XMLAttributeParser; import org.xml.sax.XMLReader; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.helpers.XMLReaderFactory; import org.xml.sax.helpers.DefaultHandler; public class InterProSequenceWrapper extends AbstractWrapper { public static final String IP_HELP_TEXT = " Description:\n" + " Provides an interface for searching the InterPro database by sequence.\n" + "\n" + " Usage:\n" + " Servlet examples:\n" + " ?term=term[tvalue=MRCSISLVLGLLALEVALARNLQEHVFNSVQSMCSDDSFSEDTECINCQTNEECAQNDMCCPSSCGRSCKTPVNIEVQKAGRCPWNPIQMIAAGPCPKDNPCSIDSDCSGTMKCCKNGCIMSCMDPEPKSPTVISFQ]" ; public static final String IP_SOURCE_TAG = "interpro_source"; public static final String IP_CMD_TERM = "term"; public static final String IP_OPTION_MAP_TVALUE = "tvalue"; public static final String IP_OPTION_MAP_HEXENCODED = "hexencoded"; public static final int MAX_DOCSIZE = 1024 * 10000; public static final int REFRESH_LIMIT = 40; public static final int REFRESH_RATE = 8000; private static String ENDLINE = "\n"; public static final String ipsHitResultPattern = ""; public String proxyUrl = null; private Pattern pattern = null; private Matcher matcher = null; private HashMap queryMap = null; private String sequence = ""; public static void main(String[] args) { InterProSequenceWrapper ip = new InterProSequenceWrapper(); //invoking the constructor ip.out = new PrintWriter(System.out, true); if (args.length > 0) { ip.processRequest(args[0]); } else { ip.processRequest(""); } } public void processRequest(String query) { // Make sure the servlet is initialized. initializeServlet(IP_HELP_TEXT, IP_SOURCE_TAG, getWrapperProperties("interprosequence")); // Parse the query string and process commands. if (query == null || query.equals("")) { query = CMD_HELP; } AttribOption ao = new AttribOption(query); processCommands(ao, getWrapperProperties("interprosequence")); // Check to see if we should exit immeditely. if (isExitCmd) { return; } String proxy = wrapperProperties.getProperty(WrapperProperties.PROP_PROXY_URL); if (proxy == null) { proxyUrl = ""; } else { proxyUrl = proxy + "?"; } String convertedQuery = null; TreeSet termTypeSet = ao.getAttribMapSet(IP_CMD_TERM); if (termTypeSet != null) { convertedQuery = constructIPQuery(termTypeSet.iterator()); } String urlBase = "http://www.ebi.ac.uk/cgi-bin/iprscan/iprscan?tool=iprscan&cmd=submit&crc=1&goterms=1&sequence="; try { // Download XML page. String queryURL = proxyUrl + urlBase + convertedQuery; //out.println("queryURL is " + queryURL); BufferedReader br = new BufferedReader(new InputStreamReader(new URL(queryURL).openStream())); StringBuffer lineBuf = new StringBuffer(); String line = null; while ((line = br.readLine()) != null) { lineBuf.append(line + "\n"); if (lineBuf.length() > MAX_DOCSIZE) { break; } } br.close(); // Isolate and process the portion of the page that contains data. String data = lineBuf.toString(); //find this string and get the job number -- var bookmarktitle="iprscan?tool=iprscan&jobid=iprscan-20060809-20001592" String jobNumberRegEx = "iprscan?tool=iprscan&jobid=iprscan-"; int jobNumberStringStart = data.indexOf(jobNumberRegEx); int jobNumberStartIndex = jobNumberStringStart + 35; String jobNumber = data.substring(jobNumberStartIndex, jobNumberStartIndex + 17); //out.println("jobNumber is " + jobNumber); String baseURL = "http://www.ebi.ac.uk/jobresults/iprscan/iprscan-"; String xmlURL = ".xml?"; String resultsURL = baseURL + jobNumber + xmlURL; out.println("resultsURL is " + resultsURL); boolean ready = false; while (!ready){ ready = refreshIPSLink(resultsURL); } //BufferedReader br2 = new BufferedReader(new InputStreamReader(new URL(resultsURL).openStream())); InputStream inStream = new BufferedInputStream(new URL(resultsURL).openStream()); StringBuffer lineBuf2 = new StringBuffer(); lineBuf2.append(HEADER_XML + "\n"); XMLAttributeParser xap = new XMLAttributeParser(inStream, lineBuf2); lineBuf2 = xap.parseData(); // Isolate and process the portion of the page that contains data. String data2 = lineBuf2.toString(); // Convert retrieved document to valid XML (order of replacements is important). data2 = data2.replaceAll("<\\?xml version=\"1\\.0\"[^>]*>", HEADER_XML); data2 = data2.replaceAll("]*>", ""); data2 = data2.replaceAll("interpro_matches",IP_SOURCE_TAG); data2 = data2.replaceAll("/interpro_matches",IP_SOURCE_TAG); // Print XML output to the client. out.print((data2 != null) ? data2 : ""); out.flush(); } //end of try catch (Exception e) { System.err.println(e); } } //end of processRequest public String constructIPQuery(Iterator queryIterator) { StringBuffer termBuf = new StringBuffer(""); HashMap groupMap = new HashMap(); String ttype = null; String tvalue = null; String hexencoded = null; if (queryIterator.hasNext()) { while (queryIterator.hasNext()) { // Retrieve the term values that were parsed from the query URL. HashMap queryMap = (HashMap) queryIterator.next(); ttype = (String) queryMap.get(AttribOption.OPTION_PARAM_NAME); tvalue = (String) queryMap.get(IP_OPTION_MAP_TVALUE); hexencoded = (String) queryMap.get(IP_OPTION_MAP_HEXENCODED); // Convert term values from hex to ascii if necessary. if (hexencoded != null && hexencoded.equals("true")) { tvalue = StringUtility.convertHexToASCII(tvalue); } } } //out.println("tvalue is "+ tvalue); return tvalue; } public boolean refreshIPSLink(String ipsLink) { URL ipsSocket; BufferedReader br; int refreshToken = 0; try { ipsSocket = new URL(ipsLink); br = new BufferedReader(new InputStreamReader(ipsSocket.openStream())); String ln; StringBuffer lines = new StringBuffer(); while ((ln = br.readLine()) != null) lines.append(ln + ENDLINE); pattern = Pattern.compile(ipsHitResultPattern); //what should this be? matcher = pattern.matcher(lines); if(matcher.find()) { // results are complete //out.println("found a match!"); return true; } } catch (Exception e) { e.printStackTrace(); } return false; } public void terminate() { // TODO Auto-generated method stub } }