/*::.
==================================================================================================================================
================================================= Copyright  2014 Allen Baker =================================================
                                                 +------------------------------+
File:       IsNewer.java
Originator: Allen Baker (2014.09.30 04:29)
LayoutRev:  5
================================================================================================================================== */
package cosmicabyss.com.app;

import java.io.*;
import java.util.*;


import cosmicabyss.com.lib.*;



/*::
======================================================================================================================== *//**
Description<PRE>
   This program tests to see if the first file passed in as an argument on the command line is newer than the second
   file on the command line.
</PRE>

Usage<PRE>
   Java cosmicabyss.com.app.IsNewer [-h -q] fileSpec0 fileSpec1
      Command line options may be place in any order anywhere on the command line in relation to the two fileSpecs.
      There must be two fileSpecs on the command line and their order matters. This program tests whether the file
      represented by the FIRST fileSpec on the command line is newer than the file represented by the second fileSpec on
      the command line.

   -h means HELP.
      It causes this usage message to be displayed, and terminates the program.

   -q means QUIET.
      It stops the program from sending log messages to stdout. The program sends log messages to stdout by default;
      this option is the only way to stop it from doing that.

   FileSpec0 identifies the file about which this program returns a result.
      It is a required parameter and must resolve to one and only one file. The file it resolves to is the file about
      which this program returns a result signifying if it is newer than the other file on the command line.

   FileSpec1 identifies the file that fileSpec0 is compared against.
      It is a required parameter and must resolve to one and only one file.


   Enclosing the fileSpec in quotes is required for any file specifier that contains embedded spaces.

   Enclosing the fileSpec in quotes prevents the command line interpreter from trying to replace wildcard characters
   itself instead of letting IsNewer do it.

   The quotes surrounding the fileSpec are not needed if it contains no wildcard characters or spaces.
</PRE>

<P>

   <DL>
      <DT>
         <B>
            Example usage:
         </B>

         <DD>
            <BLOCKQUOTE>
               <PRE id="unindent">
                  *java cosmicabyss.com.app.IsNewer -r -x"*.bat" "..\*.*"
               </PRE>
            </BLOCKQUOTE>
         </DD>
      </DT>

      <DT>
         <B>
            View Source:
         </B>

         <DD>
            <A href="IsNewer.java.html">
               IsNewer.java
            </A>
         </DD>
      </DT>
      <DT>
         <B>
            Author:
         </B>
         <DD>
            <A href="mailto:sourcecode.v01@cosmicabyss.com">
               Allen Baker
            </A>
         </DD>
      </DT>
   </DL>
*//*
======================================================================================================================== */
public class IsNewer
   {



   /*:.
   ==============================================================================================================
   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[  Constants  ]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   ============================================================================================================== */



   /*.
   ==========================================================================================
   CLASS_NAME:
      The name of this class
   DESCRIPTION:
      The man page description of this application
   USAGE:
      The man page usage information for this application
   ------------------------------------------------------------------------------------------ */
   private static final XString  CLASS_NAME  = new XString(IsNewer.class.getName());
   private static final XString  DESCRIPTION = new XString
      (
      // <Description>  Preprocessor generated String definition, Don't mess with it.
      "This program tests to see if the first file passed in as an argument on the command line is newer than the second    \n" +
      "file on the command line.                                                                                            \n" +
      ""// </Description>
      );
   private static final XString  USAGE       = new XString
      (
      // <Usage>        Preprocessor generated String definition, Don't mess with it.
      "Java cosmicabyss.com.app.IsNewer [-h -q] fileSpec0 fileSpec1                                                         \n" +
      "   Command line options may be place in any order anywhere on the command line in relation to the two fileSpecs.     \n" +
      "   There must be two fileSpecs on the command line and their order matters. This program tests whether the file      \n" +
      "   represented by the FIRST fileSpec on the command line is newer than the file represented by the second fileSpec on\n" +
      "   the command line.                                                                                                 \n" +
      "                                                                                                                     \n" +
      "-h means HELP.                                                                                                       \n" +
      "   It causes this usage message to be displayed, and terminates the program.                                         \n" +
      "                                                                                                                     \n" +
      "-q means QUIET.                                                                                                      \n" +
      "   It stops the program from sending log messages to stdout. The program sends log messages to stdout by default;    \n" +
      "   this option is the only way to stop it from doing that.                                                           \n" +
      "                                                                                                                     \n" +
      "FileSpec0 identifies the file about which this program returns a result.                                             \n" +
      "   It is a required parameter and must resolve to one and only one file. The file it resolves to is the file about   \n" +
      "   which this program returns a result signifying if it is newer than the other file on the command line.            \n" +
      "                                                                                                                     \n" +
      "FileSpec1 identifies the file that fileSpec0 is compared against.                                                    \n" +
      "   It is a required parameter and must resolve to one and only one file.                                             \n" +
      "                                                                                                                     \n" +
      "                                                                                                                     \n" +
      "Enclosing the fileSpec in quotes is required for any file specifier that contains embedded spaces.                   \n" +
      "                                                                                                                     \n" +
      "Enclosing the fileSpec in quotes prevents the command line interpreter from trying to replace wildcard characters    \n" +
      "itself instead of letting IsNewer do it.                                                                             \n" +
      "                                                                                                                     \n" +
      "The quotes surrounding the fileSpec are not needed if it contains no wildcard characters or spaces.                  \n" +
      ""// </Usage>
      );



   /*:.
   ==============================================================================================================
   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[  Types  ]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   ============================================================================================================== */
   /*:.
   ==============================================================================================================
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[  Enums  ]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   ============================================================================================================== */
   /*:.
   ==============================================================================================================
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[  Structs  ]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   ============================================================================================================== */
   /*:.
   ==============================================================================================================
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[  Classes  ]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   ============================================================================================================== */
   /*:.
   ==============================================================================================================
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[  Interfaces  ]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   ============================================================================================================== */
   /*:.
   ==============================================================================================================
   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[  Variables  ]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   ============================================================================================================== */



   /*.
   ==========================================================================================
   cOut:
      Formatted and time-stamped console output.
   ------------------------------------------------------------------------------------------ */
   private static ConsoleStream  cOut = ConsoleStream.getSingleton();
   /*.
   ==========================================================================================
   iFileNameList:
      The list of all file names that match the filespecs given on the command line.
   iGlobalProperties:
      A copy of all the environment variables.
   ------------------------------------------------------------------------------------------ */
   private FileNameList      iFileNameList     = null;
   private GlobalProperties  iGlobalProperties = null;



   /*:.
   ==============================================================================================================
   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[  Functions  ]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   ============================================================================================================== */
   /*:.
   ==============================================================================================================
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[  Constructors  ]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   ============================================================================================================== */



   /*:                                    
   ====================================================================================================
   [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
   ==================================================================================================== *//**
   This method creates a IsNewer class object and runs the application to completion.

   <P><B>Implementation: </B><A HREF="IsNewer.java.html#000">View source</A>

   @param
      pArgs contains the command line arguments with which the class was invoked as an application.
   *//*
   ---------------------------------------------------------------------------------------------------- */
   public <Type> IsNewer(Type[] pArgs) throws Exception
      {
      this.initializeInstanceConstantsAndVariables(pArgs);
      }



   /*:.
   ==============================================================================================================
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[  Initialization  ]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   ============================================================================================================== */



   /*:                                    
   ====================================================================================================
   [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
   ==================================================================================================== *//**
   This method is the class static initialization block which is run the first time the JVM loads this
   class code and before anything else in this class is accessed

   <P><B>Implementation: </B><A HREF="IsNewer.java.html#001">View source</A>

   *//*
   ---------------------------------------------------------------------------------------------------- */
   static
      {
      /*.
      ==========================================================================================
      If required, make sure all the class constants and variables are initialized the first
      time the JVM loads this class code and before anything else in this class is accessed
      ------------------------------------------------------------------------------------------ */
      initializeClassConstantsAndVariables();
      }



   /*:                                    
   ====================================================================================================
   [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
   ==================================================================================================== *//**
   This method is called from the class static initialization block to make sure all the class
   constants and variables are initialized the first time the JVM loads this class code and before
   anything else in this class is accessed

   <P><B>Implementation: </B><A HREF="IsNewer.java.html#002">View source</A>

   *//*
   ---------------------------------------------------------------------------------------------------- */
   private static void initializeClassConstantsAndVariables()
      {
      }



   /*:                                    
   ====================================================================================================
   [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
   ==================================================================================================== *//**
   This method initializes all the instance constants and variables

   <P><B>Implementation: </B><A HREF="IsNewer.java.html#003">View source</A>

   @param
      pArgs contains the command line arguments with which the class was invoked as an application.
   *//*
   ---------------------------------------------------------------------------------------------------- */
   private <Type> boolean initializeInstanceConstantsAndVariables(Type[] pArgs) throws Exception
      {
      boolean  successCode = true;

      successCode = processCommandLine(pArgs);
      if (successCode)
         {
         }
      return successCode;
      }



   /*:.
   ==============================================================================================================
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[  Methods  ]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   ============================================================================================================== */



   /*:                                    
   ====================================================================================================
   [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
   ==================================================================================================== *//**
   This method sets the ConsoleStream for this object.

   <P><B>Implementation: </B><A HREF="IsNewer.java.html#004">View source</A>

   @return
      A reference to this object

   @param
      pConsole is a ConsoleStream through which this objects sends its output.
   *//*
   ---------------------------------------------------------------------------------------------------- */
   public IsNewer setOut(ConsoleStream pConsole)
      {
      cOut = pConsole;
      return this;
      }



   /*:                                    
   ====================================================================================================
   [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
   ==================================================================================================== *//**
   This boilerplate method is used for testing an instantiated object of this class and may include any
   code the developer chooses.

   <P><B>Implementation: </B><A HREF="IsNewer.java.html#005">View source</A>

   @return
      A reference to this object
   *//*
   ---------------------------------------------------------------------------------------------------- */
   public IsNewer test() throws Exception
      {
      cOut.titledPrintf
         (
         "\"HELLO WORLD!\"",
         "%s  %s  %s",
         "I'm an object of the", CLASS_NAME, "class, and I approved this message."
         );
      return this;
      }



   /*:                                    
   ====================================================================================================
   [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
   ==================================================================================================== *//**
   This method performs the core processing functions of this application.

   <P><B>Implementation: </B><A HREF="IsNewer.java.html#006">View source</A>

   @return
      A success code of true if all goes well, false otherwise.
   *//*
   ---------------------------------------------------------------------------------------------------- */
   private int file0IsNewerThanFile1(String[] pArgs) throws Exception
      {
      boolean  successCode = true;
      String   fmtStr;
      /*.
      ==========================================================================================
      Make sure 2 and only 2 filenames are on the command line
      ------------------------------------------------------------------------------------------ */
      if (iFileNameList.size() != 2)
         {
         usage();
         cOut.titledSeverityPrintf
            (
            Const.HALT,
            CLASS_NAME,
            "Command line error: Must specifiy 2 existing files on command line. It specified <" + iFileNameList.size() + "> instead."
            );
         cOut.stopLog();
         System.exit(-1);
         }

cOut.println(pArgs[0]);
cOut.println(pArgs[1]);

//      /*.
//      ==========================================================================================
//      Make sure both files exist
//      ------------------------------------------------------------------------------------------ */
      XFile  file0 = new XFile(pArgs[0]);
//      if (! file0.exists())
//         {
//         usage();
//         cOut.titledSeverityPrintf
//            (
//            Const.HALT,
//            CLASS_NAME,
//            "Command line error: File <" + file0.getCanonicalPath() + "> does not exist."
//            );
//         cOut.stopLog();
//         System.exit(-1);
//         }
      XFile  file1 = new XFile(pArgs[1]);
//      if (! file1.exists())
//         {
//         usage();
//         cOut.titledSeverityPrintf
//            (
//            Const.HALT,
//            CLASS_NAME,
//            "Command line error: File <" + file1.getCanonicalPath() + "> does not exist."
//            );
//         cOut.stopLog();
//         System.exit(-1);
//         }
//      return (file0.compareLastModified(file1) == 1);
      return file0.compareLastModified(file1);
      }



   /*:                                    
   ====================================================================================================
   [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
   ==================================================================================================== *//**
   This method displays the command line arguments that this program was invoked with.

   <P><B>Implementation: </B><A HREF="IsNewer.java.html#007">View source</A>

   @param
      pArgs contains the command line arguments with which the class was invoked as an application.
   *//*
   ---------------------------------------------------------------------------------------------------- */
   private <Type> void showArgs(Type[] pArgs) throws Exception
      {
      XString  str = new XString("");
      for (int i=0; i<pArgs.length; i++)
         {
         str = str.concat(UString.toString(pArgs[i]) + "   ");
         }
      cOut.println("Command Line Arguments",str);
      }



   /*:                                    
   ====================================================================================================
   [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
   ==================================================================================================== *//**
   This method processes the command line arguments and based on what it finds, sets the instance
   variables.

   <P><B>Implementation: </B><A HREF="IsNewer.java.html#008">View source</A>

   @return
      A success code of true if all goes well, false otherwise.

   @param
      pArgs contains the command line arguments with which the class was invoked as an application.
   *//*
   ---------------------------------------------------------------------------------------------------- */
   private <Type> boolean processCommandLine(Type[] pArgs) throws Exception
      {
      boolean  successCode = true;
//      /*
//      ==========================================================================================
//      Greetings !
//      ------------------------------------------------------------------------------------------ */
//      System.out.println();
//      System.out.println();
//      System.out.println();
//      System.out.println();
//      cOut.banner(CLASS_NAME);
//      System.out.println();
//      /*.
//      ==========================================================================================
//      tell the user what command line arges this program started with
//      ------------------------------------------------------------------------------------------ */
//      showArgs(pArgs);
      /*.
      ==========================================================================================
      This cannot be done statically because it throws an exception.
      ------------------------------------------------------------------------------------------ */
      iGlobalProperties = new GlobalProperties();
      /*.
      ==========================================================================================
      Get ready to process the command line arguments
      ------------------------------------------------------------------------------------------ */
      CommandLine  cmdLn = new CommandLine(CLASS_NAME,pArgs);
      /*.
      ==========================================================================================
      These are the valid command line controls
      ------------------------------------------------------------------------------------------ */
      cmdLn.addControlsFromString(":hqrsl::x:");
//      cmdLn.addControl("-xfile","required");
//      cmdLn.addControl("-ifile","required");
      /*.
      ==========================================================================================
      List the valid controls
      ------------------------------------------------------------------------------------------ */
      cmdLn.listControls();
      cOut.println();
      /*.
      ==========================================================================================
      Interpret the arguments on the command line
      ------------------------------------------------------------------------------------------ */
      HashSet<XString>          controlsWithoutArgs = new HashSet<XString>();
      HashMap<XString,XString>  controlsWithArgs    = new HashMap<XString,XString>();
      ArrayList<XString>        excludedFileSpecs   = new ArrayList<XString>();
      ArrayList<XString>        includedFileSpecs   = new ArrayList<XString>();
      boolean                   result              = cmdLn.commandLineArgs
         (
         iGlobalProperties  ,
         controlsWithoutArgs,
         controlsWithArgs   ,
         excludedFileSpecs  ,
         includedFileSpecs
         );
      /*.
      ==========================================================================================
      If the command line was messed up, abort the program
      ------------------------------------------------------------------------------------------ */
      if (includedFileSpecs.isEmpty())
         {
         cOut.println("COMMAND LINE ERROR: MANDATORY control NOT on command line:  fileSpecs");
         }
      if ((result == false) || (includedFileSpecs.isEmpty()))
         {
         usage();
         cOut.titledSeverityPrintf
            (
            Const.HALT,
            CLASS_NAME,
            "Command line error."
            );
         cOut.stopLog();
         System.exit(-1);
         }
      /*.
      ==========================================================================================
      Arguments for the FileNameList with their default values. Some of these arguments may be
      modified by commandline controls.
      ------------------------------------------------------------------------------------------ */
      boolean  recurse             = false;
      boolean  fullyQualifiedNames = true;
      boolean  matchSubdirs        = false;
      boolean  sort                = false;
      boolean  collapse            = false;
      /*.
      ==========================================================================================
      Process commandline controls without arguments
      ------------------------------------------------------------------------------------------ */
      for (XString  ctl : controlsWithoutArgs)
         {
         cOut.println(ctl.string() + " control is present.");
         if (ctl.equals("-h"))
            {
            usage();
            cOut.stopLog();
            System.exit(-1);
            }
         recurse      |= ctl.equals("-r");
         matchSubdirs |= ctl.equals("-s");
         }
      if (controlsWithoutArgs.size() > 0) cOut.println();
      /*.
      ==========================================================================================
      Process commandline controls with arguments
      ------------------------------------------------------------------------------------------ */
      Set<XString>  set = controlsWithArgs.keySet();
      for (XString  ctl : set)
         {
         XString argStr = controlsWithArgs.get(ctl);
         cOut.println(ctl + " control is present with the argument: " + argStr);
         }
      if (controlsWithArgs.size() > 0) cOut.println();
      /*.
      ==========================================================================================
      Get a list of all the files names that will be processed
      ------------------------------------------------------------------------------------------ */
      for (XString  fileSpec : includedFileSpecs)
         {
         cOut.println("Files matching this fileSpec will be INcluded: " + fileSpec);
         }
      if (includedFileSpecs.size() > 0) cOut.println();
      for (XString  fileSpec : excludedFileSpecs)
         {
         cOut.println("Files matching this fileSpec will be EXcluded: " + fileSpec);
         }
      if (excludedFileSpecs.size() > 0) cOut.println();
      iFileNameList = new FileNameList
         (
         includedFileSpecs,excludedFileSpecs,recurse,fullyQualifiedNames,matchSubdirs,sort,collapse
         );
      /*.
      ==========================================================================================
      ------------------------------------------------------------------------------------------ */
      return successCode;
      }



   /*:                                    
   ====================================================================================================
   [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
   ==================================================================================================== *//**
   This method writes a usage message to the log

   <P><B>Implementation: </B><A HREF="IsNewer.java.html#009">View source</A>

   *//*
   ---------------------------------------------------------------------------------------------------- */
   private void usage()
      {
      cOut.println("Program Description",DESCRIPTION);
      cOut.println("Usage",USAGE);
      }



   /*:.
   ==============================================================================================================
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[  Main  ]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   ============================================================================================================== */



   /*:                                    
   ====================================================================================================
   [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
   ==================================================================================================== *//**
   This method runs the IsNewer class as a standalone application. It's the method that's called when
   the class is invoked from the command line by using the java application launcher - "java".

   Usage
      <BLOCKQUOTE>
         <PRE id="unindent">
            java cosmicabyss.com.app.IsNewer [-h -q -r -s] [-l [logFile]] {-x fileSpec} {-ifile fileName} {-xfile fileName} fileSpecs+
               Arguments can be placed in any order on the command line.

            -h means HELP.
               It causes this usage message to be displayed, and terminates the program.

            -q means QUIET.
               It stops the program from sending log messages to stdout. The program sends log messages to stdout by default;
               this option is the only way to stop it from doing that.

            -r means RECURSE.
               It causes the program to recurse down through the trees of subdirectories that are rooted at the directories
               specified in the file specifiers that are on the command line.

            -s means SUBDIRECTORIES.
               It causes the program to match subdirectory names that match the file specifiers on the command line.

            -l means LOGFILE.
               It takes an optional file name parameter, and causes the program to send log messages to the named file. If the
               file name is not present, the program generates a default file name. If the environment variable LOGDIRECTORY is
               defined, the program places the file in that directory. If not, the program places the file in the current
               directory. The program continues to send log messages to stdout too, unless the -q option is used.

            -x means EXCLUDE.
               It requires a fileSpec, and causes the program to not process any files that match the fileSpec. This control may
               be put on the command line as many times as needed to specify all the files that should be excluded from
               processing.

               Enclosing the fileSpec in quotes is REQUIRED for any fileSpec that contains embedded spaces or wildcard
               characters.

            -xfile means EXCLUDE FILE.
               It takes a required file name parameter, and causes the program to read each non-empty line in the named file and
               treat it as the filespec argument to a -x control. This control may be put on the command line as many times as
               needed to specify all the files that contain filespecs for files that should be excluded from processing.

            -ifile means INCLUDE FILE.
               It takes a required file name parameter, and causes the program to read each non-empty line in the named file and
               treat it as a fileSpec that identifies files to include in processing. This control may be put on the command line
               as many times as needed to specify all the files that contain filespecs for files that should be included in the
               processing.

            fileSpecs identifies the files to process.
               It is a required parameter and is one or more file specifiers that identify the files that the program will
               process.

               As many fileSpecs may be put on the command line as needed to specify all the files that should be included in
               processing.

               Enclosing the fileSpec in quotes is required for any file specifier that contains embedded spaces.

               Enclosing the fileSpec in quotes prevents the command line interpreter from trying to replace wildcard characters
               itself instead of letting IsNewer do it.

               The quotes surrounding the fileSpec are not needed if it contains no wildcard characters or spaces.

         </PRE>
      </BLOCKQUOTE>

   <P><B>Implementation: </B><A HREF="IsNewer.java.html#010">View source</A>

   @param
      pArgs contains the command line arguments with which the class was invoked as an application.
   *//*
   ---------------------------------------------------------------------------------------------------- */
   public static void main(String[] pArgs) throws Exception
      {
      IsNewer  thisIsNewer = new IsNewer(pArgs);
//      int      result      = (thisIsNewer.file0IsNewerThanFile1()? 1 : 0);
      int      result      = thisIsNewer.file0IsNewerThanFile1(pArgs);
      cOut.println("result is " + result);
      System.exit(result);
      }



   }  // class IsNewer



   /*:.
   ==============================================================================================================
   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[  Notes  ]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   ============================================================================================================== */
   /*:                                    
   ====================================================================================================
   [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
   ==================================================================================================== *//**
   This method
   => -> -- c c c c c c c

   <P><B>Implementation: </B><A HREF="IsNewer.java.html#011">View source</A>

   @return
      This method returns

   @exception
      Xx is thrown when
   @exception
      Yy is thrown when

   @param
      PX (optional)(input/output)(output) is the
   @param
      PY (optional)(input/output)(output) is the
   *//*
   ---------------------------------------------------------------------------------------------------- */
      /*.
      ==========================================================================================
      ------------------------------------------------------------------------------------------ */
   /*:.
   ==============================================================================================================
   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[  Section Level 0 Banner  ]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   ============================================================================================================== */
   /*:.
   ==============================================================================================================
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[  Section Level 1 Banner  ]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   ============================================================================================================== */
   /*:.
   ==============================================================================================================
   :::::::::::::::::::::::::::::::::::::::::[  Section Level 2 Banner  ]:::::::::::::::::::::::::::::::::::::::::
   ============================================================================================================== */
   /*:.
   ==============================================================================================================
   -----------------------------------------[  Section Level 3 Banner  ]-----------------------------------------
   ============================================================================================================== */
   /*:.
   ==============================================================================================================
                                            [  Section Level 4 Banner  ]
   ============================================================================================================== */