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