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

src.com.ibm.as400.util.commtrace.Format Maven / Gradle / Ivy

The newest version!
///////////////////////////////////////////////////////////////////////////////
//                                                                             
// JTOpen (IBM Toolbox for Java - OSS version)                                 
//                                                                             
// Filename: Format.java
//                                                                             
// The source code contained herein is licensed under the IBM Public License   
// Version 1.0, which has been approved by the Open Source Initiative.         
// Copyright (C) 2002 International Business Machines Corporation and     
// others. All rights reserved.                                                
//                                                                             
///////////////////////////////////////////////////////////////////////////////

package com.ibm.as400.util.commtrace;

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.NotSerializableException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Writer;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Hashtable;
import java.util.Locale;
import java.util.Properties;
import java.util.ResourceBundle;
import java.util.Vector;

import com.ibm.as400.access.AS400;
import com.ibm.as400.access.AS400SecurityException;
import com.ibm.as400.access.CommandLineArguments;
import com.ibm.as400.access.IFSFileInputStream;
import com.ibm.as400.access.IFSFileOutputStream;
import com.ibm.as400.access.IFSTextFileOutputStream;
import com.ibm.as400.access.Trace;

/**
 * The Format object is an interface between the raw trace file and the records the trace file contains.
* A example program:
* *
 * Format f = new Format("/path/to/file");
 * f.setFilterProperties(fmtprop); // Sets the filtering properties for this format
 * f.formatProlog(); // Format the prolog
 * Prolog pro = f.getProlog();	
 * System.out.println(pro.toString());
 * if(!pro.invalidData()) { // The is not a valid trace
 *	 Frame rec; 
 *	 while((rec=f.getNextRecord())!=null) { // Get the records
 *	 	System.out.print(rec.getRecNum()); // Print out the Frame Number
 *	 	System.out.println(rec.getTime()); // Print out the time
 *	 	IPPacket p = rec.getPacket(); // Get this records packet
 *	 	Header h = p.getHeader(); // Get the first header
 *	 	if(p.getType()==IPPacket.IP6) { // If IP6 IPPacket
 *	 		if(h.getType()==Header.IP6) { // If IP6 Header
 *				IP6Header ip6 = (IP6Header) h; // Cast to IP6 so we can access methods
 *				System.out.println(h.getName()); // Print the name
 *				System.out.println("IP6 src:"+ip6.getSrcAddr() + " dst:" + ip6.getDstAddr());
 *				System.out.println(ip6.printHexHeader()); // Print the header as hex 
 *				// Print a string representation of the header.
 *				System.out.println(ip6.toString(prop)); 
 *				while((h=h.getNextHeader())!=null) { // Get the rest of the headers
 *					if(h.getType()==Header.TCP) { // If its a TCP header
 *						TCPHeader tcp = (TCPHeader) h; // Cast so we can access methods
 *						System.out.println("TCP src:" + tcp.getSrcPort() + " dst:" + tcp.getDstPort()); 
 *						System.out.println(tcp.toString(prop));
 *					} else if(h.getType()==Header.UDP) { // If its a UDP header
 *						UDPHeader udp = (UDPHeader) h; // Cast so we can access methods
 *						System.out.println("UDP src:" + udp.getSrcPort() + " dst:" + udp.getDstPort()); 
 *						System.out.println(udp.toString(prop));
 *					}
 *				}
 *			}
 *		}
 *	 } 
 * }
* * Format can be run as a program as follows:
*
 * java com.ibm.as400.commtrace.Format [ options ]
* Options: *
*
First argument
System to connect to
*
-u/-userID
The userID for the system
*
-p/-password
The password for the system
*
-t/-trace
The trace to parse
*
-o/-outfile
The file to store the output in
*
-c/-current
Will connect to localhost with the current userID and password
*
-v/-verbose [true|false]
*
-logfile
The file to store the Trace.log to
*
-ip/-ipaddress
The IP address to filter by
*
-ip2/-ipaddress2
The second IP address to filter by
*
-port
The port number to filter by
*
-broadcast [*YES|*NO]
Print broadcast frames
*
-starttime
The start of the display range in MMddyyyykkmmssSSS notation(see java.text.SimpleDateFormat)
*
-endtime
The end of the display range in MMddyyyykkmmssSSS notation(see java.text.SimpleDateFormat)
*
-starttimelong
The start of the display range in milliseconds since the epoc
*
-endtimelong
The end of the display range in milliseconds since the epoc
*
*/ public class Format { private static final String ALL= "*ALL", NO= "*NO", CLASS="Format"; private AS400 sys= null; private boolean createdSys=false; // True if we created the system so we should close it private InputStream file_= null; private Progress progress= null; // The progress dialog which display the format progress to the user private byte[] data= null; // The raw data of a specific packet private Prolog pro_= null; // The prolog of this trace. Needed so we can get the title and date of this trace private String filename= null, // The path and filename of the file to format outfilePath_= null; // The path and filename of the file to put the traced data to //fmtBroadcast= "Y"; // User wants to see broadcast frames private BitBuf nxtRecLen; private int ifsrecs= 0, // The number of records in this commtrace tcprecs= 0, // The number of tcp records in this commtrace numrecs= 0; // The number of records processed private FormatProperties filter_; private ObjectInputStream serin_; /** * Default constructor. */ public Format() { } /** * Creates a new Format.
* Initializes the MRI.
* Takes an AS400 object as an argument which will be used for * all IBM i operations.
* * @param sys The system that this object should connect to. */ public Format(AS400 sys) { this.sys= sys; } /** * Constructs a new Format object.
* Initializes the MRI.
* Formats the Prolog.
* Sets up the Filters.
* @param prop The FormatProperties object to filter by. * @param outfile The file to write the formatted trace data to. * @param infile The name of the file to read from. */ public Format(FormatProperties prop, String outfile, String infile) { this.filter_= prop; this.outfilePath_= outfile; this.filename = infile; // If the user didn't specify a file name gracefully exit if (infile == null) { close(); return; } // Attempt to open a stream on the file try { file_= new BufferedInputStream(new FileInputStream(infile)); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".Format()" + "Error opening:" + infile, e); } close(); // Clean up this thread return; } formatProlog(); } /** * Creates a Format object on the given binary trace.
* Initializes the MRI.
* Formats the Prolog.
* Sets up the Filters.
* @param args The command line arguments to be used to format the file.
*/ public Format(String[] args) { // Create a vector to hold all the possible command line arguments. Vector v= new Vector(); v.addElement("-userID"); v.addElement("-password"); v.addElement("-trace"); v.addElement("-filename"); v.addElement("-outfile"); v.addElement("-current"); v.addElement("-verbose"); v.addElement("-logfile"); v.addElement("-country"); v.addElement("-language"); v.addElement("-ipaddress"); v.addElement("-ipaddress2"); v.addElement("-port"); v.addElement("-broadcast"); v.addElement("-starttime"); v.addElement("-endtime"); v.addElement("-starttimelong"); v.addElement("-endtimelong"); // Create a Hashtable to map shortcuts to the command line arguments. Hashtable shortcuts= new Hashtable(); shortcuts.put("-u", "-userID"); shortcuts.put("-p", "-password"); shortcuts.put("-t", "-trace"); shortcuts.put("-o", "-outfile"); shortcuts.put("-c", "-current"); shortcuts.put("-v", "-verbose"); shortcuts.put("-l", "-language"); shortcuts.put("-co", "-country"); shortcuts.put("-ip", "-ipaddress"); shortcuts.put("-ip2", "-ipaddress2"); // Create a CommandLineArguments object with the args array passed // into main(String args[]) along with the vector and hashtable just // created. CommandLineArguments arguments= new CommandLineArguments(args, v, shortcuts); // Get the system that the user wants to run to. String system= arguments.getOptionValue(""); // Get the user ID that the user wants to log in with. String uid= arguments.getOptionValue("-userID"); // Get the password that the user wants to log in with. String pwd= arguments.getOptionValue("-password"); // If specified the user wants to logon to localhost with the current // userID and password String cur= arguments.getOptionValue("-current"); // The name of the file to trace String filename= arguments.getOptionValue("-trace"); this.filename= filename; // The name of the output file to save to String outfile= arguments.getOptionValue("-outfile"); this.outfilePath_= outfile; // Enable debugging or not String verbose= arguments.getOptionValue("-verbose"); String logfile= arguments.getOptionValue("-logfile"); // The language code //String language= arguments.getOptionValue("-language"); // The country code String country= arguments.getOptionValue("-country"); // If supposed to be verbose set the trace if (verbose != null && verbose.equals("true")) { Trace.setTraceErrorOn(true); // Enable error messages Trace.setTraceWarningOn(true); // Enable warning messages Trace.setTraceInformationOn(true); // Enable warning messages Trace.setTraceOn(true); // Turns on traceing } // If log output should be sent to a file if (logfile != null) { try { Trace.setFileName(logfile); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log( Trace.ERROR, CLASS + ".Format" + "Can't set trace file name, defaulting to outputing trace data to standard out"); } } } // Set up the filter properties for this trace filter_= new FormatProperties(); String filterIP= arguments.getOptionValue("-ipaddress"); String filterIP2= arguments.getOptionValue("-ipaddress2"); String filterPort= arguments.getOptionValue("-port"); String filterBdcst= arguments.getOptionValue("-broadcast"); String filterSTime= arguments.getOptionValue("-starttime"); String filterETime= arguments.getOptionValue("-endtime"); String filterSTimelong= arguments.getOptionValue("-starttimelong"); String filterETimelong= arguments.getOptionValue("-endtimelong"); boolean setUpFilters=false; // Set the filter properties that were specified if (filterIP != null && !filterIP.equals(ALL)) { filter_.setIPAddress(filterIP); if (Trace.isTraceOn() && Trace.isTraceInformationOn()) { Trace.log(Trace.INFORMATION,CLASS + ".Format() " + "IP Filtering enabled"); } } if (filterIP2 != null && !filterIP2.equals(ALL)) { filter_.setSecondIPAddress(filterIP2); if (Trace.isTraceOn() && Trace.isTraceInformationOn()) { Trace.log(Trace.INFORMATION,CLASS + ".Format() " + "IP Filtering enabled"); } } if (filterBdcst != null && !filterBdcst.equals(ALL)) { filter_.setBroadcast(filterBdcst); if (Trace.isTraceOn() && Trace.isTraceInformationOn()) { Trace.log(Trace.INFORMATION,CLASS + ".Format() " + "Broadcast Filtering enabled"); } } if (filterPort != null && !filterPort.equals(ALL)) { filter_.setPort(filterPort); if (Trace.isTraceOn() && Trace.isTraceInformationOn()) { Trace.log(Trace.INFORMATION,CLASS + ".Format() " + "Port Filtering enabled"); } } if (filterSTime != null && !filterSTime.equals(ALL)) { filter_.setStartTime(filterSTime); if (Trace.isTraceOn() && Trace.isTraceInformationOn()) { Trace.log(Trace.INFORMATION,CLASS + ".Format() " + "Beginning Timestamp Filtering enabled"); } setUpFilters=true; // We need to parse the argument into a timestamp } if (filterETime != null && !filterETime.equals(ALL)) { filter_.setEndTime(filterETime); if (Trace.isTraceOn() && Trace.isTraceInformationOn()) { Trace.log(Trace.INFORMATION,CLASS + ".Format() " + "End Timestamp Filtering enabled"); } } if (filterSTimelong != null && !filterSTimelong.equals(ALL)) { if(filterETime!=null) { // The End time with a MMddyyyykkmmssSSS format was // specified. Remove it since a millisecond time was also specified. String time=null; filter_.setEndTime(null); } filter_.setStartTime(filterSTimelong); if (Trace.isTraceOn() && Trace.isTraceInformationOn()) { Trace.log(Trace.INFORMATION,CLASS + ".Format() " + "Beginning Timestamp Filtering enabled"); } } if (filterETimelong != null && !filterETimelong.equals(ALL)) { filter_.setEndTime(filterETimelong); if (Trace.isTraceOn() && Trace.isTraceInformationOn()) { Trace.log(Trace.INFORMATION,CLASS + ".Format() " + "End Timestamp Filtering enabled"); } } if(filename==null) { // User didn't specify a file if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".Format() " + "Outfile not specified"); } return; } if (cur != null) { // If use CURRENT sys= new AS400(); createdSys=true; try { // Opens a input stream on the file file_= new IFSFileInputStream(sys, filename); } catch (FileNotFoundException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".Format() " + "File " + filename + " not found", e); } return; } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".Format() " + "Error opening " + filename, e); } return; } catch (AS400SecurityException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".Format() " + "Security exception opening file", e); } return; } // User wants to format a file on their local PC } else if (system == null || uid == null || pwd == null) { try { file_= new BufferedInputStream(new FileInputStream(filename)); } catch (FileNotFoundException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".Format() " + "File " + filename + " not found", e); } return; } // User wants to format a file on the AS400 } else { sys= new AS400(system, uid, pwd); createdSys=true; try { // Opens a input stream on the file file_= new IFSFileInputStream(sys, filename); } catch (FileNotFoundException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".Format() " + "File " + filename + " not found", e); } return; } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".Format() " + "Error opening" + filename, e); } return; } catch (AS400SecurityException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".Format() " + "Security exception opening file", e); } return; } } if(!formatProlog()) { if(setUpFilters) { setUpFilters(); // Change the time filters into time in milliseconds } } } /** * Creates a Format object on the given local file.
* @param filename The file to format. */ public Format(String filename) { this.filename= filename; if(filename==null) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".Format() " + "File not specified"); } return; } try { file_= new BufferedInputStream(new FileInputStream(filename)); // Opens a input stream on the local file } catch (FileNotFoundException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".Format() " + "File " + filename + " not found", e); } return; } } /** * Creates a Format object on the given IFSFileInputStream.
* Initializes the MRI.
* Formats the Prolog.
* Sets up the Filters.
* @param file The input stream to read the data off of. */ public Format(IFSFileInputStream file) { this.file_= file; formatProlog(); } /** * Changes the TIMESTART and TIMEEND of the Properties into longs with a value of time from the epoc. */ private void setUpFilters() { if(filter_==null) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".setUpFilters() " + "Filters are not initialized"); } return; } try { SimpleDateFormat df= new SimpleDateFormat("MMddyyyykkmmssSSS"); // The format of the date after the record to filter on replaces the start time String starttime= filter_.getStartTime(); String endtime= filter_.getEndTime(); if (starttime != null) { // Set the property to the milliseconds since the epoc filter_.setStartTime(Long.toString(df.parse(starttime).getTime())); } if (endtime != null) { // Set the property to the milliseconds since the epoc filter_.setEndTime(Long.toString(df.parse(endtime).getTime())); } } catch (ParseException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".setUpFilters() " + "Invalid Time argument", e); } } } /** * Sets the Properties for this Format. * @param prop Properties for this Format. */ public void setFilterProperties(FormatProperties prop) { filter_=prop; } /** * Sets the output file to open a OutputStream on. * @param outfile The file to open a OutputStream on. */ public void setOutFile(String outfile) { this.outfilePath_=outfile; } /** * Sets the input stream to read the data from. * @param infile The open InputStream to read from. */ public void setInFileStream(InputStream infile) { file_=infile; } /** * Sets the system to use for all IBM i connections. * @param system The system to connect to. */ public void setSystem(AS400 system) { sys=system; } /** * Formats the trace and sends the output to an IFS text file on the system we are bound to. * @return A error code if any. */ public int toIFSTxtFile() { if(sys==null) { // sys isn't specified if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toIFSTxtFile() " + "Error the system wasn't specified"); } return 1; } if(outfilePath_==null) { // outfile isn't specified if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toIFSTxtFile() " + "Error the out file wasn't specified"); } return 1; } IFSTextFileOutputStream out = null; try { try { out= new IFSTextFileOutputStream(sys, outfilePath_); // Opens an output stream on the local file } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toIFSTxtFile() " + "Error opening " + outfilePath_, e); } return 1; } catch (AS400SecurityException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toIFSTxtFile() " + "Security exception opening file", e); } return 1; } int recPrinted=0; Frame rec; try { out.write(pro_.toString()); while ((rec= getNextRecord()) != null) { if(recPrinted%5==0) { out.write(addBanner()); } out.write(rec.toString()); recPrinted++; } out.write(addEndBanner()); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toIFSTxtFile() " + "Error writing to " + filename, e); } return 1; } } finally { if (out != null) { try { out.close(); } catch (IOException e) { Trace.log(Trace.ERROR,e); } } } return 0; } /** * Formats the trace and sends the output to an IFS text file on the system we are bound to. * @return A error code if any. */ public int toLclTxtFile() { Writer out; if(outfilePath_==null) { // outfile isn't specified if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toLclTxtFile() " + "Error the out file wasn't specified"); } return 1; } try { out= new BufferedWriter(new FileWriter(outfilePath_)); // Opens an output stream on the local file } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toLclTxtFile() " + "Error opening " + outfilePath_, e); } return 1; } int recPrinted=0; Frame rec; try { out.write(pro_.toString()); while ((rec= getNextRecord()) != null) { if(recPrinted%5==0) { out.write(addBanner()); } out.write(rec.toString()); recPrinted++; } out.write(addEndBanner()); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toLclTxtFile() " + "Error writing to " + filename, e); } return 1; } try { out.flush(); out.close(); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toLclTxtFile() " + "Error closing " + filename, e); } return 1; } return 0; } /** * Format the trace and write the results to a binary IFS file on the system * we are connected to. * @return A error code if any. */ public int toIFSBinFile() { if(pro_==null) { // Constructed incorrectly if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toIFSBinFile() " + "Error the prolog wasn't formatted"); } return 1; } if (pro_.invalidData()) { // If the prolog had invalid data return if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toIFSBinFile() " + "Not a valid IBM i CommTrace"); } return 1; } ObjectOutputStream out = null; try { try { out= new ObjectOutputStream(new IFSFileOutputStream(sys, outfilePath_)); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toIFSBinFile() " + "Error opening " + outfilePath_, e); } return 1; } catch (AS400SecurityException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toIFSBinFile() " + "Security exception opening file " + outfilePath_, e); } return 1; } try { out.writeUTF(pro_.toString()); out.writeInt(ifsrecs); Frame rec = null; while ((rec= getNextRecord()) != null) { String record= rec.toString(filter_); if (record.length() != 0) { out.writeUTF(record); } } out.writeUTF(addEndBanner()); } catch (NotSerializableException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toIFSBinFile() " + "Error object not serializable " + outfilePath_, e); } return 1; } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toIFSBinFile() " + "Error writing file " + outfilePath_, e); } return 1; } } finally { if (out != null) { try { out.close(); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toIFSBinFile() " + "Error closing file " + outfilePath_, e); } return 1; } } } return 0; } /** * Format the trace and write the results to a binary file on the local PC. * @return A error code if any. */ public int toLclBinFile() { if(pro_==null) { // Constructed incorrectly if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toLclBinFile() " + "Error the prolog wasn't formatted"); } return 1; } if (pro_.invalidData()) { // If the prolog had invalid data return if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toLclBinFile() " + "Not a valid IBM i CommTrace"); } return 1; } String showprogress= filter_.getProgress(); if (showprogress != null && showprogress.equals(FormatProperties.TRUE)) { // Start the progress bar progress= new Progress(("Formating " + filename), ifsrecs, " records"); Thread progThread= new Thread(progress, "ProgDiag"); progress.setThread(progThread); progThread.start(); } // If no output file specified use the same as the current trace but append the extension onto it. //if(outfilePath_==null) { // //} ObjectOutputStream out = null; try { try { out= new ObjectOutputStream(new FileOutputStream(outfilePath_)); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toLclBinFile() " + "Error opening " + outfilePath_, e); } return 1; } try { out.writeUTF(pro_.toString()); out.writeInt(ifsrecs); Frame rec = null; if (progress == null) { while ((rec= getNextRecord()) != null) { String record= rec.toString(filter_); if (record.length() != 0) { out.writeUTF(record); } } } else { while ((rec= getNextRecord()) != null && !progress.isCanceled()) { String record= rec.toString(filter_); if (record.length() != 0) { out.writeUTF(record); } } } out.writeUTF(addEndBanner()); } catch (NotSerializableException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toLclBinFile() " + "Error object not serializable " + outfilePath_, e); } return 1; } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toLclBinFile() " + "Error writing file " + outfilePath_, e); } return 1; } } finally { if (out != null) { try { out.close(); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".toLclBinFile() " + "Error closing file " + outfilePath_, e); } return 1; } } } return 0; } // /** // * Formats the recs and writes them out. // * @return An error code if any. // */ // private int toBinFile(ObjectOutputStream out) { // Frame rec; // try { // out.writeUTF(pro_.toString()); // out.writeInt(ifsrecs); // while ((rec= getNextRecord()) != null) { // out.writeUTF(rec.toString()); // } // out.writeUTF(addEndBanner()); // } catch (NotSerializableException e) { // if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { // Trace.log(Trace.ERROR,CLASS + ".toBinFile() " + "Error object not serializable " + outfilePath_, e); // } // return 1; // } catch (IOException e) { // if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { // Trace.log(Trace.ERROR, CLASS + ".toBinFile() " + "Error writing file " + outfilePath_, e); // } // return 1; // } // try { // out.flush(); // out.close(); // } catch (IOException e) { // if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { // Trace.log(Trace.ERROR, CLASS + ".toBinFile() " + "Error closing file " + outfilePath_, e); // } // return 1; // } // return 0; // } /** * Opens an ObjectInputStream and IFSFileInputStream on the file specified earlier. Used for displaying previously formatted traces. * @return An error code if any. */ public int openIFSFile() { return openIFSFile(outfilePath_); } /** * Opens an ObjectInputStream and IFSFileInputStream on the outfile. Used for displaying previously formatted traces. * @param outfile * @return An error code if any. */ public int openIFSFile(String outfile) { this.outfilePath_= outfile; if(outfilePath_==null) { // Outfile wasn't set if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".openIFSFile()" + "Outfile not specified"); } return 1; } try { serin_= new ObjectInputStream(new IFSFileInputStream(sys, outfilePath_)); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".openIFSFile()" + "Error opening " + outfilePath_,e); } return 1; } catch (AS400SecurityException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".openIFSFile()" + "Security exception opening file " + outfilePath_,e); } return 1; } return 0; } /** * Opens an ObjectInputStream and FileInputStream on the file specified on the command line. Used for displaying previously formatted traces. * @return An error code if any. */ public int openLclFile() { return openLclFile(outfilePath_); } /** * Opens an ObjectInputStream and FileInputStream on the outfile. Used for displaying previously formatted traces. * @param outfile The file to read in. * @return int An error code if any. */ public int openLclFile(String outfile) { this.outfilePath_= outfile; if(outfilePath_==null) { // Outfile wasn't set if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".openLclFile() " + "Outfile not specified"); } return 1; } try { serin_= new ObjectInputStream(new FileInputStream(outfilePath_)); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".openLclFile() " + "Error opening " + outfilePath_, e); } return 1; } return 0; } /** * Closes this format object. * @return An error code if any. */ public int close() { if (Trace.isTraceOn() && Trace.isTraceInformationOn()) { Trace.log(Trace.INFORMATION,CLASS + ".close()"); } int result = 0; try { if (file_ != null) { file_.close(); } } catch (Throwable e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".close() " + "Error closing " + filename, e); } return 1; } try { if (serin_ != null) { serin_.close(); } if (sys != null && createdSys) { sys.disconnectAllServices(); } } catch (Throwable e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".close() " + "Error closing " + outfilePath_, e); } return 1; } if (progress != null) { // Close the progress Thread progress.setThread(null); } return result; } /** * Reads a Frame from the input stream. Records are stored as Strings. * @return String */ public String getRecFromFile() { String utf= null; try { utf= serin_.readUTF(); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".getRecFromFile() " + "Error reading file", e); } return null; } catch (NullPointerException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".getRecFromFile() " + "Error file not opened ", e); } return null; } return utf; } /** * Reads in an int from the input stream. * @return int */ public int getIntFromFile() { int tmp= 0; try { tmp= serin_.readInt(); } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".getIntFromFile() " + "Error reading file", e); } return -1; } catch (NullPointerException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".getIntFromFile() " + "Error file not opened", e); } return -1; } return tmp; } /** * Formats the prolog.
* Sets the length of the first record.
* Sets the total number of records.
* @return true if this trace contains invalid data. */ public boolean formatProlog() { if(file_==null) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".formatProlog() " + "Input file not opened"); } return false; } read(0, 258); // Read in the prolog plus the next record length BitBuf bb= new BitBuf(data); nxtRecLen= new BitBuf(bb, 2048, 16); // Store the length of the next record pro_= new Prolog(bb, filter_); // Create and parse the prolog ifsrecs= pro_.getNumRecs(); // Store the total number of records return pro_.invalidData(); } /** * Retrieves the next record from the given trace.
* This method discards all non TCP records. * @return Frame */ public Frame getNextRecord() { if(pro_==null) { // Not initialized correctly if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".getNextRecord() " + "Prolog not formatted."); } return null; } if (!pro_.invalidData()) { Frame rec= getNext(); while (rec != null) { if (!rec.isTCP()) { rec= getNext(); } else { tcprecs++; return rec; } } return rec; } else { return null; } } /** * Subroutine which allows us to get the next record * @return Frame */ private Frame getNext() { BitBuf bb; int recLen= 0; if (progress != null) { // Progress is being displayed progress.updateProgress(numrecs); } if (numrecs < ifsrecs) { // While we still have records to process numrecs++; if (numrecs == ifsrecs) { // If this is the last record we don't want to read past the end of the file. read(0, nxtRecLen.toInt()); bb= new BitBuf(data); recLen= (nxtRecLen.toInt() - 2) * 8; } else { read(0, nxtRecLen.toInt()); // Read in the next records plus the length of the following record bb= new BitBuf(data); recLen= (nxtRecLen.toInt() * 8) - 16; nxtRecLen= new BitBuf(bb, recLen, 16); } return (new Frame(pro_, bb.slice(0, recLen))); } else { return null; } } /** * Reads len bytes of the file starting at off offest. * @param off the offset to start reading at. * @param len the number of bytes to read. */ private void read(int off, int len) { data= new byte[off + len]; int bytesRead = 0; try { bytesRead = file_.read(data, off, len); // Reads and stores the input in the data array } catch (IOException e) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".read() " + "Error reading file",e); } } if (bytesRead != len) { if (Trace.isTraceOn() && Trace.isTraceErrorOn()) { Trace.log(Trace.ERROR,CLASS + ".read() " + "Incorrect number of bytes read: Requested " + len + ", got " + bytesRead); } } } /** * Return a String containing the banner. * @return String containing the banner. */ public String addBanner() { StringBuffer banner = new StringBuffer(); String record= ResourceBundleLoader_ct.getText("Record"); String mac= ResourceBundleLoader_ct.getText("MACAddress"); banner.append(pro_.getTitle()); banner.append(pro_.getDate()); banner.append(record); banner.append(" "); banner.append(ResourceBundleLoader_ct.getText("Data")); banner.append(" "); banner.append(record); banner.append(" "); banner.append(ResourceBundleLoader_ct.getText("Destination")); banner.append(" "); banner.append(ResourceBundleLoader_ct.getText("Source")); banner.append(" "); banner.append(ResourceBundleLoader_ct.getText("Frame")); banner.append("\n"); banner.append(ResourceBundleLoader_ct.getText("Number")); banner.append(" "); banner.append(ResourceBundleLoader_ct.getText("S/R")); banner.append(" "); banner.append(ResourceBundleLoader_ct.getText("Length")); banner.append(" "); banner.append(ResourceBundleLoader_ct.getText("Timer")); banner.append(" "); banner.append(mac); banner.append(" "); banner.append(mac); banner.append(" "); banner.append(ResourceBundleLoader_ct.getText("Format")); banner.append("\n"); banner.append("------ --- ------ ------------ -------------- -------------- ------"); banner.append("\n"); return banner.toString(); } /** Add the end banner. */ private String addEndBanner() { return ( "\n* * * * * * * * * * * * * " + ResourceBundleLoader_ct.getText("EOCP") + " * * * * * * * * * * * * *\n"); } /** * Returns the number of records that have been formatted. * @return number of formatted records */ public int getRecsProcessed() { return numrecs; } /** * Returns the prolog of this trace. * @return Prolog */ public Prolog getProlog() { return pro_; } /** * Returns the number of tcp records in this trace. * @return The number of tcp records in this trace. */ public int getNumberOfTCPRecords() { return tcprecs; } /** * Called by the JVM to Format a file. * @param args The arguments from the command line. */ public static void main(String[] args) { Format f= new Format(args); f.toIFSBinFile(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy