com.ibm.as400.data.PcmlMessageLog 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: PcmlMessageLog.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) 1997-2000 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.data;
import java.io.*;
import java.util.Date;
import com.ibm.as400.access.Trace; // @A2A
/**
* Provides control over logging and tracing activity within this
* package. PcmlMessageLog
can be used to redirect error logging to a
* specific log file or OutputStream
. It is also used
* to suppress the low level information/error messages normally written
* to the console.
*/
public class PcmlMessageLog
{
private static OutputStream m_outputStream;
private static StringBuffer m_cp37Table;
static
{
m_cp37Table = new StringBuffer(256);
for (int i = 0; i < 256; i++)
{
m_cp37Table.append('.');
}
m_cp37Table.setCharAt(0x40, ' '); m_cp37Table.setCharAt(0x4b, '.'); m_cp37Table.setCharAt(0x4c, '<');
m_cp37Table.setCharAt(0x4d, '('); m_cp37Table.setCharAt(0x4e, '+'); m_cp37Table.setCharAt(0x50, '&');
m_cp37Table.setCharAt(0x5a, '!'); m_cp37Table.setCharAt(0x5b, '$'); m_cp37Table.setCharAt(0x5c, '*');
m_cp37Table.setCharAt(0x5d, ')'); m_cp37Table.setCharAt(0x5e, ';'); m_cp37Table.setCharAt(0x60, '-');
m_cp37Table.setCharAt(0x61, '/'); m_cp37Table.setCharAt(0x6a, '|'); m_cp37Table.setCharAt(0x6b, ',');
m_cp37Table.setCharAt(0x6c, '%'); m_cp37Table.setCharAt(0x6d, '_'); m_cp37Table.setCharAt(0x6e, '>');
m_cp37Table.setCharAt(0x6f, '?'); m_cp37Table.setCharAt(0x79, '`'); m_cp37Table.setCharAt(0x7a, ':');
m_cp37Table.setCharAt(0x7b, '#'); m_cp37Table.setCharAt(0x7c, '@'); m_cp37Table.setCharAt(0x7d, '\'');
m_cp37Table.setCharAt(0x7e, '='); m_cp37Table.setCharAt(0x7f, '"');
m_cp37Table.setCharAt(0x81, 'a'); m_cp37Table.setCharAt(0x82, 'b'); m_cp37Table.setCharAt(0x83, 'c');
m_cp37Table.setCharAt(0x84, 'd'); m_cp37Table.setCharAt(0x85, 'e'); m_cp37Table.setCharAt(0x86, 'f');
m_cp37Table.setCharAt(0x87, 'g'); m_cp37Table.setCharAt(0x88, 'h'); m_cp37Table.setCharAt(0x89, 'i');
m_cp37Table.setCharAt(0x91, 'j'); m_cp37Table.setCharAt(0x92, 'k'); m_cp37Table.setCharAt(0x93, 'l');
m_cp37Table.setCharAt(0x94, 'm'); m_cp37Table.setCharAt(0x95, 'n'); m_cp37Table.setCharAt(0x96, 'o');
m_cp37Table.setCharAt(0x97, 'p'); m_cp37Table.setCharAt(0x98, 'q'); m_cp37Table.setCharAt(0x99, 'r');
m_cp37Table.setCharAt(0xa2, 's'); m_cp37Table.setCharAt(0xa3, 't'); m_cp37Table.setCharAt(0xa4, 'u');
m_cp37Table.setCharAt(0xa5, 'v'); m_cp37Table.setCharAt(0xa6, 'w'); m_cp37Table.setCharAt(0xa7, 'x');
m_cp37Table.setCharAt(0xa8, 'y'); m_cp37Table.setCharAt(0xa9, 'z'); m_cp37Table.setCharAt(0xc1, 'A');
m_cp37Table.setCharAt(0xc2, 'B'); m_cp37Table.setCharAt(0xc3, 'C'); m_cp37Table.setCharAt(0xc4, 'D');
m_cp37Table.setCharAt(0xc5, 'E'); m_cp37Table.setCharAt(0xc6, 'F'); m_cp37Table.setCharAt(0xc7, 'G');
m_cp37Table.setCharAt(0xc8, 'H'); m_cp37Table.setCharAt(0xc9, 'I'); m_cp37Table.setCharAt(0xd1, 'J');
m_cp37Table.setCharAt(0xd2, 'K'); m_cp37Table.setCharAt(0xd3, 'L'); m_cp37Table.setCharAt(0xd4, 'M');
m_cp37Table.setCharAt(0xd5, 'N'); m_cp37Table.setCharAt(0xd6, 'O'); m_cp37Table.setCharAt(0xd7, 'P');
m_cp37Table.setCharAt(0xd8, 'Q'); m_cp37Table.setCharAt(0xd9, 'R'); m_cp37Table.setCharAt(0xe2, 'S');
m_cp37Table.setCharAt(0xe3, 'T'); m_cp37Table.setCharAt(0xe4, 'U'); m_cp37Table.setCharAt(0xe5, 'V');
m_cp37Table.setCharAt(0xe6, 'W'); m_cp37Table.setCharAt(0xe7, 'X'); m_cp37Table.setCharAt(0xe8, 'Y');
m_cp37Table.setCharAt(0xe9, 'Z');
m_cp37Table.setCharAt(0xf0, '0'); m_cp37Table.setCharAt(0xf1, '1'); m_cp37Table.setCharAt(0xf2, '2');
m_cp37Table.setCharAt(0xf3, '3'); m_cp37Table.setCharAt(0xf4, '4'); m_cp37Table.setCharAt(0xf5, '5');
m_cp37Table.setCharAt(0xf6, '6'); m_cp37Table.setCharAt(0xf7, '7'); m_cp37Table.setCharAt(0xf8, '8');
m_cp37Table.setCharAt(0xf9, '9');
}
static void main(String[] args)
throws IOException
{
FileOutputStream logStream = null;
try
{
setTraceEnabled(true);
Trace.setTraceErrorOn(true);
logError("This is a test error to the console");
traceOut("Message to stdout");
traceErr("Message to stderr");
traceOut("Test dump of byte array: " + toHexString(new byte[] {0, 1, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32} ) );
Trace.log(Trace.PCML, "Test dump of byte array: " + toHexString(new byte[] {0, 1, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32} ) );
byte[] bytes = new byte[Byte.MAX_VALUE - Byte.MIN_VALUE + 1];
for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++)
{
bytes[b - Byte.MIN_VALUE] = b;
}
bytes[Byte.MAX_VALUE - Byte.MIN_VALUE] = Byte.MAX_VALUE;
dumpBytes(bytes);
setLogFileName("pcml.log");
logError("This is a test error to pcml.log");
logStream = new FileOutputStream("user.log");
setLogStream(logStream);
logError("This is a test error to user.log with throwable", new IllegalArgumentException("test exception"));
setLogFileName(null);
logError("This is a test error back to the console");
setTraceEnabled(false);
Trace.log(Trace.PCML, "Message to stdout should not be sent");
Trace.setTraceErrorOn(false);
Trace.log(Trace.ERROR, "Message to stderr should not be sent");
System.out.println("Test complete!");
}
catch (Throwable e) { e.printStackTrace(); }
finally {
if (logStream != null) {
try { logStream.close(); }
catch (Exception e) { e.printStackTrace(); }
}
}
}
// Prevent the user from constructing a PcmlMessageLog object
private PcmlMessageLog() {}
/**
* Sets the log file name.
*
* If the file exists, error data is appended to it.
* If the file does not exist, it is created.
*
* @deprecated Replaced by com.ibm.as400.access.Trace.setFileName(String fileName).
*
* @param fileName the log file name. If null, output goes to System.err
.
* @exception IOException if the file cannot be accessed
* @see #getLogFileName
*/
public static void setLogFileName(String fileName)
throws IOException
{
Trace.setFileName(fileName); // @A2A
}
/**
* Returns the log file name.
*
* Returns null if errors are being logged to System.err
, or if
* an OutputStream
was specified on a call to setLogStream
.
*
* @deprecated Replaced by com.ibm.as400.access.Trace.getFileName().
*
* @return the log file name
* @see #setLogFileName
* @see #setLogStream
*/
public static String getLogFileName()
{
return Trace.getFileName();
}
/**
* Sets the log stream.
*
* This method allows applications to redirect errors generated
* by this package to the same OutputStream
used by the
* application itself for logging errors.
*
* @deprecated Replaced by com.ibm.as400.access.Trace.setPrintWriter(PrintWriter obj).
*
* @param stream the OutputStream
to which error data should be sent.
* If null, output goes to System.err
.
* @see #getLogStream
*/
public static void setLogStream(OutputStream stream)
{
PrintWriter logTarget = null;
if (stream != null)
{
m_outputStream = stream;
logTarget = new PrintWriter(stream, true);
}
else
{
m_outputStream = System.err;
logTarget = new PrintWriter(System.err, true);
}
try
{
Trace.setPrintWriter(logTarget); // @A2A
}
catch (IOException e) // @A2A
{ Trace.log(Trace.ERROR, e); }
}
/**
* Returns the log stream.
*
* This method is guaranteed to return a valid non-null OutputStream
.
*
* @deprecated Replaced by com.ibm.as400.access.Trace.getPrintWriter().
*
* @return the OutputStream
to which error data is being sent
* @see #setLogStream
*/
public static OutputStream getLogStream()
{
return m_outputStream;
}
/**
* Logs an error string to the current logging destination.
*
* The string will be prepended with a header containing a
* date and timestamp if logging has been redirected to
* a destination other than System.err
.
*
* @deprecated Replaced by com.ibm.as400.access.Trace.log(int category, String message).
*
* @param errorData the data to be logged
*/
public static void logError(Object errorData)
{
Trace.log(Trace.ERROR, errorData.toString()); // @A2A
}
/**
* Logs an error string and a stack trace to the current logging destination.
*
* The string will be prepended with a header containing a
* date and timestamp if logging has been redirected to
* a destination other than System.err
.
*
* @deprecated Replaced by com.ibm.as400.access.Trace.log(int category, String message, Throwable e).
*
* @param errorData the data to be logged
* @param t the Throwable
which will be used to obtain the stack trace
*/
public static void logError(Object errorData, Throwable t)
{
Trace.log(Trace.ERROR, errorData.toString(), t);
}
/**
* Logs a stack trace to the current logging destination.
*
* @deprecated Use java.lang.Throwable.printStackTrace(PrintWriter w).
*
* @param t the Throwable
which will be used to obtain the stack trace
*/
public static void printStackTrace(Throwable t)
{
PrintWriter logTarget = Trace.getPrintWriter();
logTarget.println("Stack trace:");
t.printStackTrace(logTarget);
}
/**
* Controls whether low level trace messages will be written to the console.
*
* The default value is true
.
*
* @deprecated Replaced by com.ibm.as400.access.Trace.setTracePCMLOn(boolean tracePCML).
*
* @param enabled If true, allows the messages; otherwise, suppresses the messages.
* @see #isTraceEnabled
*/
public static void setTraceEnabled(boolean enabled)
{
Trace.setTracePCMLOn(enabled); // @A2C
if (enabled) // @A4A
{
Trace.setTraceOn(enabled); // @A4A
}
}
/**
* Determines whether low level trace messages will be written to the console.
*
* The default value is true
.
*
* @deprecated Replaced by com.ibm.as400.access.Trace.isTracePCMLOn().
*
* @return true if the messages are allowed; false otherwise.
* @see #setTraceEnabled
*/
public static boolean isTraceEnabled()
{
return Trace.isTracePCMLOn(); // @A2C
}
/**
* Writes data to System.out
if low level tracing is enabled.
*
* @deprecated This method does nothing. Replaced by com.ibm.as400.access.Trace.log(int category, String message).
*
* @param data the data to be logged
* @see #traceErr
*/
public static void traceOut(Object data)
{
//if (m_traceEnabled)
// System.out.println(data);
}
/**
* Writes data to System.err
if low level tracing is enabled.
*
* @deprecated This method does nothing. Replaced by com.ibm.as400.access.Trace.log(int category, String message).
*
* @param data the data to be logged
* @see #traceOut
*/
public static void traceErr(Object data)
{
//if (m_traceEnabled)
// System.err.println(data);
}
static void traceParameter(String program, String parmName, byte[] bytes) // @A1C
{
if (Trace.isTracePCMLOn()) // @A2C
{
Trace.log(Trace.PCML, program + "\t " + parmName); // @A2C
dumpBytes(bytes);
}
}
private static void dumpBytes(byte[] ba)
{
if (ba == null || ba.length == 0)
return;
int arrayLength = ba.length;
int offset = 0;
StringBuffer cp37Str = new StringBuffer();
StringBuffer byteString = new StringBuffer();
while (offset < arrayLength)
{
if ((offset % 32) == 0)
{
if (offset == 0)
{
Trace.log(Trace.PCML, "Offset : 0....... 4....... 8....... C....... 0....... 4....... 8....... C....... 0...4...8...C...0...4...8...C..."); // @A2C
}
else
{
byteString.append(" *");
byteString.append(cp37Str.toString());
byteString.append("*");
Trace.log(Trace.PCML, byteString.toString()); // @A2C
cp37Str.setLength(0);
byteString.setLength(0);
}
String offStr = " " + Integer.toHexString(offset);
offStr = offStr.substring(offStr.length() - 6);
byteString.append(offStr);
byteString.append(" : ");
}
byteString.append(toHexString(ba, offset, 4));
byteString.append(" ");
cp37Str.append(toCP37String(ba, offset, 4));
offset = offset + 4;
}
if (offset > 0)
{
// Add more blanks for the case where the number of bytes
// was not a multiple of four. In this case, offset
// 'overshot' the number of bytes.
for (int b = arrayLength; b < offset; b++)
{
byteString.append(" ");
cp37Str.append(" ");
}
// Now pad the line to a multiple of 32 bytes so the
// character dump on the right side is lined up.
while ((offset % 32) != 0)
{
byteString.append(" ");
cp37Str.append(" ");
offset = offset + 4;
}
byteString.append(" *");
byteString.append(cp37Str.toString());
byteString.append("*");
Trace.log(Trace.PCML, byteString.toString()); // @A2C
byteString.setLength(0);
cp37Str.setLength(0);
}
}
// Converts a sequence of EBCDIC bytes to a Unicode string.
private static String toCP37String(byte[] ba, int index, int length)
{
if (ba == null || ba.length == 0 || index < 0 || index >= ba.length)
return "";
int arrayLength = ba.length;
int endIndex;
if (index + length <= arrayLength)
endIndex = index + length - 1;
else
endIndex = arrayLength - 1;
StringBuffer cp37String = new StringBuffer(endIndex-index+1);
for (int b = index; b <= endIndex; b++)
{
if (ba[b] < 0)
{
cp37String.append( m_cp37Table.charAt(256 + ba[b]) );
}
else
{
cp37String.append( m_cp37Table.charAt(ba[b]) );
}
}
return cp37String.toString();
}
static String toHexString(byte[] ba)
{
if (ba == null)
return "";
else
return toHexString(ba, 0, ba.length);
}
static String toHexString(byte[] ba, int index, int length)
{
if (ba == null || ba.length == 0 || index < 0 || index >= ba.length)
return "";
int arrayLength = ba.length;
int endIndex;
if (index + length <= arrayLength)
endIndex = index + length - 1;
else
endIndex = arrayLength - 1;
StringBuffer hexString = new StringBuffer((endIndex-index+1)*2);
for (int b = index; b <= endIndex; b++)
{
hexString.append(Trace.toHexString(ba[b]));
}
return hexString.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy