home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / lotus / eSuite.exe / eSuiteDPP / samples / weatherchart / ReadWeather.java < prev    next >
Text File  |  1998-01-09  |  12KB  |  429 lines

  1. /* 
  2.    -----------------------------------------------------------------------------------------------------
  3.     Description: ReadWeather
  4.     Author:      F. Salazar
  5.     Created:     June, 1997
  6.     
  7.     Copyright (c)1992-1997 Lotus Development Corp. All Rights Reserved.
  8.    -----------------------------------------------------------------------------------------------------
  9. */
  10. /*******************************************************************************
  11.     Change History:
  12.  
  13.     $Log:   //reebok/xyzL/JavaComp/webpack/samples/weatherchart/ReadWeather.java  
  14.   
  15.      Rev 1.5.2.1   09 Jan 1998 10:52:12   jdonohue
  16.   Change package name to samples.weatherchart
  17.   
  18.      Rev 1.5   13 Oct 1997 11:19:24   fsalazar
  19.   Correct precision on floating pt values.
  20.   
  21.      Rev 1.4   05 Aug 1997 10:15:42   fsalazar
  22.   Use webpack.samples.weatherchart package name.
  23.   
  24.      Rev 1.3   31 Jul 1997 15:25:48   fsalazar
  25.   Missed a deprecated readline().
  26.  
  27. *******************************************************************************/
  28.  
  29. package samples.weatherchart;
  30.  
  31. import java.io.*;
  32. import java.net.*;
  33. import java.util.*;
  34. import java.text.*;
  35.  
  36.  
  37.  
  38. /* ------------------------------------------------------------------------------------------------------
  39.  
  40. ReadWeather is a supporting application for the Lotus Kona Webpack Samples.
  41. Its purpose is to update dataset files which record weather information -- temperature,
  42. pressure and humidity -- for various cities.  ReadWeather should be scheduled to run once
  43. an hour; every 24 hours, its data files should be "reset", so that the datasets do not grow
  44. beyond a reasonable size.
  45.  
  46. Syntax for invoking ReadWeather is as follows:
  47.  
  48. (jvm) ReadWeather config [proxy:port] [/tzone]
  49. (jvm)            Java virtual machine which loads the application; either java or jview.
  50. ReadWeather        Name of class.
  51. config            Name of configuration file (see below).
  52. [proxy:port]    Optional.  If specified, ReadWeather will issue HTTP requests through a proxy server.
  53. [/t]            Optional.  Specifies a timezone code, eg EST.  If not specified, default will be used.
  54.  
  55. Example command-lines:
  56.  
  57.   jview ReadWeather readweather.dat
  58.   jview ReadWeather readweather.dat proxysrv.com:8080 /tEST
  59.  
  60. ------------------------------------------------------------------------------------------------------- */
  61.  
  62. /////////////////////////////////////////////////////////////////////////////////////////////////////
  63.  
  64. class ReadWeather
  65. {
  66.     private static String    m_sConfigFile;
  67.     private static boolean    m_bUseProxy = false;
  68.     private static String    m_sProxy;
  69.     private static int        m_iPort = 0;
  70.     private static String    m_sTimeZone;
  71.  
  72.  
  73.     /////////////////////////////////////////////////////////////////////////////////////////////////////
  74.  
  75.     private static boolean parseArgs( String args[] )
  76.     {
  77.         String        portstr, arg;
  78.         int            i, idx;
  79.         char        c;
  80.  
  81.         // get config file
  82.         try
  83.         {
  84.             m_sConfigFile = args[0];
  85.         }
  86.         catch( IndexOutOfBoundsException e )
  87.         {
  88.             System.out.print( "Syntax error: No configuration file specified.\r\n" +
  89.                                 " Usage: ReadWeather (config. file) [proxy:port]\r\n");
  90.             return false;
  91.         }
  92.  
  93.  
  94.         // go through optional args
  95.         try
  96.         {
  97.             i = 1;
  98.             while ( true )
  99.             {
  100.                 arg = args[i++];
  101.                 try
  102.                 {
  103.                     if ( arg.charAt( 0 ) == '/' )
  104.                     {
  105.                         c = arg.charAt( 1 );
  106.                         c = Character.toUpperCase(c);
  107.                         switch( c )
  108.                         {
  109.                             case 'T':
  110.                                 m_sTimeZone = arg.substring( 2, arg.length() );
  111.                                 break;
  112.  
  113.                             default:
  114.                                 break;
  115.                         }
  116.                     }
  117.                     else
  118.                     {
  119.                         // get optional proxy/port
  120.                         idx = arg.lastIndexOf( ':' );
  121.                         if ( idx < 1 )
  122.                         {
  123.                             System.out.print( "Syntax error: Invalid proxy:port expression.\r\n" +
  124.                                                 " Usage: ReadWeather (config. file) [proxy:port]\r\n");
  125.                             return false;
  126.                         }
  127.  
  128.                         m_sProxy = arg.substring( 0, idx );
  129.                         portstr  = arg.substring( idx+1, arg.length() );
  130.                         m_iPort = Integer.parseInt( portstr );
  131.  
  132.                         m_bUseProxy = true;
  133.                     }
  134.                 }  // try
  135.                 catch( StringIndexOutOfBoundsException e )
  136.                 {
  137.                 }
  138.             } // while
  139.         }  // try
  140.         catch( IndexOutOfBoundsException e )
  141.         {
  142.             // all done going through args array
  143.         }
  144.         catch( NumberFormatException e )
  145.         {
  146.             System.out.print( "Syntax error: Invalid proxy:port expression.\r\n" +
  147.                                 " Usage: ReadWeather (config. file) [proxy:port]\r\n");
  148.             return false;
  149.         }
  150.  
  151.         return true;
  152.     }  // parseArgs
  153.  
  154.     
  155.     ////////////////////////////////////////////////////////////////////////////////////////////////////////
  156.     // Update 3 dataset files.  The filenames are constructed using 'setfile' as the base
  157.     // name, and then appending the extensions .TEM, .HUM, .PRE.
  158.     // Method for each file:
  159.     // - delete temp file (if present)
  160.     // - create/open temp file
  161.     // - open dataset file
  162.     // - copy 1st line (caption) from dataset file to temp file.
  163.     // - read 2nd line (column labels).  append [tab] and current hour.  write to temp file.
  164.     // - read 3rd line (data values).
  165.     // - append new temperature, pressure or humidity value to line, write to temp file
  166.     // - close files.
  167.     // - rename dataset to .BAK
  168.     // - rename temp file to dataset file.
  169.     // - delete .BAK file
  170.  
  171.     private static boolean updateDataset( String cityname, String setfile, GetWData reader )
  172.     {
  173.         int            ctr, idx, itOffset, iHour, iAmPm;
  174.         String        dataName, tmpName, bakName;
  175.         String        line, value, ampm;
  176.         File        tmpFile, dataFile, bakFile;
  177.  
  178.         Date                    now;
  179.         TimeZone                tz = null;
  180.         GregorianCalendar        cal;
  181.         SimpleDateFormat        fmt;
  182.  
  183.             
  184.         FileInputStream        fis;
  185.         FileOutputStream    fos;
  186.         DataInputStream        dis;
  187.         DataOutputStream    dos;
  188.         BufferedReader        bdis;
  189.  
  190.         String        ext[] = new String[3];
  191.         ext[0] = new String( ".TEM" );
  192.         ext[1] = new String( ".HUM" );
  193.         ext[2] = new String( ".BAR" );
  194.  
  195.  
  196.         try
  197.         {
  198.             // make local time, in hours
  199.             if ( null != m_sTimeZone )
  200.                 tz = TimeZone.getTimeZone( m_sTimeZone );
  201.             if ( null == tz )
  202.                 tz = TimeZone.getDefault();
  203.             cal = new GregorianCalendar( tz );
  204.             iHour = cal.get( Calendar.HOUR );
  205.             if (0 == iHour )
  206.                 iHour = 12;
  207.             iAmPm = cal.get( Calendar.AM_PM );
  208.             if ( 0 == iAmPm )
  209.                 ampm = new String( "a" );
  210.             else
  211.                 ampm = new String( "p" );
  212.  
  213.  
  214.             // make name for temp. file
  215.             tmpName = new String( setfile );
  216.             idx = tmpName.lastIndexOf( '.' );
  217.             if ( idx > 1 )
  218.                 tmpName = tmpName.substring( 0, idx );
  219.             tmpName = tmpName + ".tmp";
  220.  
  221.             // make name for backup file
  222.             bakName = new String( setfile );
  223.             idx = bakName.lastIndexOf( '.' );
  224.             if ( idx > 1 )
  225.                 bakName = bakName.substring( 0, idx );
  226.             bakName = bakName + ".bak";
  227.  
  228.             // loop through set of 3 data files
  229.             ctr = 0;
  230.             while ( ctr < 3 )
  231.             {
  232.                 // make name of dataset file
  233.                 dataName = new String( setfile );
  234.                 idx = dataName.lastIndexOf( '.' );
  235.                 if ( idx > 1 )
  236.                     dataName = dataName.substring( 0, idx );
  237.                 dataName = dataName + ext[ ctr ];
  238.                 
  239.                 // create files
  240.                 tmpFile = new File( tmpName );
  241.                 dataFile = new File( dataName );
  242.  
  243.                 // delete temp. file
  244.                 if ( tmpFile.exists() )
  245.                     tmpFile.delete();
  246.  
  247.                 // create some streams
  248.                 fis = new FileInputStream( dataFile );
  249.                 fos = new FileOutputStream( tmpFile );
  250.                 dis = new DataInputStream( fis );
  251.                 dos = new DataOutputStream( fos );
  252.  
  253.                 bdis = new BufferedReader( new InputStreamReader( dis ) );
  254.  
  255.  
  256.                 // copy 1st line from input to output
  257.                 line = bdis.readLine();
  258.                 if ( line == null )
  259.                     return false;
  260.                 line += "\r\n";
  261.                 dos.writeBytes( line );
  262.  
  263.  
  264.                 // copy hours caption line, add new hour value
  265.                 // note that we preface the time with 'a' or 'p'
  266.                 // for am or pm.
  267.                 line = bdis.readLine();
  268.                 if ( line == null )
  269.                     return false;
  270.                 dos.writeBytes( line );
  271.                 value = String.valueOf( iHour );
  272.                 dos.writeBytes( "\t" + ampm + value + "\r\n" );
  273.  
  274.  
  275.                 //copy data line
  276.                 line = bdis.readLine();
  277.                 if ( line == null )
  278.                     return false;
  279.                 dos.writeBytes( line );
  280.                 dos.writeBytes( "   " );
  281.                 switch( ctr )
  282.                 {
  283.                     case 0:    value = reader.getTemperatureString();    break;
  284.                     case 1:    value = reader.getHumidityString();        break;
  285.                     case 2:    value = reader.getPressureString();        break;
  286.                 }
  287.                 dos.writeBytes( value + "\r\n" );
  288.  
  289.                 // close files.
  290.                 bdis.close();
  291.                 dos.close();
  292.  
  293.                 // rename dataset to .BAK
  294.                 bakFile = new File( bakName );
  295.                 dataFile.renameTo( bakFile );
  296.  
  297.                 // rename temp file to dataset file.
  298.                 dataFile = new File( dataName );
  299.                 tmpFile.renameTo( dataFile );
  300.  
  301.                 // delete .BAK file
  302.                 bakFile.delete();
  303.  
  304.                 // bump counter
  305.                 ctr++;
  306.             }  // while ctr<3
  307.  
  308.             return true;
  309.         }  // try
  310.         catch( Exception e )
  311.         {
  312.             System.out.print( "Exception in updateDataset() : " + e.getMessage() + "\r\n");
  313.  
  314.             return false;
  315.         }
  316.     }  // updateDataset
  317.  
  318.  
  319.  
  320.  
  321.     public static void main(String args[])
  322.     {
  323.         GetWData    reader;
  324.  
  325.  
  326.         // parse arguments
  327.         if ( !parseArgs( args ) )
  328.             return;
  329.  
  330.         // open config file
  331.         FileInputStream        fin;
  332.         DataInputStream        din;
  333.         BufferedReader        bdin;
  334.  
  335.         try
  336.         {
  337.             fin = new FileInputStream( m_sConfigFile );
  338.         }
  339.         catch( FileNotFoundException e )
  340.         {
  341.             System.out.print( "Syntax error: Config. file [" + m_sConfigFile + "] not found.\r\n" +
  342.                                 " Usage: ReadWeather (config. file) [proxy:port]\r\n");
  343.             return;
  344.         }
  345.  
  346.         // the config. file has lines with format:
  347.         // (city name)|(dataset filename)|URL
  348.         // For each line read, update the specified dataset file based on the URL
  349.  
  350.         int        cityidx, fileidx, iSetsUpdated = 0;
  351.         String    dataline, setfile, seturl, cityname;
  352.  
  353.         try
  354.         {
  355.             din = new DataInputStream( fin );
  356.             bdin = new BufferedReader( new InputStreamReader( din ) );
  357.  
  358.             while ( true )
  359.             {
  360.                 // dataline = din.readLine();
  361.                 dataline = bdin.readLine();
  362.                 if ( null == dataline )
  363.                     break;
  364.  
  365.                 cityidx = dataline.indexOf( '|' );
  366.                 if ( cityidx < 1 )
  367.                 {
  368.                     System.out.print( "ERROR:  Invalid config. file entry [" + dataline + "]\r");
  369.                     continue;
  370.                 }
  371.                 cityname = dataline.substring( 0, cityidx );
  372.  
  373.                 fileidx = dataline.indexOf( '|', cityidx+1 );
  374.                 if ( fileidx < 1 )
  375.                 {
  376.                     System.out.print( "ERROR:  Invalid config. file entry [" + dataline + "]\r");
  377.                     continue;
  378.                 }
  379.                 setfile = dataline.substring( cityidx+1, fileidx );
  380.                 seturl  = dataline.substring( fileidx+1, dataline.length() );
  381.                 setfile = setfile.trim();
  382.                 seturl  = seturl.trim();
  383.  
  384.                 if ( m_bUseProxy )
  385.                     reader = new GetWDataProxy( seturl, m_sProxy, m_iPort );
  386.                 else
  387.                     reader = new GetWDataDirect( seturl );
  388.  
  389.                 try
  390.                 {
  391.                     reader.read();
  392.                     updateDataset( cityname, setfile, reader );
  393.  
  394.                     System.out.print( cityname + "\t\t" +
  395.                                         "Temperature: " + reader.getTemperatureString() + 
  396.                                         "\tHumidity: " + reader.getHumidityString() + 
  397.                                         "\tPressure: " + reader.getPressureString() + "\r\n" );
  398.  
  399.                     iSetsUpdated++;
  400.                 }
  401.                 catch( MalformedURLException e )
  402.                 {
  403.                     System.out.print( "ERROR: " + e.getMessage() +
  404.                                         "\r\nProcessing line [" + dataline + "]\r\n" );
  405.                 }
  406.                 catch( IOException e )
  407.                 {
  408.                     System.out.print( "ERROR: " + e.getMessage() +
  409.                                         "\r\nProcessing line [" + dataline + "]\r\n" );
  410.                 }
  411.             }  // while
  412.  
  413.             System.out.print( "\r\nComplete.\r\n" );
  414.             System.out.print( iSetsUpdated + " date-set file(s) updated.\r\n\r\n" );
  415.         }  // try
  416.         catch( IOException e )
  417.         {
  418.             System.out.print( "ERROR: " + e.getMessage() + "]\r\n" );
  419.         }
  420.  
  421.     }  // main
  422.  
  423. }  // ReadWeather
  424.  
  425.  
  426.  
  427. // end of ReadWeather.java
  428. //////////////////////////////
  429.