8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The contents of this file are subject to the terms
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * of the Common Development and Distribution License
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * (the License). You may not use this file except in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * compliance with the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * You can obtain a copy of the License at
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * opensso/legal/CDDLv1.0.txt
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * See the License for the specific language governing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * permission and limitations under the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * When distributing Covered Code, include this CDDL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Header Notice in each file and include the License file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * at opensso/legal/CDDLv1.0.txt.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If applicable, add the following below the CDDL Header,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * with the fields enclosed by brackets [] replaced by
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * your own identifying information:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * $Id: LogReadFileHandler.java,v 1.8 2009/04/07 23:21:01 hvijay Exp $
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Portions Copyrighted [2011] [ForgeRock AS]
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpackage com.sun.identity.log.handlers;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.io.BufferedReader;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.io.FileReader;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.io.IOException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.ArrayList;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.HashSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Iterator;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Set;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.log.LogConstants;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.log.LogQuery;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.log.LogReader;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.log.QueryElement;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.log.spi.Debug;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.log.util.LogRecordSorter;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * LogReadFileHandler class implements LogReadHandler interface.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This class name will be stored as a configuration parameter.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * LogReader will instantiate it at run time (when messages are logged
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * into file). This class reads the disk file, applies query if any,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * sorts records on field name when required, collects most recent records
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * (default option) or all records. It returns result 2D String to the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * caller (LogReader), it also exports a method that returns archived filename
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * present in current set.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster **/
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpublic class LogReadFileHandler implements LogReadHandler {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // private attributes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String logFileName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private com.sun.identity.log.LogQuery queryChriteria = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private int maxNoOfRecs = LogQuery.MOST_RECENT_MAX_RECORDS;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String version = "#Version:";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String fieldName = "#Fields: ";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private LogRecordSorter sorter = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String[][] queryResult; // will hold the return value
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // internal storage for records
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private ArrayList listOfValidRecords = new ArrayList();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private ArrayList columnIndices = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /** constructor does nothing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster **/
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public LogReadFileHandler() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * LogReader calls this method method. It collects header, records,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * applies query (if any), sorts (if asked) the records on field, checks
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the max records to return, collects all the recods and returns.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param fileName is complete filename with path
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param logQuery is user specified qury chriteria with sorting requirement
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param sourceData it specifies whether return data should be original
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * data received by logger (source) or formatted data as in file.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return all the matched records with query
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws IOException if it fails to read log records.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws NoSuchFieldException if it fails to retrieve the name of field.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws IllegalArgumentException if query has wrong value.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws RuntimeException if it fails to retrieve log record.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws Exception if it fails any of operation.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String[][] logRecRead(String fileName, LogQuery logQuery,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean sourceData)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws IOException, NoSuchFieldException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster IllegalArgumentException, RuntimeException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Exception {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // if the object is persistence use it otherwise don't
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.cleaner();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.logFileName = fileName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean hdrExist = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (sourceData == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster queryChriteria = logQuery;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // to collect field names
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hdrExist = this.getFieldNames(true, logQuery);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IOException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow it else it cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (RuntimeException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow it else it cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow it else it cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (hdrExist == false) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return queryResult;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (logQuery != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // caller has to handle what is MOST_RECENT_MAX_RECORDS
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // this class has no idea about the value
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((logQuery.getNumRecordsWanted() ==
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogQuery.MOST_RECENT_MAX_RECORDS) ||
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (logQuery.getNumRecordsWanted() < LogQuery.ALL_RECORDS)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.maxNoOfRecs = 1;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.maxNoOfRecs = logQuery.getNumRecordsWanted();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.maxNoOfRecs = 1;// can't be 0, headers will be returned
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (sourceData == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.getRecords(true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.getRecords(false);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IOException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow it else it cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IllegalArgumentException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow it else it cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (RuntimeException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow it else it cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow it else it cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int recSize = listOfValidRecords.size();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // checks whether it has got any record or not
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (recSize <= 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // if no record found return null
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // if Sorting is specified
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (queryChriteria != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String sortByField = queryChriteria.getSortingField();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (sortByField != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.sorter = new LogRecordSorter(sortByField,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster listOfValidRecords);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster queryResult = this.sorter.getSortedRecords();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (queryResult);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (NoSuchFieldException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e;// catch & rethrow else cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IllegalArgumentException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e;// catch & rethrow else cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (RuntimeException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e;// catch & rethrow else cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e;// catch & rethrow else cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // don't do any processing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster queryResult = new String[recSize][];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < recSize; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster queryResult[i] = (String[]) listOfValidRecords.get(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return queryResult;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * LogReader calls this method method. It collects header, records,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * applies query (if any), sorts (if asked) the records on field, checks
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the max records to return, collects all the recods and returns.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param fileNames is a Set of filenames complete with path
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param logQuery is user specified qury chriteria with sorting requirement
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param sourceData it specifies whether return data should be original
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * data received by logger (source) or formatted data as in file.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return all the matched records with query
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws IOException if it fails to read log records.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws NoSuchFieldException if it fails to retrieve the name of field.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws IllegalArgumentException if query has wrong value.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws RuntimeException if it fails to retrieve log record.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws Exception if it fails any of operation.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String[][] logRecRead(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set fileNames,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogQuery logQuery,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean sourceData) throws IOException, NoSuchFieldException, IllegalArgumentException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster RuntimeException, Exception {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // if the object is persistence use it otherwise don't
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.cleaner();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set fNames = new HashSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean isFirstFile = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator it = fileNames.iterator(); it.hasNext();) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String ss = (String) it.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fNames.add(ss);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.logFileName = ss;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (Debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.message("File:logRecRead/2: processing file " + ss +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ", sourceData = " + sourceData);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean hdrExist = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (sourceData == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster queryChriteria = logQuery;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // to collect field names
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hdrExist = this.getFieldNames(isFirstFile, logQuery);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster isFirstFile = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IOException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow it
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (RuntimeException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow it
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow it
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (hdrExist == false) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return queryResult;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // maxNoOfRecs starts out as MOST_RECENT_MAX_RECORDS (-1).
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // when MOST_RECENT_MAX_RECORDS (-1) specified in the LogQuery,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // LogReader will change it to the value read from the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // attribute LogConstants.MAX_RECORDS.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // getNumRecordsWanted will be the max (default 500),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // ALL_RECORDS (-2), or some positive non-zero number
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (logQuery != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // caller has to handle what is MOST_RECENT_MAX_RECORDS
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // this class has no idea about the value
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((logQuery.getNumRecordsWanted() ==
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogQuery.MOST_RECENT_MAX_RECORDS) ||
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (logQuery.getNumRecordsWanted() < LogQuery.ALL_RECORDS)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.maxNoOfRecs = 1;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.maxNoOfRecs = logQuery.getNumRecordsWanted();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.maxNoOfRecs = 1;// can't be 0, headers will be returned
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // getRecordsMulti() uses maxNoOfRecs
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (sourceData == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.getRecordsMulti(true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.getRecordsMulti(false);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IOException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IllegalArgumentException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (RuntimeException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e; // catch & rethrow
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } // end of for loop for all files
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int recSize = listOfValidRecords.size();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // checks whether it has got any record or not
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (recSize <= 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // if no record found return null
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // if Sorting is specified
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (queryChriteria != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String sortByField = queryChriteria.getSortingField();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (sortByField != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.sorter = new LogRecordSorter(sortByField,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster listOfValidRecords);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster queryResult = this.sorter.getSortedRecords();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (queryResult);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (NoSuchFieldException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e;// catch & rethrow else cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IllegalArgumentException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e;// catch & rethrow else cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (RuntimeException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e;// catch & rethrow else cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e;// catch & rethrow else cud be caught in other place
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // don't do any processing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster queryResult = new String[recSize][];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < recSize; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster queryResult[i] = (String[]) listOfValidRecords.get(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return queryResult;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // This method collects all the ELF header fields.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private boolean getFieldNames(boolean addFields, LogQuery logQry)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws IOException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster RuntimeException, Exception {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String fieldBuffer;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean foundHeader = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster BufferedReader fileReader = new BufferedReader(new FileReader(this.logFileName));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while ((fieldBuffer = fileReader.readLine()) != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (fieldBuffer.trim().length() <= 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue; // invalid, so ignore
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (fieldBuffer.startsWith(version) == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue; // line contain version information
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (fieldBuffer.startsWith(fieldName) == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String hdrStr = fieldBuffer.substring(fieldName.length());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (foundHeader == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break; // this is error.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ArrayList tmpList = getFields(hdrStr, true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] spltHdrStr = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ArrayList al = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (logQry != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster al = logQry.getColumns();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (al != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster columnIndices = new ArrayList();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltHdrStr = new String[al.size()];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltHdrStr = new String[tmpList.size()];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltHdrStr = new String[tmpList.size()];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int j = 0;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int tmpListSz = tmpList.size();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < tmpListSz; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tmps = (String) tmpList.get(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (al != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (al.contains(tmps)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster columnIndices.add(j, Integer.toString(i));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltHdrStr[j++] = tmps;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltHdrStr[j++] = tmps;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // don't add Field names "record" if not first file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // also find out if specific columns (fields) where
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // requested. if so, then only include those, and
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // make a list of indices that should be stored from
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // the subsequent records read.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (addFields) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster listOfValidRecords.add(spltHdrStr);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster foundHeader = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fileReader.close();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IOException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = "Problem in reading " + logFileName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new IOException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (RuntimeException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = "Problem in reading " + logFileName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new RuntimeException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (foundHeader);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // reads file, splits into fields, validates field values and collects it.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private boolean getRecords(boolean isSourceData)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws IOException, RuntimeException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String bufferedStr;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String dummyStr = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder dummySbuf = new StringBuilder(" ");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int dcnt = 0;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (columnIndices != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dcnt = columnIndices.size();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dcnt = LogConstants.MAX_FIELDS + 2; // max cols for secure record
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 1; i < dcnt; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dummySbuf.append("\t ");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dummyStr = dummySbuf.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster BufferedReader flRead = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster flRead = new BufferedReader(new FileReader(logFileName));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while ((bufferedStr = flRead.readLine()) != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (bufferedStr.trim().length() <= 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (LogReader.isLogSecure()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.error("LogReadFileHandler.getRecords: " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "Blank line in secure log");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster bufferedStr = dummyStr;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue; // no field value, so ignore
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (bufferedStr.startsWith(version) == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue; // line contains version of the elf file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (bufferedStr.startsWith(fieldName) == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue; // header already collected, ignore it
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // temporary field holder
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ArrayList listOfFields = new ArrayList();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster listOfFields = this.getFields(bufferedStr, isSourceData);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] spltStrArr = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (columnIndices != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltStrArr = new String[columnIndices.size()];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltStrArr = new String[listOfFields.size()];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int j = 0;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < listOfFields.size(); i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (columnIndices != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (columnIndices.contains(Integer.toString(i))) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltStrArr[j++] = (String) listOfFields.get(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltStrArr[i] = (String) listOfFields.get(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (queryChriteria == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.collect(spltStrArr);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (this.applyQuery(spltStrArr) == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.collect(spltStrArr);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (RuntimeException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = "Problem in reading " + logFileName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new IOException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = "Problem in reading " + logFileName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new RuntimeException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } finally {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster flRead.close();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // reads file, splits into fields, validates field values and collects it.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // this version is for the multi-file read.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // collect the records locally, then add them to the global
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // listOfValueRecords
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private boolean getRecordsMulti(boolean isSourceData)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws IOException, RuntimeException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String bufferedStr;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int localNumRecs = 0;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ArrayList localListOfValidRecords = new ArrayList();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster BufferedReader flRead = new BufferedReader(new FileReader(logFileName));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while ((bufferedStr = flRead.readLine()) != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (bufferedStr.trim().length() <= 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue; // no field value, so ignore
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (bufferedStr.startsWith(version) == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue; // line contains version of the elf file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (bufferedStr.startsWith(fieldName) == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue; // header already collected, ignore it
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // temporary field holder
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ArrayList listOfFields = new ArrayList();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster listOfFields = this.getFields(bufferedStr, isSourceData);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] spltStrArr = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (columnIndices != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltStrArr = new String[columnIndices.size()];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltStrArr = new String[listOfFields.size()];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int j = 0;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < listOfFields.size(); i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (columnIndices != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (columnIndices.contains(Integer.toString(i))) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltStrArr[j++] = (String) listOfFields.get(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster spltStrArr[i] = (String) listOfFields.get(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int rec_size = localListOfValidRecords.size();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((queryChriteria == null) ||
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (this.applyQuery(spltStrArr) == true)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (this.maxNoOfRecs != LogQuery.ALL_RECORDS) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (localNumRecs > this.maxNoOfRecs) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster localListOfValidRecords.remove(1);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster localListOfValidRecords.add(spltStrArr);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster localNumRecs++;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // might have to do something about max most recent...
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (localNumRecs > this.maxNoOfRecs) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster localNumRecs = this.maxNoOfRecs;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] tmpxx = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < localNumRecs; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tmpxx = (String[]) localListOfValidRecords.get(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster listOfValidRecords.add(tmpxx);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster flRead.close();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (RuntimeException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = "Problem in reading " + logFileName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new IOException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = "Problem in reading " + logFileName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new RuntimeException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // applies query to find out whether the record matches or not
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private boolean applyQuery(String[] recordToBeQueried) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ArrayList queries = (ArrayList) queryChriteria.getQueries();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (queries == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int qrySz = queries.size();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (qrySz == 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int queryCondition = queryChriteria.getGlobalOperand();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean isMatch = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < qrySz; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster isMatch = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster isMatch = doMatch(recordToBeQueried, (QueryElement) queries.get(i));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (queryCondition ==
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster com.sun.identity.log.LogQuery.MATCH_ALL_CONDITIONS) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (isMatch == false) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (isMatch);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (queryCondition ==
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster com.sun.identity.log.LogQuery.MATCH_ANY_CONDITION) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (isMatch == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (isMatch);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (isMatch);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // checks whether record is a match or not
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private boolean doMatch(String[] record, QueryElement elem) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean isFound = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int fieldPos = -1;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] fields = (String[]) listOfValidRecords.get(0);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int fieldNo = fields.length;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String fldName = elem.getFieldName();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String fldValue = elem.getFieldValue();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // find the field position first
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < fieldNo; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (fldName.compareTo(fields[i]) == 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fieldPos = i;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (fieldPos == -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (isFound);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int result = 0;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int rel = elem.getRelation();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster switch (rel) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case QueryElement.CN: // contains
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (record[fieldPos].indexOf(fldValue) != -1);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case QueryElement.SW: // starts with
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (record[fieldPos].startsWith(fldValue));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case QueryElement.EW: // ends with
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (record[fieldPos].endsWith(fldValue));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster default:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster result = record[fieldPos].compareTo(fldValue);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster switch (rel) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case QueryElement.EQ:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (result == 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case QueryElement.LT:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (result < 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case QueryElement.GT:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (result > 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case QueryElement.LE:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (result <= 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case QueryElement.GE:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (result >= 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case QueryElement.NE:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (result != 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster default:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (false);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // It collects the records into the internal list
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // takes care of storing latest result, pushing earliest out.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void collect(String[] recordValues) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int rec_size = listOfValidRecords.size();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (this.maxNoOfRecs != LogQuery.ALL_RECORDS) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (rec_size > this.maxNoOfRecs) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster shiftRecordsUpward();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster appendRecord(recordValues);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // this method appends the record to the internal data
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void appendRecord(String[] record) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster listOfValidRecords.add(record);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // removes oldest or 1st record and shifts rest of the records upward
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void shiftRecordsUpward() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (listOfValidRecords.size() <= 1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster listOfValidRecords.remove(1);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // method to split ELF formatted line into fields
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private ArrayList getFields(String bufferedStr,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean source) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String str = bufferedStr.trim();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ArrayList fields = new ArrayList();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster char quote = '"';
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster char new_line = '\n';
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster char cr_return = '\r';
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int current_position = 0;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean isNewField = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tmpStr = new String();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int str_len = str.length();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster char read_char;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (current_position < str_len) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster read_char = str.charAt(current_position);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (read_char == quote) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /* Assumptions::
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster 1st character is a quote. i.e. Substrings starts with quote.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster There could be quote within the desired sub string.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster If the sub string contains a quote,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster it will be precceded with another quote. i.e. the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster substring can contain even number of quotes,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster not odd numbere of quotes.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster The ending position of the substring will be a single quote
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster i.e. a detached quote, no quote to follow immediately.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String sub_str = str.substring(current_position);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int current_sub_position = 1;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster char ch;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean quotedFieldAdded = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String buffer = new String();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (source == false) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster buffer += quote;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean pending_quote = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (current_sub_position < str_len) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ch = sub_str.charAt(current_sub_position);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((ch != quote) && (ch != new_line) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (ch != cr_return)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster buffer += ch;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ++current_sub_position;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (current_sub_position == (sub_str.length() - 1)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (source == false) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster buffer += ch;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ch != quote) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster buffer += ch;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ++current_sub_position;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fields.add(buffer);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster current_position += current_sub_position;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster quotedFieldAdded = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((sub_str.charAt(current_sub_position + 1) != quote) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (sub_str.charAt(current_sub_position + 1) != new_line) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (sub_str.charAt(current_sub_position + 1) != cr_return)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (source == false) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster buffer += ch;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ++current_sub_position;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (pending_quote == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pending_quote = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fields.add(buffer);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster current_position += current_sub_position;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster quotedFieldAdded = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (source == false) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster buffer += ch;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pending_quote = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (pending_quote == false) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster buffer += ch;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pending_quote = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pending_quote = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ++current_sub_position;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (quotedFieldAdded != true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fields.add(buffer);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster current_position += current_sub_position;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if ((read_char == ' ') ||
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (read_char == '\t') ||
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (read_char == '\f') ||
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (read_char == '\r') ||
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (read_char == '\n')) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (isNewField == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // fields are seperated by whitespace(s)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // only String can contain whitespace(s)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tmpStr.length() != 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fields.add(tmpStr);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tmpStr = new String();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ++current_position;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster isNewField = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ++current_position;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (isNewField == true) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tmpStr += read_char;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ++current_position;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (current_position == str_len) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fields.add(tmpStr);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster continue;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return fields;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // below method reset previous readings and prepare for new one.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void cleaner() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.logFileName = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.queryChriteria = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.listOfValidRecords.clear();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.queryResult = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}