com.ibm.as400.util.commtrace.Format Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400 Show documentation
Show all versions of jt400 Show documentation
The Open Source version of the IBM Toolbox for Java
///////////////////////////////////////////////////////////////////////////////
//
// 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 - 2025 Weber Informatics LLC | Privacy Policy