/**
 *
 * Copyright 2003-2006 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.apache.geronimo.installer.processing;
import java.io.*;

public class FixTextLines {
   // get the install path
   // get list of file types to fix
   // search for file types and fix them
   protected static String fileTypes[] = {
      ".dtd",
      ".ent",
      ".htm",
      ".html",
      ".java",
      ".js",
      ".jsp",
      ".properties",
      ".sql",
      ".txt",
      ".wsdl",
      ".xml",
      ".xsd",
      ".xsl",
      "STATUS"
   };
   protected static String installPath = null;
   protected static String tempSubDir = "var/temp";
   protected static String tempPath = null;

   public static void main( String argv[] ) {
      String outStr = null;
      if( argv.length < 1 ) {
         outStr = "FixTextLines requires the path of the Geronimo installation.";
         System.out.println( outStr );
         throw new RuntimeException( outStr );
      }
      installPath = argv[0];
      tempPath = installPath + "/" + tempSubDir;
      File tempPathFile = new File( tempPath );
      if( tempPathFile.exists() == false ) {
         outStr = "FixTextLines: temporary directory does not exist.  Check installPath.";
         System.out.println( outStr );
         throw new RuntimeException( outStr );
      } 
      if( tempPathFile.isDirectory() == false ) {
         outStr = "FixTextLines: temporary directory exists, but is not a directory.  Check installPath.";
         System.out.println( outStr );
         throw new RuntimeException( outStr );
      }
      FixTextLines ftl = new FixTextLines();
      ftl.fixFiles( new File( installPath ));
      System.out.println( "FixTextLines processing complete." );
   }

   public void fixFiles( File dir ) {
      File files[] = null;
      try { 
        files = dir.listFiles();
      } catch( Exception e ) {
         System.err.println( "FixTextLines: error obtaining list of files to process -" + dir.getPath() );
      }
      for( int i = 0; i < files.length; ++i ) {
         String path = null;
         try {
             path = files[i].getCanonicalPath();
         } catch( Exception e1 ) {
             System.err.println("FixTextLines: error getting file path name." );
         }
         if( files[i].isDirectory( )) {
            // recurse into all directories except .../var/temp
            if( path.equalsIgnoreCase( tempPath ) == false ) {
               fixFiles( files[ i ] );
            }
         } else if( isToBeFixed( files[ i ] )) {
            fixCrLf( files[ i ] );
         }
      }
   }
   public boolean isToBeFixed( File file ) {
      boolean fRet = false;
      for( int i = 0; i < fileTypes.length; ++i ) {
         String name = file.getName();
         if( fileTypes[i].startsWith( "." )) {
            int idx = name.lastIndexOf( "." );
            if( idx > -1 ) {
                if( fileTypes[i].equals( name.substring( idx ))) {
                   fRet = true;
                   break;
                }
            }
         } else {
            if( name.equals( fileTypes[i] )) {
                fRet = true;
                break;
            } 
         }
      }
      return fRet;
   }
   public void fixCrLf( File file ) {
      // copy the file to temp dir while making change
      // move original file to ".original"
      // move temp version to original directory
      // delete ".original" version if everything completes successfully
      boolean fErr = false;
      BufferedReader br = null;
      BufferedWriter bw = null;
      try {
          br = new BufferedReader( new FileReader( file ));
      } catch( IOException ioe ) {
         System.err.println( "FixTextLines: " + file.getPath() + " cannot be opened." );
         fErr = true;
      }
      String tmpname = tempPath + "/" + file.getName();
      File tmpFile = new File( tmpname );
      if( fErr == false ) {
         try {
            bw = new BufferedWriter( new FileWriter( tmpFile ));
         } catch( IOException ioe ) {
            System.err.println( "FixTextLines: " + tmpname + " cannot be created." );
            fErr = true;
         }
      }
      if( fErr == false ) {
        try {
            String inStr = br.readLine();
            while( inStr != null ) {
                bw.write( inStr );
                bw.newLine();
                inStr = br.readLine();
            }
            bw.newLine();
            bw.close();
            br.close();
        } catch( IOException ioe ) {
           fErr = true;
           System.err.println( "FixTextLines: Error adjusting CRLF format for: " + file.getPath() + " during copy." );
        }  
      }
      if( fErr == false ) {
         try {
            boolean fSuccess = false;
            String originalName = file.getCanonicalPath();
            fSuccess = file.renameTo( new File( file.getCanonicalPath() + ".original" ));
            if( fSuccess ) {
               fSuccess = tmpFile.renameTo( new File( originalName ) );
               if( fSuccess ) {
                  //System.out.println( originalName + " successfully processed." );
                  File orig = new File( originalName + ".original" );
                  orig.delete(); // delete the original (xxx.original)
               } else {
                  System.err.println( "FixTextLines: " + originalName + " final rename failed." );
                  fErr = true;
               }
            }
            else
            {
                System.err.println( "FixTextLines: " + originalName + " initial rename failed." );
                fErr = true;
            }
         } catch( Exception e ) {
            System.err.println( "FixTextLines: Error moving files. " + file.getPath() );
            fErr = true;            
         }
      }
   }
}
