
// package test;

import java.util.*;
import java.text.*;
import java.io.FileReader;
import java.io.BufferedReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
// import java.sql.Date;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.text.SimpleDateFormat;
// import java.util.Date;

// log browser write test 
// this class's main method reads one system.log file and inserts it's records content into the L_TABLE_LOGBROWSER
public class lbwt {

  public static final String c_filename    = ".\\ngin.log";
  public static final String c_sql_insert  = "insert INTO L_TABLE_LOGBROWSER "+
                                            "(ELEMENT_NAME, STREAM_NAME, SEGMENT_ID, BYTE_ADDRESS, OPERATION_TIMESTAMP, "+
                                            "RECORD_TYPE, TAG_N_1, TAG_VS_1, TAG_VS_2, TAG_VL_1, TAG_VL_2) "+
	                                    "VALUES(?,?,?,?,?,?,?,?,?,?,?)";

    public static final String c_driverClass = "oracle.jdbc.driver.OracleDriver";
    public static final String c_dbUrl       = "jdbc:oracle:thin:@solv8:1521:o2evra";
    public static final String c_dbUser      = "o2evra_feeder";
    public static final String c_dbPassword  = "dbmgr";

    private Connection conn = null;
    private PreparedStatement stmt = null;

    public String f_element_name = "DEMO_NGIN";
    public String f_stream_name  = "03_demo_ngin_log";
    public int f_segment_id      = 5002;
    public long f_byte_address   = 0;
    public java.util.Date f_operation_timestamp = new java.util.Date();
    public String f_record_type  = "LOG";
    public int    f_tag_n_1      = 7;
    public String f_tag_vs_1     = "VS_1 - severity";
    public String f_tag_vs_2     = "VS_2 - component id";
    public String f_tag_vl_1     = "VL_1 - remaining_header_line";
    public String f_tag_vl_2     = "VL_2 - remaining_record_text";

    public String p_filename = "";
    public String p_elemname = "";
    public String p_streamname = "";
    public String p_segname = "";

    private void dbopen() {
	try {
	  Class.forName(c_driverClass);
	  conn = DriverManager.getConnection(c_dbUrl, c_dbUser, c_dbPassword);
	  stmt = conn.prepareStatement(c_sql_insert);
	  stmt.clearParameters();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    private void dbclose() {
	try {
	stmt.close();
	conn.close();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    private void insert() {
	try {
	stmt.clearParameters();
	stmt.setString(1,f_element_name);
	stmt.setString(2,f_stream_name);
	stmt.setInt(3,f_segment_id);
	stmt.setLong(4,f_byte_address);
	stmt.setTimestamp(5,new java.sql.Timestamp(f_operation_timestamp.getTime()));
	stmt.setString(6,f_record_type);
	stmt.setInt(7,f_tag_n_1);
	stmt.setString(8,f_tag_vs_1);
	stmt.setString(9,f_tag_vs_2);
	stmt.setString(10,f_tag_vl_1);
	stmt.setString(11,f_tag_vl_2);
	stmt.executeUpdate();
	conn.commit();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    private void getArgs(String[] args) {
	if (args.length>3) {
	    p_segname = new String(args[3]);
	    if (p_segname.length()>0) {
		f_segment_id=Integer.parseInt(p_segname);
	    }
	}
	if (args.length>2) {
	    p_streamname = new String(args[2]);
	    if (p_streamname.length()>0) {
		f_stream_name = new String(p_streamname);
	    }
	}
	if (args.length>1) {
	    p_elemname = new String(args[1]);
	    if (p_elemname.length()>0) {
		f_element_name = new String(p_elemname);
	    }
	}
	if (args.length>0) {
	    p_filename = new String(args[0]);
	}

	if (p_filename.length()==0) {
	    p_filename = new String(c_filename);
	}
	System.out.println("LBWT: reading from file \""+p_filename+"\"");
	System.out.println("LBWT: setting element name to \""+f_element_name+"\"");
	System.out.println("LBWT: setting stream name to \""+f_stream_name+"\"");
	System.out.println("LBWT: setting segment id to "+f_segment_id);
    }

  public static void main(String[] args) {

      String lb = null;
      long rpos = 0;        // synthetically maintained current read position in input file
      long tpos = 0;        // buffer for rpos to rmember byte-address of actual record


      if (args.length<1) {
	  System.out.println("Usage: lbwt <filename-to-load> <element-name> <stream-name> <segment-number>");
	  return;
	}

    try {
	lbwt t = new lbwt();
	t.getArgs(args);

	t.dbopen();
	
	FileReader frd = new FileReader(t.p_filename);
	BufferedReader bfr = new BufferedReader(frd);
	rpos = 0;
	boolean running = true;
	boolean lb_read = false;
	int lc = 0;
	int logdiv = 0;
	int recnum = 0;
	while (running) {
	    try {
		if (!lb_read) { 
		    lb = bfr.readLine();
		    if (!(lb==null)) {
			rpos += lb.length() + 1;
		    }
		}
		if (!(lb==null)) {
		    lc++;
		    // System.out.println(lc+": "+lb);
		    if (lb.startsWith("2007")) {
			tpos = rpos;
			lb_read = false;
			StringTokenizer strtok = new StringTokenizer(lb);
		    	String s1 = null;
		    	String s2 = null;
		    	String s3 = null;
		    	Date d1 = null;
		    	SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss,SSS");
		    	StringBuffer sb1 = new StringBuffer(4000);
		    	int n1 = -1;
		    	s1 = strtok.nextToken();
		    	s2 = strtok.nextToken();
		    	s3 = new String(s1+" "+s2);
		    	recnum++;
		    	logdiv++;
		    	if (logdiv>1000) {
		    		System.out.println("LBWT: record "+recnum+" of "+s3);
		    		logdiv = 0;
		    	}
		    	t.f_operation_timestamp = df1.parse(s3);
		    	// System.out.println("Date Field "+s3+" parses to "+t.f_operation_timestamp);
		    	s1 = strtok.nextToken();
		    	t.f_tag_vs_1 = s1;
		    	// System.out.println("Severity: "+t.f_tag_vs_1);
		    	if (s1.startsWith("INF")) { n1 = 1; } 
		    	if (s1.startsWith("DEB")) { n1 = 2; } 
		    	if (s1.startsWith("WAR")) { n1 = 3; } 
		    	if (s1.startsWith("MIN")) { n1 = 4; } 
		    	if (s1.startsWith("MAJ")) { n1 = 5; } 
		    	if (s1.startsWith("ERR")) { n1 = 6; } 
		    	if (s1.startsWith("FAT")) { n1 = 7; }
		    	t.f_tag_n_1 = n1;
		    	t.f_tag_vs_2 = strtok.nextToken();
		    	// System.out.println("Component ID: "+t.f_tag_vs_2);
		    	t.f_tag_vl_1 = strtok.nextToken("\n");
		    	// System.out.println("Rest_Header: "+t.f_tag_vl_1);
		    	t.f_tag_vl_2 = new String("");
		    	try {
		    		lb = bfr.readLine();
				if (!(lb==null)) {
				    rpos += lb.length() + 1;
				}
				else {
				    lb = new String("");
				    running = false;
				}
		    	} catch (Exception e) {
		    		lb = new String("");
				running = false;
		    	}
		    	lb_read = true;
		    	while ((running) && (!lb.startsWith("2007"))) {
		    		// System.out.println("Rest_Line: "+lb);
		    		if ((sb1.length()+lb.length())<3990) {
		    		    if (sb1.length()>0) { sb1.append("\n"); }
		    		    sb1.append(lb);
		    		}
				try {
				    lb = bfr.readLine();
				    if (!(lb==null)) {
					rpos += lb.length() + 1;
				    }
				    else {
					lb = new String("");
					running = false;
				    }
				} catch (Exception e) {
				    lb = new String("");
				    running = false;
				}
		    	}
		    	t.f_tag_vl_2 = sb1.toString();
		    	// System.out.println("Rest_Record: "+t.f_tag_vl_2);
			t.f_byte_address = tpos;
		    	t.insert();
		    }
		}
		else {
		    running = false;
		}
	    } catch (Exception e) {
		e.printStackTrace();
		running = false;
	    }
	}
	t.dbclose();
    } catch (Exception e) {
      e.printStackTrace();

    }
  }
}

 

