001 /*
002 * This file is part of McIDAS-V
003 *
004 * Copyright 2007-2013
005 * Space Science and Engineering Center (SSEC)
006 * University of Wisconsin - Madison
007 * 1225 W. Dayton Street, Madison, WI 53706, USA
008 * https://www.ssec.wisc.edu/mcidas
009 *
010 * All Rights Reserved
011 *
012 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
013 * some McIDAS-V source code is based on IDV and VisAD source code.
014 *
015 * McIDAS-V is free software; you can redistribute it and/or modify
016 * it under the terms of the GNU Lesser Public License as published by
017 * the Free Software Foundation; either version 3 of the License, or
018 * (at your option) any later version.
019 *
020 * McIDAS-V is distributed in the hope that it will be useful,
021 * but WITHOUT ANY WARRANTY; without even the implied warranty of
022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023 * GNU Lesser Public License for more details.
024 *
025 * You should have received a copy of the GNU Lesser Public License
026 * along with this program. If not, see http://www.gnu.org/licenses.
027 */
028
029 package edu.wisc.ssec.mcidasv.data;
030
031 import java.io.BufferedInputStream;
032 import java.io.BufferedReader;
033 import java.io.DataInputStream;
034 import java.io.InputStream;
035 import java.io.InputStreamReader;
036 import java.net.URL;
037 import java.net.URLConnection;
038 import java.util.ArrayList;
039 import java.util.List;
040 import java.util.StringTokenizer;
041
042 /**
043 * Class McIdasXInfo Holds the state of the McIDAS-X session
044 * on the other end of the bridge
045 */
046 public class McIdasXInfo {
047
048 /** Conduit protocol info */
049 private String versionString = "2";
050 private String hostString = "localhost";
051 private String portString = "8080";
052 private String keyString = "00000000000000000000000000000000";
053
054 /**
055 * Constructor
056 */
057 public McIdasXInfo() {}
058
059 /**
060 * Copy constructor
061 *
062 * @param that The McIdasXInfo to copy
063 *
064 */
065 public McIdasXInfo(McIdasXInfo that) {
066 this.hostString = that.hostString;
067 this.portString = that.portString;
068 this.keyString = that.keyString;
069 }
070
071 /**
072 * Constructor
073 */
074 public McIdasXInfo(String host, String port, String key) {
075 this.hostString = host;
076 this.portString = port;
077 this.keyString = key;
078 }
079
080 /**
081 * Get the hostString property.
082 *
083 * @return The hostString property.
084 */
085 public String getHostString() {
086 return this.hostString;
087 }
088
089 /**
090 * Get the portString property.
091 *
092 * @return The portString property.
093 */
094 public String getPortString() {
095 return this.portString;
096 }
097
098 /**
099 * Get the keyString property.
100 *
101 * @return The keyString property.
102 */
103 public String getKeyString() {
104 return this.keyString;
105 }
106
107 /**
108 * Set the hostString property.
109 *
110 * @param newValue The new vaue for the hostString property.
111 */
112 public void setHostString(String newValue) {
113 this.hostString = newValue;
114 }
115
116 /**
117 * Set the portString property.
118 *
119 * @param newValue The new vaue for the portString property.
120 */
121 public void setPortString(String newValue) {
122 this.portString = newValue;
123 }
124
125 /**
126 * Set the keyString property.
127 *
128 * @param newValue The new vaue for the keyString property.
129 */
130 public void setKeyString(String newValue) {
131 this.keyString = newValue;
132 }
133
134 /**
135 * Get the frame request string.
136 *
137 * @return The frame request string.
138 */
139 private String getFrameRequest() {
140 return "http://" + hostString + ":" + portString + "/?sessionkey=" + keyString +
141 "&version=" + versionString + "&frame=0&x=0&y=0&type=V";
142 }
143
144 /**
145 * Get the frames request string.
146 *
147 * @return The frames request string.
148 */
149 private String getFramesRequest() {
150 return "http://" + hostString + ":" + portString + "/?sessionkey=" + keyString +
151 "&version=" + versionString + "&frame=0&x=0&y=0&type=U";
152 }
153
154 /**
155 * Get the file request string.
156 *
157 * @return The file request string.
158 */
159 private String getFileRequest(String filename) {
160 return "http://" + hostString + ":" + portString + "/?sessionkey=" + keyString +
161 "&version=" + versionString + "&frame=0&x=0&y=0&type=F&text=" + filename;
162 }
163
164 /**
165 * Get the file request DataInputStream.
166 *
167 * @return The file request DataInputStream.
168 */
169 public DataInputStream getFileInputStream(String filename) {
170 return getXInputStream(getFileRequest(filename));
171 }
172
173 /**
174 * Get the data request string.
175 *
176 * @return The data request string.
177 */
178 private String getDataRequest(Integer frame) {
179 if (frame < 1) frame = getCurrentFrame();
180 return "http://" + hostString + ":" + portString + "/?sessionkey=" + keyString +
181 "&version=" + versionString + "&frame=0&x=0&y=0&type=D&text=" + frame;
182 }
183
184 /**
185 * Get the data request DataInputStream.
186 *
187 * @return The data request DataInputStream.
188 */
189 public DataInputStream getDataInputStream(Integer frame) {
190 if (frame < 1) frame = getCurrentFrame();
191 return getXInputStream(getDataRequest(frame));
192 }
193
194 /**
195 * Get the graphics request string.
196 *
197 * @return The graphics request string.
198 */
199 private String getGraphicsRequest(Integer frame) {
200 if (frame < 1) frame = getCurrentFrame();
201 return "http://" + hostString + ":" + portString + "/?sessionkey=" + keyString +
202 "&version=" + versionString + "&frame=0&x=0&y=0&type=P&text=" + frame;
203 }
204
205 /**
206 * Get the graphics request DataInputStream.
207 *
208 * @return The graphics request DataInputStream.
209 */
210 public DataInputStream getGraphicsInputStream(Integer frame) {
211 return getXInputStream(getGraphicsRequest(frame));
212 }
213
214 /**
215 * Get the command request string.
216 *
217 * @return The command request string.
218 */
219 private String getCommandRequest(String commandLine) {
220 return "http://" + hostString + ":" + portString + "/?sessionkey=" + keyString +
221 "&version=" + versionString + "&frame=0&x=0&y=0&type=T&text=" + commandLine;
222 }
223
224 /**
225 * Get the command request string.
226 *
227 * @return The command request string.
228 */
229 private String getCommandRequest(String commandLine, int frame) {
230 return "http://" + hostString + ":" + portString + "/?sessionkey=" + keyString +
231 "&version=" + versionString + "&frame=" + frame + "&x=0&y=0&type=T&text=" + commandLine;
232 }
233
234 /**
235 * Get the command request DataInputStream.
236 *
237 * @return The command request DataInputStream.
238 */
239 public DataInputStream getCommandInputStream(String commandLine) {
240 return getXInputStream(getCommandRequest(commandLine));
241 }
242
243 /**
244 * Get the command request DataInputStream.
245 *
246 * @return The command request DataInputStream.
247 */
248 public DataInputStream getCommandInputStream(String commandLine, int frame) {
249 return getXInputStream(getCommandRequest(commandLine, frame));
250 }
251
252 /**
253 * Get the GIF request string.
254 *
255 * @return The GIF request string.
256 */
257 private String getGIFRequest(Integer frame) {
258 return "http://" + hostString + ":" + portString + "/?sessionkey=" + keyString +
259 "&version=" + versionString + "&frame=0&x=0&y=0&type=C&text=" + frame;
260 }
261
262 /**
263 * Get the GIF request DataInputStream.
264 *
265 * @return The GIF request DataInputStream.
266 */
267 public DataInputStream getGIFInputStream(Integer frame) {
268 return getXInputStream(getGIFRequest(frame));
269 }
270
271 /**
272 * Get a String representation of this object
273 *
274 * @return a string representation
275 */
276 public String toString() {
277 StringBuffer buf = new StringBuffer();
278 buf.append("McIdasXInfo as string: ");
279 buf.append("hostString=");
280 buf.append(this.hostString);
281 buf.append(", portString=");
282 buf.append(this.portString);
283 buf.append(", keyString=");
284 buf.append(this.keyString);
285 return buf.toString();
286 }
287
288 /**
289 * Get a DataInputStream from a given request String.
290 *
291 * @return a DataInputStream
292 */
293 private DataInputStream getXInputStream(String newRequest) {
294 URL url;
295 URLConnection urlc;
296 DataInputStream retStream = null;
297 try {
298 url = new URL(newRequest);
299 urlc = url.openConnection();
300 InputStream is = urlc.getInputStream();
301 retStream = new DataInputStream(new BufferedInputStream(is));
302 } catch (Exception e) {
303 return retStream;
304 }
305 return retStream;
306 }
307
308 /**
309 * Get the current frame in McIDAS-X.
310 *
311 * @return The current frame in McIDAS-X.
312 */
313 public int getCurrentFrame() {
314 int ret = -1;
315 DataInputStream inputStream = getXInputStream(getFrameRequest());
316 try {
317 BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
318 // Burn key line
319 String lineOut = br.readLine();
320 lineOut = br.readLine();
321 StringTokenizer tok = new StringTokenizer(lineOut, " ");
322 String responseType = tok.nextToken();
323 if (!responseType.equals("V")) {
324 System.out.println("getCurrentFrame unexpected responseType: " + responseType);
325 try { inputStream.close(); }
326 catch (Exception ee) {}
327 return ret;
328 }
329 ret = Integer.parseInt(tok.nextToken());
330 } catch (Exception e) {
331 System.out.println("getCurrentFrame exception: " + e);
332 try { inputStream.close(); }
333 catch (Exception ee) {}
334 return ret;
335 }
336 System.out.println("getCurrentFrame: " + ret);
337 return ret;
338 }
339
340 /**
341 * Get the number of frames in McIDAS-X.
342 *
343 * @return The number of frames in McIDAS-X.
344 */
345 public int getNumberOfFrames() {
346 int ret = -1;
347 String token = null;
348 DataInputStream inputStream = getXInputStream(getFrameRequest());
349 try {
350 BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
351 // Burn key line
352 String lineOut = br.readLine();
353 lineOut = br.readLine();
354 StringTokenizer tok = new StringTokenizer(lineOut, " ");
355 String responseType = tok.nextToken();
356 if (!responseType.equals("V")) {
357 System.out.println("getNumberOfFrames unexpected responseType: " + responseType);
358 try { inputStream.close(); }
359 catch (Exception ee) {}
360 return ret;
361 }
362 token = tok.nextToken();
363 token = tok.nextToken();
364 ret = Integer.parseInt(token.substring(1,4));
365 } catch (Exception e) {
366 System.out.println("getNumberOfFrames exception: " + e);
367 try { inputStream.close(); }
368 catch (Exception ee) {}
369 return ret;
370 }
371 System.out.println("getNumberOfFrames: " + ret);
372 return ret;
373 }
374
375 /**
376 * Get the list of frame numbers in McIDAS-X.
377 *
378 * @return The list of frame numbers in McIDAS-X.
379 */
380 public List getFrameNumbers() {
381 List frameNumbers = new ArrayList();
382 DataInputStream inputStream = getXInputStream(getFramesRequest());
383 if (inputStream == null) return frameNumbers;
384 String responseType = null;
385 StringTokenizer tok;
386 try {
387 BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
388 // Burn key line
389 String lineOut = br.readLine();
390 lineOut = br.readLine();
391 while (lineOut != null) {
392 tok = new StringTokenizer(lineOut, " ");
393 responseType = tok.nextToken();
394 if (!responseType.equals("U")) {
395 System.out.println("getFrameNumbers unexpected responseType: " + responseType);
396 try { inputStream.close(); }
397 catch (Exception ee) {}
398 return frameNumbers;
399 }
400 Integer frameInt = Integer.parseInt(tok.nextToken());
401 frameNumbers.add(frameInt);
402 lineOut = br.readLine();
403 }
404 } catch (Exception e) {
405 System.out.println("getFrameNumbers exception: " + e);
406 try { inputStream.close(); }
407 catch (Exception ee) {}
408 return frameNumbers;
409 }
410 // System.out.println("getFrameNumbers: " + frameNumbers);
411 return frameNumbers;
412 }
413
414 }