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