Java CGI HOWTO
 by David H. Silber [email protected]
 v0.5, 1 December 1998

 This HOWTO document explains how to set up your server to allow CGI
 programs written in Java and how to use Java to write CGI programs.
 Although HOWTO documents are targetted towards use with the Linux
 operating system, this particular one is not dependant on the particu-
 lar version of unix used.
 ______________________________________________________________________

 Table of Contents






















































 1. Introduction

    1.1 Prior Knowledge
    1.2 This Document
    1.3 The Package
    1.4 The Mailing List

 2. Setting Up Your Server to Run Java CGI Programs (With Explanations)

    2.1 System Requirements
    2.2 Java CGI Add-On Software
    2.3 Unpacking the Source
    2.4 Decide On Your Local Path Policies
    2.5 Testing your installation.

 3. Setting Up Your Server to Run Java CGI Programs (The Short Form)

 4. Executing a Java CGI Program

    4.1 Obstacles to Running Java Programs Under the CGI Model
       4.1.1 You can't run Java programs like ordinary executables.
       4.1.2 Java does not have general access to the environment.
    4.2 Overcoming Problems in Running Java CGI Programs
       4.2.1 The java.cgi script.
       4.2.2 Invoking java.cgi from an HTML form.

 5. Using the Java CGI Classes.

    5.1 CGI
       5.1.1 Class Syntax
       5.1.2 Class Description
       5.1.3 Member Summary
       5.1.4 See Also
       5.1.5 CGI()
       5.1.6 getNames()
       5.1.7 getValue()
    5.2 CGI_Test
       5.2.1 Member Summary
       5.2.2 See Also
       5.2.3 main()
    5.3 Email
       5.3.1 Class Syntax
       5.3.2 Class Description
       5.3.3 Member Summary
       5.3.4 See Also
       5.3.5 Email()
       5.3.6 send()
       5.3.7 sendTo()
       5.3.8 subject()
    5.4 Email_Test
       5.4.1 Member Summary
       5.4.2 See Also
       5.4.3 main()
    5.5 HTML
       5.5.1 Class Syntax
       5.5.2 Class Description
       5.5.3 Member Summary
       5.5.4 See Also
       5.5.5 HTML()
       5.5.6 author()
       5.5.7 definitionList()
       5.5.8 definitionListTerm()
       5.5.9 endList()
       5.5.10 listItem()
       5.5.11 send()
       5.5.12 title()
    5.6 HTML_Test
       5.6.1 Member Summary
       5.6.2 See Also
       5.6.3 main()
    5.7 Text
       5.7.1 Class Syntax
       5.7.2 Class Description
       5.7.3 Member Summary
       5.7.4 See Also
       5.7.5 add()
       5.7.6 addLineBreak()
       5.7.7 addParagraph()

 6. Future Plans

 7. Changes

    7.1 Changes from 0.4 to 0.5
    7.2 Changes from 0.3 to 0.4
    7.3 Changes from 0.2 to 0.3
    7.4 Changes from 0.1 to 0.2


 ______________________________________________________________________

 11..  IInnttrroodduuccttiioonn

 Because of the way that Java is designed the programmer does not have
 easy access to the system's environment variables.  Because of the way
 that the Java Development Kit (JDK) is set up, it is necessary to use
 multiple tokens to invoke a program, which does not mesh very well
 with the standard HTML forms/CGI manner of operations.  There are ways
 around these limitations, and I have implemented one of them.  Read
 further for details.

 Since I wrote the previous paragraph in 1996, there have been many
 changes in the Java technology.  It is likely that a better solution
 to running server-side Java programs is now available -- perhaps you
 should take a look at servlets.




 11..11..  PPrriioorr KKnnoowwlleeddggee

 I am assuming that you have a general knowledge of HTML and CGI
 concepts and at least a minimal knowledge of your HTTP server.  You
 should also know how to program in Java, or a lot of this will not
 make sense.




 11..22..  TThhiiss DDooccuummeenntt

 The latest version of this document can be read at
 http://www.orbits.com/software/Java_CGI.html.




 11..33..  TThhee PPaacckkaaggee

 The latest version of the package described here can be accessed via
 anonymous FTP at ftp://ftp.orbits.com/pub/software/java_cgi-0.5.tgz.
 The package distribution includes SGML source for this document.
 The package is distributed under the terms of the GNU Library General
 Public License.  This document can be distributed under the terms of
 the Linux HOWTO copyright notice.

 If you use this software, please make some reference to
 http://www.orbits.com/software/Java_CGI.html, so that others will be
 able to find the Java CGI classes.

 I have run out of time to maintain and support this package, so this
 will probably be its final release.  If anyone out there is
 sufficiently enamoured of this software that they wish to take over
 the maintenace of it, please contact me at javacgi-
 [email protected].




 11..44..  TThhee MMaaiilliinngg LLiisstt

 I have created a majordomo list to allow people to help each-other
 work through their mutual problems in installing and using this
 software.  Send a message to [email protected], containing
 the word _s_u_b_s_c_r_i_b_e.




 22..  SSeettttiinngg UUpp YYoouurr SSeerrvveerr ttoo RRuunn JJaavvaa CCGGII PPrrooggrraammss ((WWiitthh EExxppllaannaa--
 ttiioonnss))

 This section will lead you through installing my _J_a_v_a _C_G_I package with
 copious explanations so that you know what the effects of your actions
 will be.  If you just want to install the programs and don't care
 about the whys & wherefores, skip to ``Setting Up Your Server to Run
 Java CGI Programs (The Short Form)''.




 22..11..  SSyysstteemm RReeqquuiirreemmeennttss

 This software should work on any unix-like web server that has the
 Java Development Kit installed.  I am using it on a _D_e_b_i_a_n _L_i_n_u_x
 system running _a_p_a_c_h_e as the HTTP daemon.  If you find that it does
 not run on your server, please contact the mailing list.  See ``The
 Mailing List'' for details.

 Unfortunatly, the Java run-time interpreter seems to be something of a
 memory hog -- you may want to throw another few megabytes of RAM onto
 your server if you will be using Java CGI programs a lot.




 22..22..  JJaavvaa CCGGII AAdddd--OOnn SSooffttwwaarree

 The software that I wrote to aid in this is called _J_a_v_a _C_G_I.  You can
 get it from ftp://ftp.orbits.com/pub/software/java_cgi-0.5.tgz.  (The
 version number may have changed.)







 22..33..  UUnnppaacckkiinngg tthhee SSoouurrccee

 Find a convenient directory to unpack this package into.  (If you
 don't already have a standard place to put packages, I suggest that
 you use /usr/local/src.)  Unpack the distribution with this command:

 gzip -dc java_cgi-0.5.tgz | tar -xvf -


 This will create a directory called java_cgi-0.5.  In there you will
 find the files referenced in the rest of this document.  (If the ver-
 sion number has changed, use the instructions from within that distri-
 bution from this point on.)




 22..44..  DDeecciiddee OOnn YYoouurr LLooccaall PPaatthh PPoolliicciieess

 You need to decide where you want your Java CGI programs to live.
 Generally, you will want to put them in a directory in parallel with
 your cgi-bin directory.  My _a_p_a_c_h_e server came configured to use
 /var/www/cgi-bin as the cgi-bin directory, so I use /var/www/javacgi
 as the directory to put Java CGI programs in.  You probably do not
 want to put your Java CGI programs into one of the existing CLASSPATH
 directories.  Edit the Makefile to reflect your system configuration.
 Make sure that you are logged in as the root user and run make
 install.  This will compile the Java programs, modify the java.cgi
 script to fit in with your system and install the programs in the
 appropriate places.  If you want the HTML version of this
 documentation and an HTML test document in addition, run make all
 instead.




 22..55..  TTeessttiinngg yyoouurr iinnssttaallllaattiioonn..

 Installed from the distribution are HTML documents called
 javacgitest.html, javaemailtest.html and javahtmltest.html.  If you
 installed all in the previous section, it will be in the directory you
 specified for WEBDIR in the Makefile.  If you didn't, you can run make
 test to build them from javacgitest.html-dist, javaemailtest.html-dist
 and javahtmltest.html-dist.

 When you are sure that your installation is working correctly, you may
 wish to remove CGI_Test.class, Email_Test.class and HTML_Test.class
 from your JAVACGI directory and javacgitest.html, javaemailtest.html
 and javahtmltest.html from your WEBDIR directory as they show the user
 information that is normally only available to the server.




 33..  SSeettttiinngg UUpp YYoouurr SSeerrvveerr ttoo RRuunn JJaavvaa CCGGII PPrrooggrraammss ((TThhee SShhoorrtt FFoorrmm))


 +o  Get the _J_a_v_a _C_G_I package from
    ftp://ftp.orbits.com/pub/software/java_cgi-0.5.tgz.  (The version
    number may have changed.)

 +o  Unpack the distribution with this command:

    gzip -dc java_cgi-0.5.tgz | tar -xvf -


 (If the version number has changed, use the instructions from within
 that distribution from this point on.)

 +o  Edit the Makefile you will find in the newly created directory
    java_cgi-0.5 as appropriate to your system.

 +o  As root, run make install.  This will compile the Java programs,
    apply your system-specific information and install the various
    files.  If you want the HTML version of this documentation and an
    HTML test document, run make all instead.

 +o  You should be ready to go.




 44..  EExxeeccuuttiinngg aa JJaavvaa CCGGII PPrrooggrraamm





 44..11..  OObbssttaacclleess ttoo RRuunnnniinngg JJaavvaa PPrrooggrraammss UUnnddeerr tthhee CCGGII MMooddeell

 There are two main problems in running a Java program from a web
 server:




 44..11..11..  YYoouu ccaann''tt rruunn JJaavvaa pprrooggrraammss lliikkee oorrddiinnaarryy eexxeeccuuttaabblleess..

 You need to run the Java run-time interpreter and provide the initial
 class (program to run) on the command-line.  With an HTML form, there
 is no provision for sending a command-line to the web server.




 44..11..22..  JJaavvaa ddooeess nnoott hhaavvee ggeenneerraall aacccceessss ttoo tthhee eennvviirroonnmmeenntt..

 Every environment variable that will be needed by the Java program
 must be explicitly passed in.  There is no method similar to the CC
 getenv() function.




 44..22..  OOvveerrccoommiinngg PPrroobblleemmss iinn RRuunnnniinngg JJaavvaa CCGGII PPrrooggrraammss

 To deal with these obstacles, I wrote a shell CGI program that
 provides the information needed by the Java interpreter.




 44..22..11..  TThhee jjaavvaa..ccggii ssccrriipptt..

 This shell script manages the interaction between the HTTP daemon and
 the Java CGI program that you wish to use.  It extracts the name of
 the program that you want to run from the server-provided data.  It
 collects all of the environment data into a temporary file.  Then, it
 runs the Java run-time interpreter with the name of the file of
 environment information and the program name added to the command-
 line.

 The java.cgi script was configured and installed in ``Decide On Your
 Local Path Policies''.




 44..22..22..  IInnvvookkiinngg jjaavvaa..ccggii ffrroomm aann HHTTMMLL ffoorrmm..

 My forms that use Java CGI programs specify a form action as follows:

 <form action="/cgi-bin/java.cgi/CGI_Test" method="POST">


 Where /cgi-bin/ is your local CGI binary directory, java.cgi is the
 Java front-end that allows us to run Java programs over the web and
 CGI_Test is an example of the name of the Java program to run.




 55..  UUssiinngg tthhee JJaavvaa CCGGII CCllaasssseess..

 There are currently three main classes supported -- ``CGI'', ``Email''
 and ``HTML''.  I am considering adding classes to deal with MIME-
 formatted input and output -- MIMEin & MIMEout, respectively.

 There are also a few support and test classes.  ``CGI_Test'',
 ``Email_Test'' and ``HTML_Test'' are intended to be used to test your
 installation.  They can also be used as a starting-point for your own
 Java programs which use this class library.  The ``Text'' class is the
 superclass for both the Email and the HTML classes.




 55..11..  CCGGII





 55..11..11..  CCllaassss SSyynnttaaxx

 public class CGI




 55..11..22..  CCllaassss DDeessccrriippttiioonn

 The CGI class holds the ``CGI Information'' -- Environment variables
 set by the web server and the name/value sent from a form when its
 ssuubbmmiitt action is selected.  All information is stored in a Properties
 class object.

 This class is in the ``Orbits.net'' package.




 55..11..33..  MMeemmbbeerr SSuummmmaarryy





 ______________________________________________________________________
         CGI()         //  Constructor.
         getNames()    //  Get the list of names.
         getValue()    //  Get form value by specifying name.
 ______________________________________________________________________






 55..11..44..  SSeeee AAllssoo

 CGI_Test.




 55..11..55..  CCGGII(())


    PPuurrppoossee
       Constructs an object which contains the available CGI data.

    SSyynnttaaxx
       public CGI()

    DDeessccrriippttiioonn
       When a CGI object is constructed, all available CGI information
       is sucked-up into storage local to the new object.




 55..11..66..  ggeettNNaammeess(())


    PPuurrppoossee
       List the names which are defined to have corresponding values.

    SSyynnttaaxx
       public Enumeration getKeys ()

    DDeessccrriippttiioonn
       Provides the full list of names for which coresponding values
       are defined.

    RReettuurrnnss
       An Enumeration of all the names defined.




 55..11..77..  ggeettVVaalluuee(())


    PPuurrppoossee
       Retrieves the vvaalluuee associated with the nnaammee specified.

    SSyynnttaaxx
       public String getValue ( String name )

    DDeessccrriippttiioonn
       This method provides the corespondence between the names and
       values sent from an HTML form.

    PPaarraammeetteerr

       nnaammee
          The key by which values are selected.

    RReettuurrnnss
       A String containing the value.




 55..22..  CCGGII__TTeesstt

 This class provides both an example of how to use the CGI class and a
 test program which can be used to confirm that the _J_a_v_a _C_G_I package is
 functioning correctly.




 55..22..11..  MMeemmbbeerr SSuummmmaarryy


 ______________________________________________________________________
         main()      //  Program main().
 ______________________________________________________________________






 55..22..22..  SSeeee AAllssoo

 CGI.




 55..22..33..  mmaaiinn(())


    PPuurrppoossee
       Provide a main() method.

    SSyynnttaaxx
       public static void main( String argv[] )

    DDeessccrriippttiioonn
       This is the entry point for a CGI program which does nothing but
       return a list of the available name/value pairs and their
       current values.

    PPaarraammeetteerr

       aarrggvv[[]]
          Arguments passed to the program by the java.cgi script.
          Currently unused.




 55..33..  EEmmaaiill



 55..33..11..  CCllaassss SSyynnttaaxx

 public class Email extends Text




 55..33..22..  CCllaassss DDeessccrriippttiioonn

 Messages are built up with the Text class add*() methods and the e-
 mail-specific methods added by this class.  When complete, the message
 is sent to its destination.

 This class is in the ``Orbits.net'' package.




 55..33..33..  MMeemmbbeerr SSuummmmaarryy


 ______________________________________________________________________
         Email()      //  Constructor.
         send()       //  Send the e-mail message.
         sendTo()     //  Add a destination for message.
         subject()    //  Set the Subject: for message.
 ______________________________________________________________________






 55..33..44..  SSeeee AAllssoo

 Email_Test, Text.




 55..33..55..  EEmmaaiill(())


    PPuurrppoossee
       Constructs an object which will contain an email message.

    SSyynnttaaxx
       public Email()

    DDeessccrriippttiioonn
       Sets up an empty message to be completed by the Email methods.

    SSeeee AAllssoo
       Text.




 55..33..66..  sseenndd(())


    PPuurrppoossee
       Send the e-mail message.

    SSyynnttaaxx
       public void send ()
    DDeessccrriippttiioonn
       This formats and sends the message.  If no destination address
       has been set, there is no action taken.




 55..33..77..  sseennddTToo(())


    PPuurrppoossee
       Add a destination for this message.

    SSyynnttaaxx
       public String sendTo ( String address )

    DDeessccrriippttiioonn
       Add address to the list of destinations for this method.  There
       is no set limit to the number of destinations an e-mail message
       may have.  I'm sure that if you build up the list large enough,
       you can exceed the size of the parameter list that the _M_a_i_l
       _T_r_a_n_s_p_o_r_t _A_g_e_n_t can accept or use up your memory.

    PPaarraammeetteerr//

       aaddddrreessss
          A destination to send this message to.




 55..33..88..  ssuubbjjeecctt(())


    PPuurrppoossee
       Set the subject for this message.

    SSyynnttaaxx
       public void subject ( String subject )

    DDeessccrriippttiioonn
       This method sets the text for the e-mail's Subject: line.  If
       called more than once, the latest subject set is the one that is
       used.

    PPaarraammeetteerr

       ssuubbjjeecctt
          The text of this message's Subject: line.




 55..44..  EEmmaaiill__TTeesstt

 This class provides both an example of how to use the Email class and
 a test program which can be used to confirm that the _J_a_v_a _C_G_I package
 is functioning correctly.




 55..44..11..  MMeemmbbeerr SSuummmmaarryy



 ______________________________________________________________________
         main()      //  Program main().
 ______________________________________________________________________






 55..44..22..  SSeeee AAllssoo

 Email.




 55..44..33..  mmaaiinn(())


    PPuurrppoossee
       Provide a main() method.

    SSyynnttaaxx
       public static void main( String argv[] )

    DDeessccrriippttiioonn
       This is the entry point for a CGI program which returns a list
       of the available name/value pairs and their current values.  It
       will also send this list to the address specified in the Email
       variable.

    PPaarraammeetteerr

       aarrggvv[[]]
          Arguments passed to the program by the java.cgi script.
          Currently unused.




 55..55..  HHTTMMLL





 55..55..11..  CCllaassss SSyynnttaaxx

 public class HTML extends Text




 55..55..22..  CCllaassss DDeessccrriippttiioonn

 Messages are built up with the Text class add*() methods and the HTML-
 specific methods added by this class.  When complete, the message is
 sent to its destination.

 Currently, there is no error checking to confirm that the list-
 building methods are being used in a correct order, so the  programmer
 must take pains not to violate HTML syntax.

 This class is in the ``Orbits.net'' package.


 55..55..33..  MMeemmbbeerr SSuummmmaarryy


 ______________________________________________________________________
         HTML()                  //  Constructor.
         author()                //  Set the name of the document author.
         definitionList()        //  Start a definition list.
         definitionListTerm()    //  Add a term to a definition list.
         endList()               //  End a list.
         listItem()              //  Add an entry to a list.
         send()                  //  Send the HTML message.
         title()                 //  Set the text for the document title.
 ______________________________________________________________________






 55..55..44..  SSeeee AAllssoo

 HTML_Test, Text.




 55..55..55..  HHTTMMLL(())


    PPuurrppoossee
       Constructs an object which will contain an HTML message.

    SSyynnttaaxx
       public HTML()

    DDeessccrriippttiioonn
       Sets up an empty message to be completed by the HTML methods.

    SSeeee AAllssoo
       Text.




 55..55..66..  aauutthhoorr(())


    PPuurrppoossee
       Set the name of the document author.

    SSyynnttaaxx
       public void author ( String author )

    DDeessccrriippttiioonn
       Set the name of the document author to author.

    PPaarraammeetteerr//

       aauutthhoorr
          The text to use as the author of this message.

    SSeeee AAllssoo
       title().



 55..55..77..  ddeeffiinniittiioonnLLiisstt(())


    PPuurrppoossee
       Start a definition list.

    SSyynnttaaxx
       public void definitionList ()

    DDeessccrriippttiioonn
       Start a definition list.  A _d_e_f_i_n_i_t_i_o_n _l_i_s_t is a list
       specialized so that each entry in the list is a _t_e_r_m followed by
       the definition _t_e_x_t for that term.  The start of a definition
       list should be followed by the creation of (at least) one
       term/text pair and a call to the endList() method.  _N_o_t_e _t_h_a_t_,
       _c_u_r_r_e_n_t_l_y_, _l_i_s_t_s _c_a_n_n_o_t _b_e _n_e_s_t_e_d_.

    SSeeee AAllssoo
       definitionListTerm(), endList(), listItem().




 55..55..88..  ddeeffiinniittiioonnLLiissttTTeerrmm(())


    PPuurrppoossee
       Add a term to a definition list.

    SSyynnttaaxx
       public void definitionListTerm ()

    DDeessccrriippttiioonn
       Add a term to a definition list.  The text for the term part of
       the current list entry should be appended to the message after
       this method is called and before a corresponding listItem method
       is called.

    SSeeee AAllssoo
       definitionList(), listItem().




 55..55..99..  eennddLLiisstt(())


    PPuurrppoossee
       End a list.

    SSyynnttaaxx
       public void endList ()

    DDeessccrriippttiioonn
       End a list.  This method closes out a list.  _N_o_t_e _t_h_a_t_,
       _c_u_r_r_e_n_t_l_y_, _l_i_s_t_s _c_a_n_n_o_t _b_e _n_e_s_t_e_d_.

    SSeeee AAllssoo
       definitionList().







 55..55..1100..  lliissttIItteemm(())


    PPuurrppoossee
       Add an entry to a list.

    SSyynnttaaxx
       public void listItem ()

       public void listItem ( String item )

       public boolean listItem ( String term, String item )

    DDeessccrriippttiioonn
       Add an entry to a list.  If the first form is used, the text for
       the current list item should be appended to the message after
       this method is called and before any other list methods are
       called.  In the second and third forms, the item text is
       specified as a parameter to the method instead of (or in
       addition to) being appended to the message.  The third form is
       specific to definition lists and provides both the term and the
       definition of the list entry.

    PPaarraammeetteerrss

       iitteemm
          The text of this list entry.

       tteerrmm
          The text of this definition list entry's term part.

    SSeeee AAllssoo
       definitionList(), definitionListTerm(), endList().




 55..55..1111..  sseenndd(())


    PPuurrppoossee
       Send the HTML message.

    SSyynnttaaxx
       public void send ()

    DDeessccrriippttiioonn
       Send the HTML message.




 55..55..1122..  ttiittllee(())


    PPuurrppoossee
       Set the text for the document title.

    SSyynnttaaxx
       public void title ( String title )

    DDeessccrriippttiioonn
       Set the text for the document title.

    PPaarraammeetteerr

       ttiittllee
          The text of this message's title.

    SSeeee AAllssoo
       author().




 55..66..  HHTTMMLL__TTeesstt

 This class provides both an example of how to use the HTML class and a
 test program which can be used to confirm that the _J_a_v_a _C_G_I package is
 functioning correctly.




 55..66..11..  MMeemmbbeerr SSuummmmaarryy


 ______________________________________________________________________
         main()      //  Program main().
 ______________________________________________________________________






 55..66..22..  SSeeee AAllssoo

 HTML.




 55..66..33..  mmaaiinn(())


    PPuurrppoossee
       Provide a main() method.

    SSyynnttaaxx
       public static void main( String argv[] )

    DDeessccrriippttiioonn
       This is the entry point for a CGI program which returns a list
       of the available name/value pairs in an HTML document, with each
       name/value pair displayed in a definition list element.

    PPaarraammeetteerr

       aarrggvv[[]]
          Arguments passed to the program by the java.cgi script.
          Currently unused.




 55..77..  TTeexxtt





 55..77..11..  CCllaassss SSyynnttaaxx

 public abstract class Text




 55..77..22..  CCllaassss DDeessccrriippttiioonn

 This class is the superclass of the Email and HTML classes.  Messages
 are built up with the methods in this class and completed and
 formatted with the methods in subclasses.

 This class is in the ``Orbits.text'' package.




 55..77..33..  MMeemmbbeerr SSuummmmaarryy


 ______________________________________________________________________
         Text()            //  Constructor.
         add()             //  Add text to this object.
         addLineBreak()    //  Add a line break.
         addParagraph()    //  Add a paragraph break.
 ______________________________________________________________________






 55..77..44..  SSeeee AAllssoo

 Email, HTML.




 55..77..55..  aadddd(())


    PPuurrppoossee
       Add text to this item.

    SSyynnttaaxx
       public void add ( char addition )

       public void add ( String addition )

       public void add ( StringBuffer addition )

    DDeessccrriippttiioonn
       Add addition to the contents of this text item.

    PPaarraammeetteerr

       aaddddiittiioonn
          Text to be added to the text item.

    SSeeee AAllssoo
       addLineBreak(), addParagraph().



 55..77..66..  aaddddLLiinneeBBrreeaakk(())


    PPuurrppoossee
       Force a line break at this point in the text.

    SSyynnttaaxx
       public void addLineBreak ()

    DDeessccrriippttiioonn
       Add a line break to the text at the current point.

    SSeeee AAllssoo
       add(), addParagraph().




 55..77..77..  aaddddPPaarraaggrraapphh(())


    PPuurrppoossee
       Start a new paragaph.

    SSyynnttaaxx
       public void add ()

    DDeessccrriippttiioonn
       Start a new paragraph at this point in the text flow.

    SSeeee AAllssoo
       add(), addLineBreak().




 66..  FFuuttuurree PPllaannss


 +o  Add to the Email class:

    EEmmaaiill(( iinntt ccaappaacciittyy ))
       Used when we know how much space the message will need to have
       allocated.

    sseennddTToo(( SSttrriinngg [[]] aaddddrreessss ))
       Add a list of primary destinations to the e-mail message.

    sseennddCCcc(( SSttrriinngg aaddddrreessss ))
       Add a Carbon-Copy destination to the e-mail message.

    sseennddCCcc(( SSttrriinngg [[]] aaddddrreessss ))
       Add a list of Carbon-Copy destinations to the e-mail message.

    sseennddBBcccc(( SSttrriinngg aaddddrreessss ))
       Add a Blind Carbon-Copy destination to the e-mail message.

    sseennddBBcccc(( SSttrriinngg [[]] aaddddrreessss ))
       Add a list of Blind Carbon-Copy destinations to the e-mail
       message.

 +o  Add to the HTML class:

    HHTTMMLL(( iinntt ccaappaacciittyy ))
       Used when we know how much space the message will need to have
       allocated.
    ppuubblliicc vvooiidd uunnoorrddeerreeddLLiisstt(())
       Start an unordered list.

    ppuubblliicc vvooiidd oorrddeerreeddLLiisstt(())
       Start an ordered list.

    ppuubblliicc vvooiidd ddiirreeccttoorryyLLiisstt(())
       Start a directory list.

    ppuubblliicc vvooiidd mmeennuuLLiisstt(())
       Start a menu list.

    vvooiidd aanncchhoorr(( SSttrriinngg aanncchhoorrNNaammee ))
       Specify an anchor.

    vvooiidd lliinnkk(( SSttrriinngg uurrll,, SSttrriinngg tteexxtt ))
       Specify a link.

    vvooiidd aapppplleett(( SSttrriinngg uurrll,, SSttrriinngg aallttTTeexxtt ))
       Specify an applet link.

 +o  Allow HTML lists to be nested.

 +o  Add error checking code to enforce correct ordering of HTML list
    formatting codes.

 +o  The location of the file of environment data should be configurable
    from the Makefile.

 +o  Get rid of the spurious empty name/value pair that appears in the
    list when we are dealing with the GET method of data transfer.

 +o  Consider having CGI implement the java.util.Enumeration interface
    to successively provide variable names.

 +o  Add a Test class, which would use every method in this package.

 +o  Document how CGI_Test, Email_Test and HTML_Test build on each other
    to provide incremental tests for debugging purposes.

 +o  Document how Test uses every feature available in this package.




 77..  CChhaannggeess





 77..11..  CChhaannggeess ffrroomm 00..44 ttoo 00..55


 +o  Changed documentation and comments to reflect the final nature of
    this release.




 77..22..  CChhaannggeess ffrroomm 00..33 ttoo 00..44


 +o  Fleshed out the HTML class to provide minimal functionality.


 +o  Wrote the HTML_Test class and javahtmltest.html-dist.

 +o  Added the HTML methods to deal with a definition list.




 77..33..  CChhaannggeess ffrroomm 00..22 ttoo 00..33


 +o  Added the Text and Email classes.  HTML was also added, but it is
    merely a stub at this point.

 +o  Put the various classes into packages.  The main classes are in
    Orbits.net.*, the support class Text is in Orbits.text.Text.

 +o  Changed CGItest to CGI_Test.

 +o  Added the Email_Test class.




 77..44..  CChhaannggeess ffrroomm 00..11 ttoo 00..22


 +o  The environment variables are put into a temportary file instead of
    being crammed into the Java inperpreter command-line.  The CGI
    class and java.cgi had to be modified.

 +o  The javacgitest.html document is made part of the distribution.

 +o  The text files which are modified by make upon installation are
    provided with names that end with _-_d_i_s_t.