You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by pg...@apache.org on 2002/08/26 22:49:10 UTC

cvs commit: jakarta-james/proposals/imap/test/org/apache/james/test AbstractProtocolTest.java

pgoldstein    2002/08/26 13:49:10

  Modified:    proposals/imap build-imap.xml
               proposals/imap/java/org/apache/james/imapserver
                        MimeMessageFileSource.java
               proposals/imap/test/org/apache/james/imapserver
                        IMAPTest.java InitialMail.java List1.test
                        Subscribe.test Welcome.test
               proposals/imap/test/org/apache/james/remotemanager
                        RemoteManagerLogin.test UserManagementTest.java
               proposals/imap/test/org/apache/james/smtpserver Send.test
               proposals/imap/test/org/apache/james/test
                        AbstractProtocolTest.java
  Log:
  * made "MimeMessageFileSource.java" implement the current signature of Source
     (added getSourceId())
  * Changed IMAPTest.java from address to be sender@localhost
  * set "mail.debug" property by default (compile time) in the  InitialMail.java test (oaj.imapserver.InitialMai)
  * Added Block of unordered items markers to List1.test for all folder listings (because the order is not guaranteed and should not  break the test)
  * Did the same for Subscribe.test
  * Changed daz2000 to localhost.localdomain in Welcome.test (you'll proably have to change it to your hostname but this will work for 
       more people than daz2000)
  stubbed out the beginnings of an Alternative test case in UserManagmentTest (for a response if the user already exists)
  * Added new functionality to AbstractProtocolTest which adds the functionality to allow one to put an unordered block in a testcase.
  * Added comments
  
  Thanks to Andrew C. Oliver for the submission
  
  Revision  Changes    Path
  1.4       +2 -2      jakarta-james/proposals/imap/build-imap.xml
  
  Index: build-imap.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-james/proposals/imap/build-imap.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- build-imap.xml	23 Jan 2002 21:53:31 -0000	1.3
  +++ build-imap.xml	26 Aug 2002 20:49:09 -0000	1.4
  @@ -29,7 +29,7 @@
   
     <property name="name" value="james"/>
     <property name="Name" value="James"/>
  -  <property name="version" value="2.0a2"/>
  +  <property name="version" value="2.0a3"/>
     <property name="year" value="1999-2001"/>
   
     <!-- There should be no need to override default compiler but need to change
  
  
  
  1.4       +4 -8      jakarta-james/proposals/imap/java/org/apache/james/imapserver/MimeMessageFileSource.java
  
  Index: MimeMessageFileSource.java
  ===================================================================
  RCS file: /home/cvs/jakarta-james/proposals/imap/java/org/apache/james/imapserver/MimeMessageFileSource.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- MimeMessageFileSource.java	9 Aug 2002 16:48:06 -0000	1.3
  +++ MimeMessageFileSource.java	26 Aug 2002 20:49:09 -0000	1.4
  @@ -17,21 +17,17 @@
   
       //Define how to get to the data
       String filename = null;
  -    int uid;
  -    static int global_uid = 0;
   
       public MimeMessageFileSource(String filename) {
           this.filename = filename;
  -        this.uid = global_uid++;
  -    }
  -
  -    public String getSourceId() {
  -        System.out.println("Marcs MimeMessageFileSource Unique ID #"+uid);
  -        return "Marcs MimeMessageFileSource Unique ID #"+uid;
       }
   
       public InputStream getInputStream() throws IOException {
           return new FileInputStream(filename);
  +    }
  +
  +    public String getSourceId() {
  +      return filename;
       }
   
   }
  
  
  
  1.3       +1 -1      jakarta-james/proposals/imap/test/org/apache/james/imapserver/IMAPTest.java
  
  Index: IMAPTest.java
  ===================================================================
  RCS file: /home/cvs/jakarta-james/proposals/imap/test/org/apache/james/imapserver/IMAPTest.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- IMAPTest.java	23 Jan 2002 21:53:33 -0000	1.2
  +++ IMAPTest.java	26 Aug 2002 20:49:09 -0000	1.3
  @@ -16,7 +16,7 @@
   
       public String USER = "imapuser";
       public String PASSWORD = "password";
  -    public String FROM_ADDRESS = "sender@somewhere";
  +    public String FROM_ADDRESS = "sender@localhost";
       public String TO_ADDRESS = USER + "@" + HOST;
       
   }
  
  
  
  1.3       +1 -0      jakarta-james/proposals/imap/test/org/apache/james/imapserver/InitialMail.java
  
  Index: InitialMail.java
  ===================================================================
  RCS file: /home/cvs/jakarta-james/proposals/imap/test/org/apache/james/imapserver/InitialMail.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- InitialMail.java	23 Jan 2002 21:53:33 -0000	1.2
  +++ InitialMail.java	26 Aug 2002 20:49:09 -0000	1.3
  @@ -32,6 +32,7 @@
       {
           super.setUp();
           Properties props = new Properties();
  +        props.setProperty("mail.debug","true");
           _session = Session.getDefaultInstance( props );
   
           _fromAddress = new InternetAddress( FROM_ADDRESS );
  
  
  
  1.2       +5 -1      jakarta-james/proposals/imap/test/org/apache/james/imapserver/List1.test
  
  Index: List1.test
  ===================================================================
  RCS file: /home/cvs/jakarta-james/proposals/imap/test/org/apache/james/imapserver/List1.test,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- List1.test	15 Jan 2002 08:38:27 -0000	1.1
  +++ List1.test	26 Aug 2002 20:49:09 -0000	1.2
  @@ -23,12 +23,14 @@
   
   // * returns all folders and subfolders
   C: b1 LIST "" *
  +SUB: 1
   S: * LIST (\Unmarked) "." test
   S: * LIST (\Unmarked) "." test1
   S: * LIST (\Unmarked) "." test.subfolder
   S: * LIST (\Unmarked) "." test1.subfolder1
   S: * LIST (\Marked) "." inbox
   S: b1 OK LIST completed
  +SUB: 1
   C: b2 LIST "" INBOX*
   S: * LIST (\Marked) "." inbox
   S: b2 OK LIST completed
  @@ -36,8 +38,10 @@
   S: * LIST (\Marked) "." inbox
   S: b3 OK LIST completed
   C: b4 LIST "" t*
  +SUB: 2
   S: * LIST (\Unmarked) "." test
   S: * LIST (\Unmarked) "." test1
   S: * LIST (\Unmarked) "." test.subfolder
   S: * LIST (\Unmarked) "." test1.subfolder1
  -S: b4 OK LIST completed
  \ No newline at end of file
  +S: b4 OK LIST completed
  +SUB: 2
  
  
  
  1.2       +4 -0      jakarta-james/proposals/imap/test/org/apache/james/imapserver/Subscribe.test
  
  Index: Subscribe.test
  ===================================================================
  RCS file: /home/cvs/jakarta-james/proposals/imap/test/org/apache/james/imapserver/Subscribe.test,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Subscribe.test	15 Jan 2002 08:38:27 -0000	1.1
  +++ Subscribe.test	26 Aug 2002 20:49:09 -0000	1.2
  @@ -15,16 +15,20 @@
   S: a01 OK SUBSCRIBE completed
   
   C: a01 LSUB "" "*"
  +SUB: 1
   S: * LSUB (\Unmarked) "." test
   S: * LSUB (\Unmarked) "." test.subfolder
   S: * LSUB (\Unmarked) "." test1.subfolder1
  +SUB: 1
   S: a01 OK LSUB completed
   
   // LIST All subscribed
   C: a01 LSUB "" "*"
  +SUB: 1
   S: * LSUB (\Unmarked) "." test
   S: * LSUB (\Unmarked) "." test.subfolder
   S: * LSUB (\Unmarked) "." test1.subfolder1
  +SUB: 1
   S: a01 OK LSUB completed
   
   // LIST A subset of subscribed
  
  
  
  1.2       +1 -1      jakarta-james/proposals/imap/test/org/apache/james/imapserver/Welcome.test
  
  Index: Welcome.test
  ===================================================================
  RCS file: /home/cvs/jakarta-james/proposals/imap/test/org/apache/james/imapserver/Welcome.test,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Welcome.test	15 Jan 2002 08:38:27 -0000	1.1
  +++ Welcome.test	26 Aug 2002 20:49:09 -0000	1.2
  @@ -1 +1 @@
  -S: * OK IMAP4rev1 Server daz2000 ready
  \ No newline at end of file
  +S: * OK IMAP4rev1 Server localhost.localdomain ready
  
  
  
  1.2       +1 -1      jakarta-james/proposals/imap/test/org/apache/james/remotemanager/RemoteManagerLogin.test
  
  Index: RemoteManagerLogin.test
  ===================================================================
  RCS file: /home/cvs/jakarta-james/proposals/imap/test/org/apache/james/remotemanager/RemoteManagerLogin.test,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- RemoteManagerLogin.test	15 Jan 2002 08:38:28 -0000	1.1
  +++ RemoteManagerLogin.test	26 Aug 2002 20:49:09 -0000	1.2
  @@ -4,4 +4,4 @@
   C: root
   S: Password:
   C: root
  -S: Welcome root. HELP for a list of commands
  \ No newline at end of file
  +S: Welcome root. HELP for a list of commands
  
  
  
  1.2       +8 -1      jakarta-james/proposals/imap/test/org/apache/james/remotemanager/UserManagementTest.java
  
  Index: UserManagementTest.java
  ===================================================================
  RCS file: /home/cvs/jakarta-james/proposals/imap/test/org/apache/james/remotemanager/UserManagementTest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- UserManagementTest.java	15 Jan 2002 08:38:28 -0000	1.1
  +++ UserManagementTest.java	26 Aug 2002 20:49:09 -0000	1.2
  @@ -30,7 +30,7 @@
   
       public void addUser() throws Exception
       {
  -        addUser( _userName, _password );
  +          addUser( _userName, _password );
       }
   
       protected void addUser( String userName, String password )
  @@ -40,6 +40,13 @@
           SL( "User " + userName + " added" );
           executeTests();
       }
  +
  +    /*protected void addExistingUser( String userName, String password )  
  +        throws Exception{
  +        CL( "adduser " + userName + " " + password );
  +        SL( "user " + userName + " already exist" );
  +        executeTests();
  +    }*/
   
       public void deleteUser() throws Exception
       {
  
  
  
  1.2       +1 -1      jakarta-james/proposals/imap/test/org/apache/james/smtpserver/Send.test
  
  Index: Send.test
  ===================================================================
  RCS file: /home/cvs/jakarta-james/proposals/imap/test/org/apache/james/smtpserver/Send.test,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Send.test	15 Jan 2002 08:38:28 -0000	1.1
  +++ Send.test	26 Aug 2002 20:49:10 -0000	1.2
  @@ -2,7 +2,7 @@
   
   // The ${ignore} macro accepts any single word element.
   
  -S: 220 ${ignore} SMTP Server (JAMES SMTP Server 2.0a2) ready ${rfcDate}
  +S: 220 ${ignore} SMTP Server (JAMES SMTP Server 2.0a3-cvs) ready ${rfcDate}
   C: HELO localhost
   S: 250 ${ignore} Hello localhost (127.0.0.1 [127.0.0.1])
   // The ${from-address} and ${to-address} macros are NYI, but you get the idea.
  
  
  
  1.2       +233 -3    jakarta-james/proposals/imap/test/org/apache/james/test/AbstractProtocolTest.java
  
  Index: AbstractProtocolTest.java
  ===================================================================
  RCS file: /home/cvs/jakarta-james/proposals/imap/test/org/apache/james/test/AbstractProtocolTest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- AbstractProtocolTest.java	15 Jan 2002 08:38:28 -0000	1.1
  +++ AbstractProtocolTest.java	26 Aug 2002 20:49:10 -0000	1.2
  @@ -6,6 +6,17 @@
   import java.util.*;
   import java.net.Socket;
   
  +/**
  + * Abstract Protocol Test is the root of all of the James Imap Server test
  + * cases.  It provides functionality to create text files for matching 
  + * client requests and server responses.  In order to use it however you
  + * must create a sub class and set all the file names, etc up yourself.
  + * All Comments are written by Andy Oliver who is still trying to figure out
  + * some of it himself so don't take this as gospel
  + *
  + * @author Unattributed Original Authors
  + * @author Andrew C. Oliver
  + */
   public abstract class AbstractProtocolTest extends TestCase
   {
       private Socket _socket;
  @@ -25,6 +36,7 @@
           super( s );
       }
   
  +    // comment in TestCase 
       public void setUp() throws Exception
       {
           super.setUp();
  @@ -36,6 +48,7 @@
           _in = new BufferedReader( new InputStreamReader( _socket.getInputStream() ) );
       }
   
  +    // comment in TestCase 
       protected void tearDown() throws Exception
       {
           _out.close();
  @@ -44,6 +57,7 @@
           super.tearDown();
       }
   
  +    // comment in TestCase 
       protected void executeTests() throws Exception
       {
           executeTest( _preElements );
  @@ -51,24 +65,51 @@
           executeTest( _postElements );
       }
   
  +    /**
  +     * executes the test case as specified in the file.  Commands in
  +     * CL: elements are sent to the server, and the SL: lines are verified
  +     * against those returning from the server.  The order is important
  +     * unless in a "SUB:" block in which case the order is not important and
  +     * the test will pass if any line in the SUB: block matches.
  +     */
       protected void executeTest( List protocolLines ) throws Exception
       {
           for ( Iterator iter = protocolLines.iterator(); iter.hasNext(); ) {
  -            ProtocolLine test = (ProtocolLine) iter.next();
  +            Object obj = iter.next(); 
  +            if ( obj instanceof ProtocolLine ) {
  +            ProtocolLine test = (ProtocolLine) obj;
               test.testProtocol( _out, _in );
  +            } else if ( obj instanceof List ) {
  +               //System.err.println("skipping over unordered block");
  +               List testlist = (List) obj;
  +               for (int k = 0; k < testlist.size(); k++) {
  +                  ProtocolLine test = (ProtocolLine) testlist.get(k);
  +                  test.testProtocolBlock( _out, _in, testlist);
  +               } 
  +            }
           }
       }
   
  +    /**
  +     * adds a new Client request line to the test elements
  +     */
       protected void CL( String clientLine )
       {
           _testElements.add( new ClientRequest( clientLine ) );
       }
   
  +    /**
  +     * adds a new Server Response line to the test elements
  +     */
       protected void SL( String serverLine )
       {
           _testElements.add( new ServerResponse( serverLine ) );
       }
   
  +    /**
  +     * This Line is sent to the server (everything after "CL: ") in expectation
  +     * that the server will respond.  
  +     */
       protected class ClientRequest implements ProtocolLine
       {
           private String _msg;
  @@ -78,12 +119,30 @@
               _msg = msg;
           }
   
  +        /**
  +         * Sends the request to the server
  +         */
           public void testProtocol( PrintWriter out, BufferedReader in ) throws Exception
           {
               out.println( _msg );
           }
  +
  +        /**
  +         * This should NOT be called, CL is not blockable!  Runtime exception
  +         * will be thrown.  Implemented because of "ProtocolLine"
  +         */ 
  +        public void testProtocolBlock( PrintWriter out, BufferedReader in, List list)
  +        throws Exception {
  +            //out.println( _msg ); 
  +            throw new RuntimeException("Syntax error in test case, CL is not "+
  +                                       "able to be used in a SUB: block");
  +        }
       }
   
  +    /**
  +     * This line is what is in the test case file, it is verified against the
  +     * actual line returned from the server.
  +     */
       protected class ServerResponse implements ProtocolLine
       {
           private String _msg;
  @@ -91,6 +150,13 @@
           private boolean _ignoreExtraCharacters = false;
           private String _location;
   
  +        /**
  +         * Constructs a ServerResponse, builds the tests
  +         * @param msg the server response line 
  +         * @param location a string containing the location number for error 
  +         *        messages to give you a clue of where in the file you where
  +         * @param ignoreExtraCharacters whether to ignore EndOfLine or not
  +         */
           public ServerResponse( String msg,
                              String location,
                              boolean ignoreExtraCharacters)
  @@ -104,22 +170,107 @@
               _location = location;
           }
   
  +        /**
  +         * Cheap version of ServerResponse(String, String, boolean) this 
  +         * assumes you don't want to ignore the end of line
  +         * @param msg the server response line 
  +         * @param location a string containing the location number for error 
  +         *        messages to give you a clue of where in the file you where
  +         */
           public ServerResponse( String msg,
                              String location )
           {
               this( msg, location, false );
           }
   
  +        /**
  +         * Cheap version of ServerResponse(String, String, boolean) this 
  +         * sends "null" for location
  +         * @param msg the server response line 
  +         * @param ignoreExtraCharacters whether to ignore EndOfLine or not
  +         */
           public ServerResponse( String msg, boolean ignoreExtraCharacters )
           {
               this( msg, null, ignoreExtraCharacters );
           }
   
  +        /**
  +         * Cheap version of ServerResponse(String, String, boolean) this 
  +         * sends "null" for location and false for ignore the EOL
  +         * @param msg the server response line 
  +         */
           public ServerResponse( String msg )
           {
               this( msg, null, false );
           }
   
  +        /**
  +         * Special method for dealing with anything in the "SUB" block,
  +         * it ignores the order of whats in the SUB block and only throws
  +         * an assertion at the end if nothing matched
  +         * @param out PrintWriter for talking to the server
  +         * @param in BufferedReader for getting the server response
  +         * @param testslist List containing the lines of the block, should
  +         * contain ServerResponse objects
  +         */
  +        public void testProtocolBlock( PrintWriter out, BufferedReader in,
  +                                      List testslist) throws Exception {
  +            //System.err.println("in new TestProtocol");
  +            String testLine = readLine( in );
  +            if ( _ignoreExtraCharacters
  +                    && ( testLine.length() > _msg.length() ) ) {
  +                testLine = testLine.substring( 0, _msg.length() );
  +            }
  +
  +            ListIterator testTokens = getMessageTokens( testLine ).listIterator();
  +            Iterator theblock = testslist.iterator();
  +            boolean assertval = false;
  +            while (theblock.hasNext()) {
  +              assertval = testProtocolInBlock( out, in, testTokens, testLine);
  +              if (assertval = true) {
  +                  break;
  +              }
  +            }
  +            if (assertval == false)   {
  +                    System.err.println("returning failure in block");
  +            }
  +            assertTrue("Someting in block matched (false)", assertval);
  +            
  +        }
  + 
  +        /** 
  +         * Called by testProtocolBlock.  Tests one line and returns true or
  +         * false.  
  +         * @param out PrintWriter for talking to the server
  +         * @param in BufferedReader for getting the server response
  +         * @param testTokens ListIterator containing a list of the tokens in 
  +         *        the testLine
  +         * @param testLine is the response from the server
  +         */
  +        public boolean testProtocolInBlock( PrintWriter out, BufferedReader in, ListIterator testTokens, String testLine) throws Exception
  +        {
  +            boolean retval = false;
  +            Iterator tests = _elementTests.iterator();
  +            while ( tests.hasNext() ) {
  +                ElementTest test = (ElementTest)tests.next();
  +                if ( _location != null ) {
  +                    test.setLocation( _location );
  +                }
  +                //System.err.println("testLine="+testLine);
  +                retval = test.softTest( testTokens, testLine );
  +                if (retval == false) {
  +                   break;
  +                }
  +            }
  +            return retval;
  +        }
  +
  +        /**
  +         * Default version of testing.  Tests the response from the server and
  +         * assumes that every SL line between CL lines is in the same order.
  +         * @param out PrintWriter for talking to the server
  +         * @param in BufferedReader for getting the server response
  +         */
           public void testProtocol( PrintWriter out, BufferedReader in ) throws Exception
           {
               String testLine = readLine( in );
  @@ -139,6 +290,12 @@
               }
           }
   
  +        /**
  +         * Grabs a line from the server and throws an error message if it  
  +         * doesn't work out
  +         * @param in BufferedReader for getting the server response
  +         * @return String of the line from the server
  +         */
           private String readLine( BufferedReader in ) throws Exception
           {
               try {
  @@ -207,8 +364,21 @@
                   _description += "Reason: ";
                   doTest( testElements );
               }
  +  
  +            boolean softTest( ListIterator testElements, String line) throws Exception {
  +                return doNonAssertingTest(testElements);
  +            }
   
               abstract void doTest( ListIterator testElements ) throws Exception;
  +
  +            /**
  +             * non Asserting version of doTest that instead of throwing an
  +             * assert, just gently retunrs a boolean 
  +             * @param testElements the elements to test with
  +             * @return boolean true if success false if failed
  +             */    
  +            abstract boolean doNonAssertingTest( ListIterator testElements)
  +              throws Exception;
           }
           
           /**
  @@ -226,6 +396,28 @@
               {
                   _elementValue = elementValue;
               }
  +        
  +            //comment in ElementTest 
  +            public boolean doNonAssertingTest( ListIterator testElements ) 
  +            throws Exception {
  +                String next;
  +                if ( testElements.hasNext() ) {
  +                    next = (String) testElements.next();
  +                }
  +                else {
  +                    next = "No more elements";
  +                }
  +                if ( !_elementValue.equals(next) ) { 
  +                  //System.err.println("emement value="+_elementValue+
  +                  //" did not =next+"+
  +                  //next);
  +                  return false;
  +                }
  +                  //System.err.println("emement value="+_elementValue+
  +                  //" did =next+"+
  +                  //next);
  +                return true;
  +            }
   
               public void doTest( ListIterator testElements ) throws Exception
               {
  @@ -289,6 +481,17 @@
                       String ignored = (String)testElements.next();
                   }
               }
  +            public boolean doNonAssertingTest( ListIterator testElements ) throws Exception
  +            {
  +                for ( int i = 0; i < _elementsToConsume; i++ )
  +                {
  +                    if ( ! testElements.hasNext() ) {
  +                        return false;
  +                    }
  +                    String ignored = (String)testElements.next();
  +                }
  +                return true;
  +            }
           }
   
           /**
  @@ -314,12 +517,24 @@
                       fail( _description + "End of line expected, found '" + nextElement + "'" );
                   }
               }
  +        
  +            public boolean doNonAssertingTest( ListIterator testElements ) 
  +            throws Exception
  +            {
  +                if ( testElements.hasNext() ) {
  +                    String nextElement = (String)testElements.next();
  +                    return false;
  +                }
  +                return true;
  +            }
           }
       }
   
       protected interface ProtocolLine
       {
           void testProtocol( PrintWriter out, BufferedReader in ) throws Exception;
  +        void testProtocolBlock(PrintWriter out, BufferedReader in, List list)
  +        throws Exception;
       }
   
       protected void addTestFile( String fileName ) throws Exception
  @@ -359,8 +574,23 @@
                       protocolLines.add( new ServerResponse( serverMsg, location, false ) );
                   }
   
  -            }
  -            else if ( next.startsWith( "//" )
  +            } else if ( next.startsWith("SUB: ") ) {
  +              //System.err.println("Hit SUB ");
  +              List unorderedBlock = new ArrayList(5);
  +              next = reader.readLine();
  +              //System.err.println("next = " + next);
  +              String serverMsg = next.substring( 3 );
  +              while ( !next.startsWith("SUB:") ) {
  +                   unorderedBlock.add(
  +                               new ServerResponse( serverMsg, location, false )
  +                                     );
  +                   next = reader.readLine();
  +                   serverMsg = next.substring( 3 );
  +                   lineNumber++;
  +                   //System.err.println("next = " + next);
  +              }
  +              protocolLines.add(unorderedBlock);  
  +            } else if ( next.startsWith( "//" )
                         || next.trim().length() == 0 ) {
                   // ignore these lines.
               }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>