1 package tax; 2 3 import java.io.PrintStream; 4 import java.util.ArrayList; 5 6 import server.PercentEncoding; 7 import server.ServerTools; 8 import shared.Parse; 9 import shared.PreParser; 10 import shared.Shared; 11 import shared.Timer; 12 import shared.Tools; 13 import structures.ByteBuilder; 14 import structures.StringNum; 15 16 public class TaxClient { 17 main(String[] args)18 public static void main(String[] args){ 19 Timer t=new Timer(); 20 {//Preparse block for help, config files, and outstream 21 PreParser pp=new PreParser(args, null, false); 22 args=pp.args; 23 outstream=pp.outstream; 24 } 25 26 ArrayList<Integer> gi=new ArrayList<Integer>(); 27 ArrayList<String> acc=new ArrayList<String>(); 28 ArrayList<String> name=new ArrayList<String>(); 29 ArrayList<String> header=new ArrayList<String>(); 30 31 boolean slow=true; 32 33 //Parse each argument 34 for(int i=0; i<args.length; i++){ 35 String arg=args[i]; 36 37 //Break arguments into their constituent parts, in the form of "a=b" 38 String[] split=arg.split("="); 39 String a=split[0].toLowerCase(); 40 String b=split.length>1 ? split[1] : null; 41 42 if(a.equals("verbose")){ 43 verbose=Parse.parseBoolean(b); 44 }else if(a.equals("name") || a.equals("names")){ 45 if(b!=null){ 46 for(String s : b.split(",")){ 47 name.add(s); 48 } 49 } 50 }else if(a.equals("gi")){ 51 if(b!=null){ 52 for(String s : b.split(",")){ 53 gi.add(Integer.parseInt(s)); 54 } 55 } 56 }else if(a.equals("accession")){ 57 if(b!=null){ 58 for(String s : b.split(",")){ 59 acc.add(s); 60 } 61 } 62 }else if(a.equals("header")){ 63 if(b!=null){ 64 for(String s : b.split(",")){ 65 header.add(s); 66 } 67 } 68 }else if(a.equals("slow")){ 69 slow=Parse.parseBoolean(b); 70 }else if(a.equals("fast")){ 71 slow=!Parse.parseBoolean(b); 72 }else if(a.equals("parse_flag_goes_here")){ 73 long fake_variable=Parse.parseKMG(b); 74 //Set a variable here 75 }else{ 76 outstream.println("Unknown parameter "+args[i]); 77 assert(false) : "Unknown parameter "+args[i]; 78 } 79 } 80 81 if(slow){ 82 for(String s : name){ 83 outstream.println(s+"\t"+nameToTaxid(s)); 84 } 85 for(Integer s : gi){ 86 outstream.println(s+"\t"+giToTaxid(s)); 87 } 88 for(String s : acc){ 89 outstream.println(s+"\t"+accessionToTaxid(s)); 90 } 91 }else{ 92 if(name.size()>0){ 93 int[] ids=nameToTaxidArray(name); 94 for(int i=0; i<ids.length; i++){ 95 outstream.println(name.get(i)+"\t"+ids[i]); 96 } 97 } 98 if(gi.size()>0){ 99 int[] ids=giToTaxidArray(gi); 100 for(int i=0; i<ids.length; i++){ 101 outstream.println(gi.get(i)+"\t"+ids[i]); 102 } 103 } 104 if(acc.size()>0){ 105 int[] ids=accessionToTaxidArray(acc); 106 for(int i=0; i<ids.length; i++){ 107 outstream.println(acc.get(i)+"\t"+ids[i]); 108 } 109 } 110 } 111 112 t.stopAndPrint(); 113 } 114 accessionToTaxid(String accession)115 public static int accessionToTaxid(String accession){ 116 String s=sendAndReceive("pt/accession/",accession); 117 if(s==null || s.length()<1 || !Tools.isDigitOrSign(s.charAt(0))){return -1;} 118 return Integer.parseInt(s); 119 } 120 accessionToTaxidSpecificServer(String path, String accession)121 public static int accessionToTaxidSpecificServer(String path, String accession){ 122 String s=sendAndReceiveSpecificServer(path,"pt/accession/",accession); 123 if(s==null || s.length()<1 || !Tools.isDigitOrSign(s.charAt(0))){return -1;} 124 return Integer.parseInt(s); 125 } 126 giToTaxid(int gi)127 public static int giToTaxid(int gi){ 128 String s=sendAndReceive("pt/gi/",Integer.toString(gi)); 129 if(s==null || s.length()<1 || !Tools.isDigitOrSign(s.charAt(0))){return -1;} 130 return Integer.parseInt(s); 131 } 132 nameToTaxid(String name)133 public static int nameToTaxid(String name){ 134 String s=sendAndReceive("pt/name/",name.replace(' ', '_')); 135 if(s==null || s.length()<1 || !Tools.isDigitOrSign(s.charAt(0))){return -1;} 136 return Integer.parseInt(s); 137 } 138 headerToTaxid(String header)139 public static int headerToTaxid(String header){ 140 String s=sendAndReceive("pt/name/",header); 141 if(s==null || s.length()<1 || !Tools.isDigitOrSign(s.charAt(0))){return -1;} 142 return Integer.parseInt(s); 143 } 144 145 accessionToTaxidArray(String accession)146 public static int[] accessionToTaxidArray(String accession){ 147 String s=sendAndReceive("pt/accession/",accession); 148 // System.err.println("Sent "+accession+"\nReceived "+s); 149 return splitOutput(s); 150 } 151 giToTaxidArray(String gi)152 public static int[] giToTaxidArray(String gi){ 153 String s=sendAndReceive("pt/gi/",gi); 154 return splitOutput(s); 155 } 156 nameToTaxidArray(String name)157 public static int[] nameToTaxidArray(String name){ 158 String s=sendAndReceive("pt/name/",name.replace(' ', '_')); 159 return splitOutput(s); 160 } 161 headerToTaxidArray(String header)162 public static int[] headerToTaxidArray(String header){ 163 String s=sendAndReceive("pt/header/",header); 164 return splitOutput(s); 165 } 166 167 accessionToTaxidArray(ArrayList<String> accession)168 public static int[] accessionToTaxidArray(ArrayList<String> accession){ 169 String s=sendAndReceive("pt/accession/",fuse(accession)); 170 return splitOutput(s); 171 } 172 giToTaxidArray(ArrayList<Integer> gi)173 public static int[] giToTaxidArray(ArrayList<Integer> gi){ 174 String s=sendAndReceive("pt/gi/",fuse(gi)); 175 return splitOutput(s); 176 } 177 nameToTaxidArray(ArrayList<String> name)178 public static int[] nameToTaxidArray(ArrayList<String> name){ 179 String s=sendAndReceive("pt/name/",fuse(name).replace(' ', '_')); 180 return splitOutput(s); 181 } 182 headerToTaxidArray(ArrayList<String> header)183 public static int[] headerToTaxidArray(ArrayList<String> header){ 184 String s=sendAndReceive("pt/header/",fuse(header)); 185 return splitOutput(s); 186 } 187 splitOutput(String s)188 private static final int[] splitOutput(String s){ 189 if(s==null || s.length()<1 || !Tools.isDigitOrSign(s.charAt(0))){return null;} 190 String[] split=s.split(","); 191 int[] ret=new int[split.length]; 192 for(int i=0; i<split.length; i++){ 193 ret[i]=Integer.parseInt(split[i]); 194 } 195 return ret; 196 } 197 sendAndReceive(String prefix, String message)198 private static final String sendAndReceive(String prefix, String message){ 199 String path=Shared.taxServer(); 200 return sendAndReceiveSpecificServer(path, prefix, message); 201 } 202 sendAndReceiveSpecificServer(String path, String prefix, String message)203 private static final String sendAndReceiveSpecificServer(String path, String prefix, String message){ 204 String response=null; 205 for(int i=0, millis=200; i<12 && (response==null || response.length()==0); i++) { 206 if(i>0){ 207 System.err.println("Null response, retrying after "+millis+" ms."); 208 try { 209 Thread.sleep(millis); 210 } catch (InterruptedException e) { 211 e.printStackTrace(); 212 } 213 millis*=2; 214 } 215 response=sendAndReceiveOnceSpecificServer(path, prefix, message); 216 } 217 return response; 218 } 219 sendAndReceiveOnce(String prefix, String message)220 private static String sendAndReceiveOnce(String prefix, String message){ 221 String path=Shared.taxServer(); 222 return sendAndReceiveOnceSpecificServer(path, prefix, message); 223 } 224 sendAndReceiveOnceSpecificServer(String path, String prefix, String message)225 private static String sendAndReceiveOnceSpecificServer(String path, String prefix, String message){ 226 final String response; 227 if(message.length()<2000){//NERSC Apache limit is around 8kb 228 message=prefix+PercentEncoding.symbolToCode(message); 229 ByteBuilder bb=ServerTools.readPage(path+message, false); 230 response=(bb==null ? null : bb.toString()); 231 // System.err.println("S&R1 send:\n"+path+message); 232 // System.err.println("S&R1 receive:\n"+response); 233 }else{ 234 StringNum sn=ServerTools.sendAndReceive((prefix+message).getBytes(), path+"$POST"); 235 response=sn.s; 236 // System.err.println("S&R2: "+message+"\n"+path+"$POST"); 237 } 238 return response; 239 } 240 fuse(ArrayList<?> list)241 private static String fuse(ArrayList<?> list){ 242 if(list==null || list.size()<0){return null;} 243 StringBuilder sb=new StringBuilder(); 244 for(Object s : list){ 245 sb.append(s).append(','); 246 } 247 sb.setLength(sb.length()-1); 248 return sb.toString(); 249 } 250 251 public static PrintStream outstream=System.err; 252 public static boolean verbose=false; 253 254 } 255