All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gemstone.gemfire.management.internal.cli.util.ReadWriteFile Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2010-2015 Pivotal Software, Inc. All rights reserved.
 *
 * 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. See accompanying
 * LICENSE file.
 */
package com.gemstone.gemfire.management.internal.cli.util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.gemstone.gemfire.cache.execute.FunctionException;
import com.gemstone.gemfire.internal.LogWriterImpl;
import com.gemstone.gemfire.management.internal.cli.GfshParser;

/**
 * 
 * @author Ajay Pande
 * 
 * @since 7.0
 */
public class ReadWriteFile {

  /**
   * @param args
   */
  public static void main(String[] args) {
    if (args.length < 6 || args.length > 6) {
      throw new IllegalArgumentException(
          "Requires only 6  arguments :      ");
    }
    String result = readWriteFile(args[0], args[1], args[2], args[3], args[4],
        args[5]);
    System.out.println(result);
  }

  public static String readWriteFile(String logFileName, String logToBeWritten,
      String logLevel, String onlyLogLevel, String startTime, String endTime) {
    try {
      long lineCount = 0;
      BufferedReader input = null;
      BufferedWriter output = null;
      File logFileNameFile = new File(logFileName);
      if(logFileNameFile.canRead() == false){
        return ("Cannot read logFileName="+logFileName);
      }
      input = new BufferedReader(new FileReader(logFileName));      
      String line = null;
      File logToBeWrittenToFile = new File(logToBeWritten);
      output = new BufferedWriter(new FileWriter(logToBeWrittenToFile));
      if (!logToBeWrittenToFile.exists()) {
        if (input != null) {
          input.close();
        }
        if (output != null) {
          output.flush();
          output.close();
        }        
        return (logToBeWritten + " doesn not exist");
      }
      if (!logToBeWrittenToFile.isFile()) {
        if (input != null) {
          input.close();
        }
        if (output != null) {
          output.flush();
          output.close();
        }
        return (logToBeWritten + " is not a file");
      }
      if (!logToBeWrittenToFile.canWrite()) {
        if (input != null) {
          input.close();
        }
        if (output != null) {
          output.flush();
          output.close();
        }
        return ("can not write file " + logToBeWritten);
      }

      // build possible log levels based on user input
      // get all the levels below the one mentioned by user
      List logLevels = new ArrayList();
      if (onlyLogLevel.toLowerCase().equals("false")) {
        int[] intLogLevels = LogWriterImpl.allLevels;
        for (int level : intLogLevels) {
          if (level >= LogWriterImpl.levelNameToCode(logLevel)) {
            logLevels.add(LogWriterImpl.levelToString(level).toLowerCase());
          }
        }
      } else {
        logLevels.add(logLevel);
      }     
      boolean timeRangeCheck = false;
      boolean foundLogLevelTag = false;
      boolean validateLogLevel = true;
      while ( input.ready() == true && (line = input.readLine()) != null ) {
        if(new File(logFileName).canRead() == false ){
          return ("Cannot read logFileName=" + logFileName); 
        }
        // boolean validateLogLevel = true;
        lineCount++;
        if (line.startsWith("[")) {          
          foundLogLevelTag = true;
        } else {
          foundLogLevelTag = false;
        }
        if (line.contains("[info ") && timeRangeCheck == false) {
          String stTime = "";
          int spaceCounter = 0;
          for(int i=line.indexOf("[info ")+6; i < line.length(); i++ ){
            if(line.charAt(i) == ' ' ){
              spaceCounter++;
            }
            if(spaceCounter > 2){
              break;
            }
            stTime = stTime+line.charAt(i);
          }
          SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
          Date d = df.parse(stTime.substring(0, stTime.length() - 4));
          Time fileStartTime = new Time(d.getTime());
          File inputFile = new File(logFileName);
          Time fileEndTime = new Time(inputFile.lastModified());
          Time longStart = new Time(Long.valueOf(startTime));
          Time longEnd = new Time(Long.valueOf(endTime));
          long userStartTime = longStart.getTime();
          long userEndTime = longEnd.getTime();
          if ((fileStartTime.getTime() >= userStartTime && fileStartTime
              .getTime() <= userEndTime)
              || (fileEndTime.getTime() >= userStartTime && fileEndTime
                  .getTime() <= userEndTime)
              || (fileStartTime.getTime() >= userStartTime
                  && fileStartTime.getTime() <= userEndTime
                  && fileEndTime.getTime() >= userStartTime && fileEndTime
                  .getTime() <= userEndTime)) {
            // set this so that no need to check time range for each line
            timeRangeCheck = true;
          } else {
            // dont take this log file as this does not fit in time range
            break;
          }
        }

        if (foundLogLevelTag == true) {
          validateLogLevel = checkLogLevel(line, logLevel, logLevels,
              foundLogLevelTag);
        }

        if (validateLogLevel) {
          output.append(line);
          output.newLine();
          // write 1000 lines and then save , this will reduce disk writing
          // frequency and at the same time will keep buffer under control
          if ((lineCount % 1000) == 0) {
            output.flush();
          }
        }
      }
      if (input != null) {
        input.close();
      }
      if (output != null) {
        output.flush();
        output.close();
      }
      return ("Sucessfully written file " + logFileName);
    } catch (FunctionException ex) {
      return ("readWriteFile FunctionException " + ex.getMessage());
    } catch (FileNotFoundException ex) {
      return ("readWriteFile FileNotFoundException " + ex.getMessage());
    } catch (IOException ex) {
      return ("readWriteFile FileNotFoundException " + ex.getMessage());
    } catch (Exception ex) {
      return ("readWriteFile Exception " + ex.getMessage());
    }
  }

  static boolean checkLogLevel(String line, String logLevel,
      List logLevels, boolean foundLogLevelTag) {
    if (line == null) {
      return false;
    } else if (line != null && foundLogLevelTag == true) {
      if (logLevel.toLowerCase().equals("all")) {
        return true;
      } else if (line.equals(GfshParser.LINE_SEPARATOR)) {
        return true;
      } else {
        if (logLevels.size() > 0) {
          for (String permittedLogLevel : logLevels) {
            int indexFrom = line.indexOf('[');
            int indexTo = line.indexOf(' ');
            if (indexFrom > -1 && indexTo > -1 && indexTo > indexFrom) {
              boolean flag = line.substring(indexFrom + 1, indexTo)
                  .toLowerCase().contains(permittedLogLevel);             
              if (flag == true) {
                return flag;
              }
            }
          }
          return false;

        } else {
          return true;
        }
      }
    } else {
      return true;
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy