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 }