mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2026-03-17 00:00:06 -04:00
1758 lines
69 KiB
Java
Executable File
1758 lines
69 KiB
Java
Executable File
/****************************************************
|
|
* *
|
|
* (c) 2000-2003 TwelveMonkeys *
|
|
* All rights reserved *
|
|
* http://www.twelvemonkeys.no *
|
|
* *
|
|
* $RCSfile: DebugUtil.java,v $
|
|
* @version $Revision: #2 $
|
|
* $Date: 2009/06/19 $
|
|
* *
|
|
* @author Last modified by: $Author: haku $
|
|
* *
|
|
****************************************************/
|
|
|
|
|
|
|
|
/*
|
|
* Produced (p) 2002 TwelveMonkeys
|
|
* Address : Svovelstikka 1, Box 6432 Etterstad, 0605 Oslo, Norway.
|
|
* Phone : +47 22 57 70 00
|
|
* Fax : +47 22 57 70 70
|
|
*/
|
|
package com.twelvemonkeys.util;
|
|
|
|
|
|
import com.twelvemonkeys.lang.StringUtil;
|
|
|
|
import java.io.PrintStream;
|
|
import java.lang.reflect.Constructor;
|
|
import java.lang.reflect.Field;
|
|
import java.lang.reflect.Method;
|
|
import java.lang.reflect.Modifier;
|
|
import java.text.DateFormat;
|
|
import java.util.*;
|
|
|
|
|
|
/**
|
|
* A utility class to simplify debugging.
|
|
* This includes viewing generic data structures, printing timestamps, printing object info and more...
|
|
* <i>NB! Only use this class for instrumentation purposes</i>
|
|
* <p>
|
|
* @author <a href="mailto:eirik.torske@twelvemonkeys.no">Eirik Torske</a>
|
|
*/
|
|
@Deprecated
|
|
public class DebugUtil {
|
|
|
|
// Constants
|
|
|
|
/** Field PRINTSTREAM_IS_NULL_ERROR_MESSAGE */
|
|
public static final String PRINTSTREAM_IS_NULL_ERROR_MESSAGE = "PrintStream is null";
|
|
|
|
/** Field OBJECT_IS_NULL_ERROR_MESSAGE */
|
|
public static final String OBJECT_IS_NULL_ERROR_MESSAGE = "Object is null";
|
|
|
|
/** Field INTARRAY_IS_NULL_ERROR_MESSAGE */
|
|
public static final String INTARRAY_IS_NULL_ERROR_MESSAGE = "int array is null";
|
|
|
|
/** Field STRINGARRAY_IS_NULL_ERROR_MESSAGE */
|
|
public static final String STRINGARRAY_IS_NULL_ERROR_MESSAGE = "String array is null";
|
|
|
|
/** Field ENUMERATION_IS_NULL_ERROR_MESSAGE */
|
|
public static final String ENUMERATION_IS_NULL_ERROR_MESSAGE = "Enumeration is null";
|
|
|
|
/** Field COLLECTION_IS_NULL_ERROR_MESSAGE */
|
|
public static final String COLLECTION_IS_NULL_ERROR_MESSAGE = "Collection is null";
|
|
|
|
/** Field COLLECTION_IS_EMPTY_ERROR_MESSAGE */
|
|
public static final String COLLECTION_IS_EMPTY_ERROR_MESSAGE = "Collection contains no elements";
|
|
|
|
/** Field MAP_IS_NULL_ERROR_MESSAGE */
|
|
public static final String MAP_IS_NULL_ERROR_MESSAGE = "Map is null";
|
|
|
|
/** Field MAP_IS_EMPTY_ERROR_MESSAGE */
|
|
public static final String MAP_IS_EMPTY_ERROR_MESSAGE = "Map contains no elements";
|
|
|
|
/** Field PROPERTIES_IS_NULL_ERROR_MESSAGE */
|
|
public static final String PROPERTIES_IS_NULL_ERROR_MESSAGE = "Properties is null";
|
|
|
|
/** Field PROPERTIES_IS_EMPTY_ERROR_MESSAGE */
|
|
public static final String PROPERTIES_IS_EMPTY_ERROR_MESSAGE = "Properties contains no elements";
|
|
|
|
/** Field CALENDAR_IS_NULL_ERROR_MESSAGE */
|
|
public static final String CALENDAR_IS_NULL_ERROR_MESSAGE = "Calendar is null";
|
|
|
|
/** Field CALENDAR_CAUSATION_ERROR_MESSAGE */
|
|
public static final String CALENDAR_CAUSATION_ERROR_MESSAGE = "The causation of the calendars is wrong";
|
|
|
|
/** Field TIMEDIFFERENCES_IS_NULL_ERROR_MESSAGE */
|
|
public static final String TIMEDIFFERENCES_IS_NULL_ERROR_MESSAGE = "Inner TimeDifference object is null";
|
|
|
|
/** Field TIMEDIFFERENCES_WRONG_DATATYPE_ERROR_MESSAGE */
|
|
public static final String TIMEDIFFERENCES_WRONG_DATATYPE_ERROR_MESSAGE =
|
|
"Element in TimeDifference collection is not a TimeDifference object";
|
|
|
|
/** Field DEBUG */
|
|
public static final String DEBUG = "**** external debug: ";
|
|
|
|
/** Field INFO */
|
|
public static final String INFO = "**** external info: ";
|
|
|
|
/** Field WARNING */
|
|
public static final String WARNING = "**** external warning: ";
|
|
|
|
/** Field ERROR */
|
|
public static final String ERROR = "**** external error: ";
|
|
|
|
/**
|
|
* Builds a prefix message to be used in front of <i>info</i> messages for identification purposes.
|
|
* The message format is:
|
|
* <pre>
|
|
* **** external info: [timestamp] [class name]:
|
|
* </pre>
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be debugged. If the object ia a {@code java.lang.String} object, it is assumed that it is the class name given directly.
|
|
* @return a prefix for an info message.
|
|
*/
|
|
public static String getPrefixInfoMessage(final Object pObject) {
|
|
|
|
StringBuilder buffer = new StringBuilder();
|
|
|
|
buffer.append(INFO);
|
|
buffer.append(getTimestamp());
|
|
buffer.append(" ");
|
|
if (pObject == null) {
|
|
buffer.append("[unknown class]");
|
|
} else {
|
|
if (pObject instanceof String) {
|
|
buffer.append((String) pObject);
|
|
} else {
|
|
buffer.append(getClassName(pObject));
|
|
}
|
|
}
|
|
buffer.append(": ");
|
|
return buffer.toString();
|
|
}
|
|
|
|
/**
|
|
* Builds a prefix message to be used in front of <i>debug</i> messages for identification purposes.
|
|
* The message format is:
|
|
* <pre>
|
|
* **** external debug: [timestamp] [class name]:
|
|
* </pre>
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be debugged. If the object ia a {@code java.lang.String} object, it is assumed that it is the class name given directly.
|
|
* @return a prefix for a debug message.
|
|
*/
|
|
public static String getPrefixDebugMessage(final Object pObject) {
|
|
|
|
StringBuilder buffer = new StringBuilder();
|
|
|
|
buffer.append(DEBUG);
|
|
buffer.append(getTimestamp());
|
|
buffer.append(" ");
|
|
if (pObject == null) {
|
|
buffer.append("[unknown class]");
|
|
} else {
|
|
if (pObject instanceof String) {
|
|
buffer.append((String) pObject);
|
|
} else {
|
|
buffer.append(getClassName(pObject));
|
|
}
|
|
}
|
|
buffer.append(": ");
|
|
return buffer.toString();
|
|
}
|
|
|
|
/**
|
|
* Builds a prefix message to be used in front of <i>warning</i> messages for identification purposes.
|
|
* The message format is:
|
|
* <pre>
|
|
* **** external warning: [timestamp] [class name]:
|
|
* </pre>
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be debugged. If the object ia a {@code java.lang.String} object, it is assumed that it is the class name given directly.
|
|
* @return a prefix for a warning message.
|
|
*/
|
|
public static String getPrefixWarningMessage(final Object pObject) {
|
|
|
|
StringBuilder buffer = new StringBuilder();
|
|
|
|
buffer.append(WARNING);
|
|
buffer.append(getTimestamp());
|
|
buffer.append(" ");
|
|
if (pObject == null) {
|
|
buffer.append("[unknown class]");
|
|
} else {
|
|
if (pObject instanceof String) {
|
|
buffer.append((String) pObject);
|
|
} else {
|
|
buffer.append(getClassName(pObject));
|
|
}
|
|
}
|
|
buffer.append(": ");
|
|
return buffer.toString();
|
|
}
|
|
|
|
/**
|
|
* Builds a prefix message to be used in front of <i>error</i> messages for identification purposes.
|
|
* The message format is:
|
|
* <pre>
|
|
* **** external error: [timestamp] [class name]:
|
|
* </pre>
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be debugged. If the object ia a {@code java.lang.String} object, it is assumed that it is the class name given directly.
|
|
* @return a prefix for an error message.
|
|
*/
|
|
public static String getPrefixErrorMessage(final Object pObject) {
|
|
|
|
StringBuilder buffer = new StringBuilder();
|
|
|
|
buffer.append(ERROR);
|
|
buffer.append(getTimestamp());
|
|
buffer.append(" ");
|
|
if (pObject == null) {
|
|
buffer.append("[unknown class]");
|
|
} else {
|
|
if (pObject instanceof String) {
|
|
buffer.append((String) pObject);
|
|
} else {
|
|
buffer.append(getClassName(pObject));
|
|
}
|
|
}
|
|
buffer.append(": ");
|
|
return buffer.toString();
|
|
}
|
|
|
|
/**
|
|
* The "default" method that invokes a given method of an object and prints the results to a {@code java.io.PrintStream}.<br>
|
|
* The method for invocation must have no formal parameters. If the invoking method does not exist, the {@code toString()} method is called.
|
|
* The {@code toString()} method of the returning object is called.
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be printed.
|
|
* @param pMethodName a {@code java.lang.String} holding the name of the method to be invoked.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
*/
|
|
public static void printDebug(final Object pObject, final String pMethodName, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
if (pObject == null) {
|
|
pPrintStream.println(OBJECT_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
if (!StringUtil.isEmpty(pMethodName)) {
|
|
try {
|
|
Method objectMethod = pObject.getClass().getMethod(pMethodName, null);
|
|
Object retVal = objectMethod.invoke(pObject, null);
|
|
|
|
if (retVal != null) {
|
|
printDebug(retVal, null, pPrintStream);
|
|
} else {
|
|
throw new Exception();
|
|
}
|
|
} catch (Exception e) {
|
|
|
|
// Default
|
|
pPrintStream.println(pObject.toString());
|
|
}
|
|
} else { // Ultimate default
|
|
pPrintStream.println(pObject.toString());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prints the object's {@code toString()} method to a {@code java.io.PrintStream}.
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be printed.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
*/
|
|
public static void printDebug(final Object pObject, final PrintStream pPrintStream) {
|
|
printDebug(pObject, null, pPrintStream);
|
|
}
|
|
|
|
/**
|
|
* Prints the object's {@code toString()} method to {@code System.out}.
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be printed.
|
|
*/
|
|
public static void printDebug(final Object pObject) {
|
|
printDebug(pObject, System.out);
|
|
}
|
|
|
|
/**
|
|
* Prints a line break.
|
|
*/
|
|
public static void printDebug() {
|
|
System.out.println();
|
|
}
|
|
|
|
/**
|
|
* Prints a primitive {@code boolean} to {@code System.out}.
|
|
* <p>
|
|
* @param pBoolean the {@code boolean} to be printed.
|
|
*/
|
|
public static void printDebug(final boolean pBoolean) {
|
|
printDebug(new Boolean(pBoolean).toString());
|
|
}
|
|
|
|
/**
|
|
* Prints a primitive {@code int} to {@code System.out}.
|
|
* <p>
|
|
*
|
|
* @param pInt
|
|
*/
|
|
public static void printDebug(final int pInt) {
|
|
printDebug(new Integer(pInt).toString());
|
|
}
|
|
|
|
/**
|
|
* Prints the content of a {@code int[]} to a {@code java.io.PrintStream}.
|
|
* <p>
|
|
* @param pIntArray the {@code int[]} to be printed.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
*/
|
|
public static void printDebug(final int[] pIntArray, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
if (pIntArray == null) {
|
|
pPrintStream.println(INTARRAY_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
for (int i = 0; i < pIntArray.length; i++) {
|
|
pPrintStream.println(pIntArray[i]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prints the content of a {@code int[]} to {@code System.out}.
|
|
* <p>
|
|
* @param pIntArray the {@code int[]} to be printed.
|
|
*/
|
|
public static void printDebug(final int[] pIntArray) {
|
|
printDebug(pIntArray, System.out);
|
|
}
|
|
|
|
/**
|
|
* Prints a number of character check methods from the {@code java.lang.Character} class to a {@code java.io.PrintStream}.
|
|
* <p>
|
|
* @param pChar the {@code java.lang.char} to be debugged.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
*/
|
|
public static void printDebug(final char pChar, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
pPrintStream.println("Character.getNumericValue(pChar): " + Character.getNumericValue(pChar));
|
|
pPrintStream.println("Character.getType(pChar): " + Character.getType(pChar));
|
|
pPrintStream.println("pChar.hashCode(): " + new Character(pChar).hashCode());
|
|
pPrintStream.println("Character.isDefined(pChar): " + Character.isDefined(pChar));
|
|
pPrintStream.println("Character.isDigit(pChar): " + Character.isDigit(pChar));
|
|
pPrintStream.println("Character.isIdentifierIgnorable(pChar): " + Character.isIdentifierIgnorable(pChar));
|
|
pPrintStream.println("Character.isISOControl(pChar): " + Character.isISOControl(pChar));
|
|
pPrintStream.println("Character.isJavaIdentifierPart(pChar): " + Character.isJavaIdentifierPart(pChar));
|
|
pPrintStream.println("Character.isJavaIdentifierStart(pChar): " + Character.isJavaIdentifierStart(pChar));
|
|
pPrintStream.println("Character.isLetter(pChar): " + Character.isLetter(pChar));
|
|
pPrintStream.println("Character.isLetterOrDigit(pChar): " + Character.isLetterOrDigit(pChar));
|
|
pPrintStream.println("Character.isLowerCase(pChar): " + Character.isLowerCase(pChar));
|
|
pPrintStream.println("Character.isSpaceChar(pChar): " + Character.isSpaceChar(pChar));
|
|
pPrintStream.println("Character.isTitleCase(pChar): " + Character.isTitleCase(pChar));
|
|
pPrintStream.println("Character.isUnicodeIdentifierPart(pChar): " + Character.isUnicodeIdentifierPart(pChar));
|
|
pPrintStream.println("Character.isUnicodeIdentifierStart(pChar): " + Character.isUnicodeIdentifierStart(pChar));
|
|
pPrintStream.println("Character.isUpperCase(pChar): " + Character.isUpperCase(pChar));
|
|
pPrintStream.println("Character.isWhitespace(pChar): " + Character.isWhitespace(pChar));
|
|
pPrintStream.println("pChar.toString(): " + new Character(pChar).toString());
|
|
}
|
|
|
|
/**
|
|
* Prints a number of character check methods from the {@code java.lang.Character} class to {@code System.out}.
|
|
* <p>
|
|
* @param pChar the {@code java.lang.char} to be debugged.
|
|
*/
|
|
public static void printDebug(final char pChar) {
|
|
printDebug(pChar, System.out);
|
|
}
|
|
|
|
/**
|
|
* Prints the content of a {@code java.lang.String[]} to a {@code java.io.PrintStream}.
|
|
* <p>
|
|
* @param pStringArray the {@code java.lang.String[]} to be printed.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
*/
|
|
public static void printDebug(final String[] pStringArray, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
if (pStringArray == null) {
|
|
pPrintStream.println(STRINGARRAY_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
for (int i = 0; i < pStringArray.length; i++) {
|
|
pPrintStream.println(pStringArray[i]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prints the content of a {@code java.lang.String[]} to {@code System.out}.
|
|
* <p>
|
|
* @param pStringArray the {@code java.lang.String[]} to be printed.
|
|
*/
|
|
public static void printDebug(final String[] pStringArray) {
|
|
printDebug(pStringArray, System.out);
|
|
}
|
|
|
|
/**
|
|
* Invokes a given method of every element in a {@code java.util.Enumeration} and prints the results to a {@code java.io.PrintStream}.
|
|
* The method to be invoked must have no formal parameters.
|
|
* <p>
|
|
* If an exception is throwed during the method invocation, the element's {@code toString()} method is called.
|
|
* For bulk data types, recursive invocations and invocations of other methods in this class, are used.
|
|
* <p>
|
|
* @param pEnumeration the {@code java.util.Enumeration} to be printed.
|
|
* @param pMethodName a {@code java.lang.String} holding the name of the method to be invoked on each collection element.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Enumeration.html">{@code java.util.Enumeration}</a>
|
|
*/
|
|
public static void printDebug(final Enumeration pEnumeration, final String pMethodName, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
if (pEnumeration == null) {
|
|
pPrintStream.println(ENUMERATION_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
while (pEnumeration.hasMoreElements()) {
|
|
printDebug(pEnumeration.nextElement(), pMethodName, pPrintStream);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Invokes a given method of every element in a {@code java.util.Enumeration} and prints the results to a {@code java.io.PrintStream}.
|
|
* The method to be invoked must have no formal parameters.
|
|
* <p>
|
|
* If an exception is throwed during the method invocation, the element's {@code toString()} method is called.
|
|
* For bulk data types, recursive invocations and invocations of other methods in this class, are used.
|
|
* <p>
|
|
* @param pEnumeration the {@code java.util.Enumeration} to be printed.
|
|
* @param pMethodName a {@code java.lang.String} holding the name of the method to be invoked on each collection element.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Enumeration.html">{@code java.util.Enumeration}</a>
|
|
*/
|
|
public static void printDebug(final Enumeration pEnumeration, final String pMethodName) {
|
|
printDebug(pEnumeration, pMethodName, System.out);
|
|
}
|
|
|
|
/**
|
|
* Invokes a given method of every element in a {@code java.util.Enumeration} and prints the results to a {@code java.io.PrintStream}.
|
|
* The method to be invoked must have no formal parameters. The default is calling an element's {@code toString()} method.
|
|
* <p>
|
|
* If an exception is throwed during the method invocation, the element's {@code toString()} method is called.
|
|
* For bulk data types, recursive invocations and invocations of other methods in this class, are used.
|
|
* <p>
|
|
* @param pEnumeration the {@code java.util.Enumeration} to be printed.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Enumeration.html">{@code java.util.Enumeration}</a>
|
|
*/
|
|
public static void printDebug(final Enumeration pEnumeration) {
|
|
printDebug(pEnumeration, null, System.out);
|
|
}
|
|
|
|
/**
|
|
* Invokes a given method of every element in a {@code java.util.Collection} and prints the results to a {@code java.io.PrintStream}.
|
|
* The method to be invoked must have no formal parameters.
|
|
* <p>
|
|
* If an exception is throwed during the method invocation, the element's {@code toString()} method is called.
|
|
* For bulk data types, recursive invocations and invocations of other methods in this class, are used.
|
|
* <p>
|
|
* Be aware that the {@code Collection} interface embraces a large portion of the bulk data types in the {@code java.util} package,
|
|
* e.g. {@code List}, {@code Set}, {@code Vector} and {@code HashSet}.
|
|
* <p>
|
|
* For debugging of arrays, use the method <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Arrays.html#asList(java.lang.Object[])">{@code java.util.Arrays.asList(Object[])}</a> method for converting the object array to a list before calling this method.
|
|
* <p>
|
|
* @param pCollection the {@code java.util.Collection} to be printed.
|
|
* @param pMethodName a {@code java.lang.String} holding the name of the method to be invoked on each collection element.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Collection.html">{@code java.util.Collection}</a>
|
|
*/
|
|
public static void printDebug(final Collection pCollection, final String pMethodName, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
if (pCollection == null) {
|
|
pPrintStream.println(COLLECTION_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
} else if (pCollection.isEmpty()) {
|
|
pPrintStream.println(COLLECTION_IS_EMPTY_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
for (Iterator i = pCollection.iterator(); i.hasNext(); ) {
|
|
printDebug(i.next(), pMethodName, pPrintStream);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Invokes a given method of every element in a {@code java.util.Collection} and prints the results to {@code System.out}.
|
|
* The method to be invoked must have no formal parameters.
|
|
* <p>
|
|
* If an exception is throwed during the method invocation, the element's {@code toString()} method is called.
|
|
* For bulk data types, recursive invocations and invocations of other methods in this class, are used.
|
|
* <p>
|
|
* Be aware that the {@code Collection} interface embraces a large portion of the bulk data types in the {@code java.util} package,
|
|
* e.g. {@code List}, {@code Set}, {@code Vector} and {@code HashSet}.
|
|
* <p>
|
|
* For debugging of arrays, use the method <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Arrays.html#asList(java.lang.Object[])">{@code java.util.Arrays.asList(Object[])}</a> method for converting the object array to a list before calling this method.
|
|
* <p>
|
|
* @param pCollection the {@code java.util.Collection} to be printed.
|
|
* @param pMethodName a {@code java.lang.String} holding the name of the method to be invoked on each collection element.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Collection.html">{@code java.util.Collection}</a>
|
|
*/
|
|
public static void printDebug(final Collection pCollection, final String pMethodName) {
|
|
printDebug(pCollection, pMethodName, System.out);
|
|
}
|
|
|
|
/**
|
|
* Prints the content of a {@code java.util.Collection} to a {@code java.io.PrintStream}.
|
|
* <p>
|
|
* Not all data types are supported so far. The default is calling an element's {@code toString()} method.
|
|
* For bulk data types, recursive invocations and invocations of other methods in this class, are used.
|
|
* <p>
|
|
* Be aware that the {@code Collection} interface embraces a large portion of the bulk data types in the {@code java.util} package,
|
|
* e.g. {@code List}, {@code Set}, {@code Vector} and {@code HashSet}.
|
|
* <p>
|
|
* For debugging of arrays, use the method <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Arrays.html#asList(java.lang.Object[])">{@code java.util.Arrays.asList(Object[])}</a> method for converting the object array to a list before calling this method.
|
|
* <p>
|
|
* @param pCollection the {@code java.util.Collection} to be printed.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Collection.html">{@code java.util.Collection}</a>
|
|
*/
|
|
public static void printDebug(final Collection pCollection, final PrintStream pPrintStream) {
|
|
printDebug(pCollection, null, pPrintStream);
|
|
}
|
|
|
|
/**
|
|
* Prints the content of a {@code java.util.Collection} to {@code System.out}.
|
|
* <p>
|
|
* Not all data types are supported so far. The default is calling an element's {@code toString()} method.
|
|
* For bulk data types, recursive invocations and invocations of other methods in this class, are used.
|
|
* <p>
|
|
* Be aware that the {@code Collection} interface embraces a large portion of the bulk data types in the {@code java.util} package,
|
|
* e.g. {@code List}, {@code Set}, {@code Vector} and {@code HashSet}.
|
|
* <p>
|
|
* For debugging of arrays, use the method <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Arrays.html#asList(java.lang.Object[])">{@code java.util.Arrays.asList(Object[])}</a> method for converting the object array to a list before calling this method.
|
|
* <p>
|
|
* @param pCollection the {@code java.util.Collection} to be printed.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Collection.html">{@code java.util.Collection}</a>
|
|
*/
|
|
public static void printDebug(final Collection pCollection) {
|
|
printDebug(pCollection, System.out);
|
|
}
|
|
|
|
/**
|
|
* Invokes a given method of every object in a {@code java.util.Map} and prints the results to a {@code java.io.PrintStream}.
|
|
* The method called must have no formal parameters.
|
|
* <p>
|
|
* If an exception is throwed during the method invocation, the element's {@code toString()} method is called.
|
|
* For bulk data types, recursive invocations and invocations of other methods in this class, are used.
|
|
* <p>
|
|
* @param pMap the {@code java.util.Map} to be printed.
|
|
* @param pMethodName a {@code java.lang.String} holding the name of the method to be invoked on each mapped object.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Map.html">{@code java.util.Map}</a>
|
|
*/
|
|
public static void printDebug(final Map pMap, final String pMethodName, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
if (pMap == null) {
|
|
pPrintStream.println(MAP_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
} else if (pMap.isEmpty()) {
|
|
pPrintStream.println(MAP_IS_EMPTY_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
Object mKeyObject;
|
|
Object mEntryObject;
|
|
|
|
for (Iterator i = pMap.keySet().iterator(); i.hasNext(); ) {
|
|
mKeyObject = i.next();
|
|
mEntryObject = pMap.get(mKeyObject);
|
|
if ((mKeyObject instanceof String) && (mEntryObject instanceof String)) {
|
|
pPrintStream.println((String) mKeyObject + ": " + mEntryObject);
|
|
} else if ((mKeyObject instanceof String) && (mEntryObject instanceof List)) {
|
|
printDebug((List) mEntryObject, pPrintStream);
|
|
} else if ((mKeyObject instanceof String) && (mEntryObject instanceof Set)) {
|
|
printDebug((Set) mEntryObject, pPrintStream);
|
|
} else if (mKeyObject instanceof String) {
|
|
if (!StringUtil.isEmpty(pMethodName)) {
|
|
try {
|
|
Method objectMethod = mEntryObject.getClass().getMethod(pMethodName, null);
|
|
Object retVal = objectMethod.invoke(mEntryObject, null);
|
|
|
|
if (retVal != null) {
|
|
pPrintStream.println((String) mKeyObject + ": " + retVal.toString());
|
|
} else { // Default execution
|
|
throw new Exception();
|
|
}
|
|
} catch (Exception e) {
|
|
|
|
// Default
|
|
pPrintStream.println((String) mKeyObject + ": " + mEntryObject.toString());
|
|
}
|
|
} else { // Default
|
|
pPrintStream.println((String) mKeyObject + ": " + mEntryObject.toString());
|
|
}
|
|
} else if ((mKeyObject instanceof Integer) && (mEntryObject instanceof String)) {
|
|
pPrintStream.println((Integer) mKeyObject + ": " + mEntryObject);
|
|
} else if ((mKeyObject instanceof Integer) && (mEntryObject instanceof List)) {
|
|
printDebug((List) mEntryObject, pPrintStream);
|
|
} else if ((mKeyObject instanceof String) && (mEntryObject instanceof Set)) {
|
|
printDebug((Set) mEntryObject, pPrintStream);
|
|
} else if (mKeyObject instanceof Integer) {
|
|
if (!StringUtil.isEmpty(pMethodName)) {
|
|
try {
|
|
Method objectMethod = mEntryObject.getClass().getMethod(pMethodName, null);
|
|
Object retVal = objectMethod.invoke(mEntryObject, null);
|
|
|
|
if (retVal != null) {
|
|
pPrintStream.println((Integer) mKeyObject + ": " + retVal.toString());
|
|
} else { // Default execution
|
|
throw new Exception();
|
|
}
|
|
} catch (Exception e) {
|
|
|
|
// Default
|
|
pPrintStream.println((Integer) mKeyObject + ": " + mEntryObject.toString());
|
|
}
|
|
} else { // Default
|
|
pPrintStream.println((Integer) mKeyObject + ": " + mEntryObject.toString());
|
|
}
|
|
}
|
|
|
|
// More..
|
|
//else if
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Invokes a given method of every object in a {@code java.util.Map} to {@code System.out}.
|
|
* The method called must have no formal parameters.
|
|
* <p>
|
|
* If an exception is throwed during the method invocation, the element's {@code toString()} method is called.<br>
|
|
* For bulk data types, recursive invocations and invocations of other methods in this class, are used.
|
|
* <p>
|
|
* @param pMap the {@code java.util.Map} to be printed.
|
|
* @param pMethodName a {@code java.lang.String} holding the name of the method to be invoked on each mapped object.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Map.html">{@code java.util.Map}</a>
|
|
*/
|
|
public static void printDebug(final Map pMap, final String pMethodName) {
|
|
printDebug(pMap, pMethodName, System.out);
|
|
}
|
|
|
|
/**
|
|
* Prints the content of a {@code java.util.Map} to a {@code java.io.PrintStream}.
|
|
* <p>
|
|
* Not all data types are supported so far. The default is calling an element's {@code toString()} method.<br>
|
|
* For bulk data types, recursive invocations and invocations of other methods in this class, are used.
|
|
* <p>
|
|
* @param pMap the {@code java.util.Map} to be printed.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Map.html">{@code java.util.Map}</a>
|
|
*/
|
|
public static void printDebug(final Map pMap, final PrintStream pPrintStream) {
|
|
printDebug(pMap, null, pPrintStream);
|
|
}
|
|
|
|
/**
|
|
* Prints the content of a {@code java.util.Map} to {@code System.out}.
|
|
* <p>
|
|
* Not all data types are supported so far. The default is calling an element's {@code toString()} method.<br>
|
|
* For bulk data types, recursive invocations and invocations of other methods in this class, are used.
|
|
* <p>
|
|
* @param pMap the {@code java.util.Map} to be printed.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Map.html">{@code java.util.Map}</a>
|
|
*/
|
|
public static void printDebug(final Map pMap) {
|
|
printDebug(pMap, System.out);
|
|
}
|
|
|
|
/**
|
|
* Prints the content of a {@code java.util.Properties} to a {@code java.io.PrintStream}.
|
|
* <p>
|
|
* @param pProperties the {@code java.util.Properties} to be printed.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Properties.html">{@code java.util.Properties}</a>
|
|
*/
|
|
public static void printDebug(final Properties pProperties, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
if (pProperties == null) {
|
|
pPrintStream.println(PROPERTIES_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
} else if (pProperties.isEmpty()) {
|
|
pPrintStream.println(PROPERTIES_IS_EMPTY_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
for (Enumeration e = pProperties.propertyNames(); e.hasMoreElements(); ) {
|
|
String key = (String) e.nextElement();
|
|
|
|
pPrintStream.println(key + ": " + pProperties.getProperty(key));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prints the content of a {@code java.util.Properties} to {@code System.out}.
|
|
* <p>
|
|
* @param pProperties the {@code java.util.Properties} to be printed.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Properties.html">{@code java.util.Properties}</a>
|
|
*/
|
|
public static void printDebug(final Properties pProperties) {
|
|
printDebug(pProperties, System.out);
|
|
}
|
|
|
|
// Timestamp utilities
|
|
|
|
/**
|
|
* Prints out the calendar time.
|
|
* <p>
|
|
* @param pCalendar the {@code java.util.Calendar} object from which to extract the date information.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Calendar.html">{@code java.util.Calendar}</a>
|
|
*/
|
|
public static void printTimestamp(final Calendar pCalendar, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
pPrintStream.println(getTimestamp(pCalendar));
|
|
}
|
|
|
|
/**
|
|
* Prints out the system time.
|
|
* <p>
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/GregorianCalendar.html">{@code java.util.GregorianCalendar}</a>
|
|
*/
|
|
public static void printTimestamp(final PrintStream pPrintStream) {
|
|
|
|
GregorianCalendar cal = new GregorianCalendar();
|
|
|
|
printTimestamp(cal, pPrintStream);
|
|
}
|
|
|
|
/**
|
|
* Prints out the system time to {@code System.out}.
|
|
*/
|
|
public static void printTimestamp() {
|
|
printTimestamp(System.out);
|
|
}
|
|
|
|
/**
|
|
* Returns a presentation of the date based on the given milliseconds.
|
|
* <p>
|
|
* @param pMilliseconds The specified number of milliseconds since the standard base time known as "the epoch", namely January 1, 1970, 00:00:00 GMT.
|
|
* @return a presentation of the calendar time.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Calendar.html">{@code java.util.Calendar}</a>
|
|
*/
|
|
public static String getTimestamp(final String pMilliseconds) {
|
|
return getTimestamp(Long.parseLong(pMilliseconds));
|
|
}
|
|
|
|
/**
|
|
* Returns a presentation of the date based on the given milliseconds.
|
|
* <p>
|
|
* @param pMilliseconds The specified number of milliseconds since the standard base time known as "the epoch", namely January 1, 1970, 00:00:00 GMT.
|
|
* @return a presentation of the calendar time.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Calendar.html">{@code java.util.Calendar}</a>
|
|
*/
|
|
public static String getTimestamp(final long pMilliseconds) {
|
|
|
|
java.util.Date date = new java.util.Date(pMilliseconds);
|
|
java.util.Calendar calendar = new GregorianCalendar();
|
|
|
|
calendar.setTime(date);
|
|
return getTimestamp(calendar);
|
|
}
|
|
|
|
/**
|
|
* Returns a presentation of the given calendar's time.
|
|
* <p>
|
|
* @param pCalendar the {@code java.util.Calendar} object from which to extract the date information.
|
|
* @return a presentation of the calendar time.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Calendar.html">{@code java.util.Calendar}</a>
|
|
*/
|
|
public static String getTimestamp(final Calendar pCalendar) {
|
|
return buildTimestamp(pCalendar);
|
|
}
|
|
|
|
/**
|
|
* @return a presentation of the system time.
|
|
*/
|
|
public static String getTimestamp() {
|
|
|
|
GregorianCalendar cal = new GregorianCalendar();
|
|
|
|
return getTimestamp(cal);
|
|
}
|
|
|
|
/**
|
|
* Builds a presentation of the given calendar's time. This method contains the common timestamp format used in this class.
|
|
* @return a presentation of the calendar time.
|
|
*/
|
|
protected static String buildTimestamp(final Calendar pCalendar) {
|
|
|
|
if (pCalendar == null) {
|
|
return CALENDAR_IS_NULL_ERROR_MESSAGE;
|
|
}
|
|
|
|
// The timestamp format
|
|
StringBuilder timestamp = new StringBuilder();
|
|
|
|
//timestamp.append(DateUtil.getMonthName(new Integer(pCalendar.get(Calendar.MONTH)).toString(), "0", "us", "MEDIUM", false) + " ");
|
|
timestamp.append(DateFormat.getDateInstance(DateFormat.MEDIUM).format(pCalendar.getTime()));
|
|
|
|
//timestamp.append(pCalendar.get(Calendar.DAY_OF_MONTH) + " ");
|
|
timestamp.append(" ");
|
|
timestamp.append(StringUtil.pad(new Integer(pCalendar.get(Calendar.HOUR_OF_DAY)).toString(), 2, "0", true) + ":");
|
|
timestamp.append(StringUtil.pad(new Integer(pCalendar.get(Calendar.MINUTE)).toString(), 2, "0", true) + ":");
|
|
timestamp.append(StringUtil.pad(new Integer(pCalendar.get(Calendar.SECOND)).toString(), 2, "0", true) + ":");
|
|
timestamp.append(StringUtil.pad(new Integer(pCalendar.get(Calendar.MILLISECOND)).toString(), 3, "0", true));
|
|
return timestamp.toString();
|
|
}
|
|
|
|
/**
|
|
* Builds the time difference between two millisecond representations.
|
|
* <p>
|
|
* This method is to be used with small time intervals between 0 ms up to a couple of minutes.
|
|
* <p>
|
|
* @param pStartTime the start time.
|
|
* @param pEndTime the end time.
|
|
* @return the time difference in milliseconds.
|
|
*/
|
|
public static String buildTimeDifference(final long pStartTime, final long pEndTime) {
|
|
|
|
//return pEndTime - pStartTime;
|
|
StringBuilder retVal = new StringBuilder();
|
|
|
|
// The time difference in milliseconds
|
|
long timeDifference = pEndTime - pStartTime;
|
|
|
|
if (timeDifference < 1000) {
|
|
retVal.append(timeDifference);
|
|
retVal.append(" ms");
|
|
} else {
|
|
long seconds = timeDifference / 1000;
|
|
|
|
timeDifference = timeDifference % 1000;
|
|
retVal.append(seconds);
|
|
retVal.append("s ");
|
|
retVal.append(timeDifference);
|
|
retVal.append("ms");
|
|
}
|
|
|
|
//return retVal.toString() + " (original timeDifference: " + new String(new Long(pEndTime - pStartTime).toString()) + ")";
|
|
return retVal.toString();
|
|
}
|
|
|
|
/**
|
|
* Builds the time difference between the given time and present time.
|
|
* <p>
|
|
* This method is to be used with small time intervals between 0 ms up to a couple of minutes.
|
|
* <p>
|
|
* @param pStartTime the start time.
|
|
* @return the time difference in milliseconds.
|
|
*/
|
|
public static String buildTimeDifference(final long pStartTime) {
|
|
|
|
long presentTime = System.currentTimeMillis();
|
|
|
|
return buildTimeDifference(pStartTime, presentTime);
|
|
}
|
|
|
|
/**
|
|
* Prints out the difference between two millisecond representations.
|
|
* The start time is subtracted from the end time.
|
|
* <p>
|
|
* @param pStartTime the start time.
|
|
* @param pEndTime the end time.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
*/
|
|
public static void printTimeDifference(final long pStartTime, final long pEndTime, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
pPrintStream.println(buildTimeDifference(pStartTime, pEndTime));
|
|
}
|
|
|
|
/**
|
|
* Prints out the difference between two millisecond representations.
|
|
* The start time is subtracted from the end time.
|
|
* <p>
|
|
* @param pStartTime the start time.
|
|
* @param pEndTime the end time.
|
|
*/
|
|
public static void printTimeDifference(final long pStartTime, final long pEndTime) {
|
|
printTimeDifference(pStartTime, pEndTime, System.out);
|
|
}
|
|
|
|
/**
|
|
* Prints out the difference between the given time and present time.
|
|
* The start time is subtracted from the present time.
|
|
* <p>
|
|
* @param pStartTime the start time.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
*/
|
|
public static void printTimeDifference(final long pStartTime, final PrintStream pPrintStream) {
|
|
printTimeDifference(pStartTime, System.currentTimeMillis(), pPrintStream);
|
|
}
|
|
|
|
/**
|
|
* Prints out the difference between the given time and present time to {@code System.out}.
|
|
* The start time is subtracted from the present time.
|
|
* <p>
|
|
* usage:
|
|
* <pre>
|
|
* long startTime = System.currentTimeMillis();
|
|
* ...
|
|
* com.iml.oslo.eito.util.DebugUtil.printTimeDifference(startTime);
|
|
* </pre>
|
|
* <p>
|
|
* @param pStartTime the start time.
|
|
*/
|
|
public static void printTimeDifference(final long pStartTime) {
|
|
printTimeDifference(pStartTime, System.out);
|
|
}
|
|
|
|
/**
|
|
* Builds a string representing the difference between two calendar times.
|
|
* The first calendar object is subtracted from the second one.
|
|
* <p>
|
|
* This method is to be used with time intervals between 0 ms up to several hours.
|
|
* <p>
|
|
* @param pStartCalendar the first {@code java.util.Calendar}.
|
|
* @param pEndCalendar the second {@code java.util.Calendar}.
|
|
* @return a string representation of the time difference.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Calendar.html">{@code java.util.Calendar}</a>
|
|
*/
|
|
public static String buildTimeDifference(final Calendar pStartCalendar, final Calendar pEndCalendar) {
|
|
|
|
if (pStartCalendar == null) {
|
|
return CALENDAR_IS_NULL_ERROR_MESSAGE;
|
|
}
|
|
if (pEndCalendar == null) {
|
|
return CALENDAR_IS_NULL_ERROR_MESSAGE;
|
|
}
|
|
if (pEndCalendar.before(pStartCalendar)) {
|
|
return CALENDAR_CAUSATION_ERROR_MESSAGE;
|
|
}
|
|
int dateDiff = pEndCalendar.get(Calendar.DATE) - pStartCalendar.get(Calendar.DATE);
|
|
int hourDiff = pEndCalendar.get(Calendar.HOUR_OF_DAY) - pStartCalendar.get(Calendar.HOUR_OF_DAY);
|
|
int minuteDiff = pEndCalendar.get(Calendar.MINUTE) - pStartCalendar.get(Calendar.MINUTE);
|
|
int secondDiff = pEndCalendar.get(Calendar.SECOND) - pStartCalendar.get(Calendar.SECOND);
|
|
int milliSecondDiff = pEndCalendar.get(Calendar.MILLISECOND) - pStartCalendar.get(Calendar.MILLISECOND);
|
|
|
|
if (milliSecondDiff < 0) {
|
|
secondDiff--;
|
|
milliSecondDiff += 1000;
|
|
}
|
|
if (secondDiff < 0) {
|
|
minuteDiff--;
|
|
secondDiff += 60;
|
|
}
|
|
if (minuteDiff < 0) {
|
|
hourDiff--;
|
|
minuteDiff += 60;
|
|
}
|
|
while (dateDiff > 0) {
|
|
dateDiff--;
|
|
hourDiff += 24;
|
|
}
|
|
|
|
// Time difference presentation format
|
|
StringBuilder buffer = new StringBuilder();
|
|
|
|
if ((hourDiff == 0) && (minuteDiff == 0) && (secondDiff == 0)) {
|
|
buffer.append(milliSecondDiff);
|
|
buffer.append("ms");
|
|
} else if ((hourDiff == 0) && (minuteDiff == 0)) {
|
|
buffer.append(secondDiff);
|
|
buffer.append("s ");
|
|
buffer.append(milliSecondDiff);
|
|
buffer.append("ms");
|
|
} else if (hourDiff == 0) {
|
|
buffer.append(minuteDiff);
|
|
buffer.append("m ");
|
|
buffer.append(secondDiff);
|
|
buffer.append(",");
|
|
buffer.append(milliSecondDiff);
|
|
buffer.append("s");
|
|
} else {
|
|
buffer.append(hourDiff);
|
|
buffer.append("h ");
|
|
buffer.append(minuteDiff);
|
|
buffer.append("m ");
|
|
buffer.append(secondDiff);
|
|
buffer.append(",");
|
|
buffer.append(milliSecondDiff);
|
|
buffer.append("s");
|
|
}
|
|
return buffer.toString();
|
|
}
|
|
|
|
/**
|
|
* Prints out the difference between to calendar times.
|
|
* The first calendar object is subtracted from the second one.
|
|
* <p>
|
|
* @param pStartCalendar the first {@code java.util.Calendar}.
|
|
* @param pEndCalendar the second {@code java.util.Calendar}.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Calendar.html">{@code java.util.Calendar}</a>
|
|
*/
|
|
public static void printTimeDifference(final Calendar pStartCalendar, final Calendar pEndCalendar, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
pPrintStream.println(buildTimeDifference(pStartCalendar, pEndCalendar));
|
|
}
|
|
|
|
/**
|
|
* Prints out the difference between to calendar times two {@code System.out}.
|
|
* The first calendar object is subtracted from the second one.
|
|
* <p>
|
|
* @param pStartCalendar the first {@code java.util.Calendar}.
|
|
* @param pEndCalendar the second {@code java.util.Calendar}.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Calendar.html">{@code java.util.Calendar}</a>
|
|
*/
|
|
public static void printTimeDifference(final Calendar pStartCalendar, final Calendar pEndCalendar) {
|
|
printTimeDifference(pStartCalendar, pEndCalendar, System.out);
|
|
}
|
|
|
|
/**
|
|
* Prints out the difference between the given calendar time and present time.
|
|
* <p>
|
|
* @param pStartCalendar the {@code java.util.Calendar} to compare with present time.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Calendar.html">{@code java.util.Calendar}</a>
|
|
*/
|
|
public static void printTimeDifference(final Calendar pStartCalendar, final PrintStream pPrintStream) {
|
|
|
|
GregorianCalendar endCalendar = new GregorianCalendar();
|
|
|
|
printTimeDifference(pStartCalendar, endCalendar, pPrintStream);
|
|
}
|
|
|
|
/**
|
|
* Prints out the difference between the given calendar time and present time to {@code System.out}.
|
|
* <p>
|
|
* usage:
|
|
* <pre>
|
|
* GregorianCalendar startTime = new GregorianCalendar();
|
|
* ...
|
|
* com.iml.oslo.eito.util.DebugUtil.printTimeDifference(startTime);
|
|
* </pre>
|
|
* <p>
|
|
* @param pStartCalendar the {@code java.util.Calendar} to compare with present time.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/util/Calendar.html">{@code java.util.Calendar}</a>
|
|
*/
|
|
public static void printTimeDifference(final Calendar pStartCalendar) {
|
|
|
|
GregorianCalendar endCalendar = new GregorianCalendar();
|
|
|
|
printTimeDifference(pStartCalendar, endCalendar);
|
|
}
|
|
|
|
/**
|
|
* Prints out a {@code com.iml.oslo.eito.util.DebugUtil.TimeDifference} object.
|
|
* <p>
|
|
* @param pTimeDifference the {@code com.twelvemonkeys.util.DebugUtil.TimeDifference} to investigate.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
*/
|
|
public static void printTimeDifference(final TimeDifference pTimeDifference, final PrintStream pPrintStream) {
|
|
printTimeDifference(pTimeDifference.getStartCalendar(), pTimeDifference.getEndCalendar(), pPrintStream);
|
|
}
|
|
|
|
/**
|
|
* Prints out a {@code com.iml.oslo.eito.util.DebugUtil.TimeDifference} object to {@code System.out}.
|
|
* <p>
|
|
* @param pTimeDifference the {@code com.twelvemonkeys.util.DebugUtil.TimeDifference} to investigate.
|
|
*/
|
|
public static void printTimeDifference(final TimeDifference pTimeDifference) {
|
|
printTimeDifference(pTimeDifference.getStartCalendar(), pTimeDifference.getEndCalendar(), System.out);
|
|
}
|
|
|
|
/**
|
|
* A convenience class for embracing two {@code java.util.Calendar} objects.
|
|
* The class is used for building a collection of time differences according to the {@code printTimeAverage} method.
|
|
*/
|
|
public static class TimeDifference {
|
|
|
|
Calendar mStartCalendar;
|
|
Calendar mEndCalendar;
|
|
|
|
/**
|
|
* Constructor TimeDifference
|
|
*
|
|
*
|
|
*/
|
|
public TimeDifference() {}
|
|
|
|
/**
|
|
* Constructor TimeDifference
|
|
*
|
|
*
|
|
* @param pStartCalendar
|
|
* @param pEndCalendar
|
|
*
|
|
*/
|
|
public TimeDifference(final Calendar pStartCalendar, final Calendar pEndCalendar) {
|
|
this.mStartCalendar = pStartCalendar;
|
|
this.mEndCalendar = pEndCalendar;
|
|
}
|
|
|
|
/**
|
|
* Method setStartCalendar
|
|
*
|
|
*
|
|
* @param pStartCalendar
|
|
*
|
|
*/
|
|
public void setStartCalendar(Calendar pStartCalendar) {
|
|
this.mStartCalendar = pStartCalendar;
|
|
}
|
|
|
|
/**
|
|
* Method getStartCalendar
|
|
*
|
|
*
|
|
* @return
|
|
*
|
|
*/
|
|
public Calendar getStartCalendar() {
|
|
return this.mStartCalendar;
|
|
}
|
|
|
|
/**
|
|
* Method setEndCalendar
|
|
*
|
|
*
|
|
* @param pEndCalendar
|
|
*
|
|
*/
|
|
public void setEndCalendar(Calendar pEndCalendar) {
|
|
this.mEndCalendar = pEndCalendar;
|
|
}
|
|
|
|
/**
|
|
* Method getEndCalendar
|
|
*
|
|
*
|
|
* @return
|
|
*
|
|
*/
|
|
public Calendar getEndCalendar() {
|
|
return this.mEndCalendar;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prints out the average time difference from a collection of {@code com.twelvemonkeys.util.DebugUtil.TimeDifference} objects.
|
|
* <p>
|
|
*
|
|
* @param pTimeDifferences
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
*/
|
|
public static void printTimeAverage(final Collection pTimeDifferences, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
if (pTimeDifferences == null) {
|
|
pPrintStream.println(TIMEDIFFERENCES_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
Object o;
|
|
TimeDifference timeDifference;
|
|
Calendar startCalendar = null;
|
|
Calendar endCalendar = null;
|
|
Calendar totalStartCalendar = null;
|
|
Calendar totalEndCalendar = null;
|
|
long startCalendarMilliSeconds, endCalendarMilliSeconds;
|
|
List timeDifferenceList = new Vector();
|
|
Iterator i = pTimeDifferences.iterator();
|
|
|
|
if (i.hasNext()) {
|
|
o = i.next();
|
|
if (!(o instanceof TimeDifference)) {
|
|
pPrintStream.println(TIMEDIFFERENCES_WRONG_DATATYPE_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
timeDifference = (TimeDifference) o;
|
|
startCalendar = timeDifference.getStartCalendar();
|
|
totalStartCalendar = startCalendar;
|
|
endCalendar = timeDifference.getEndCalendar();
|
|
startCalendarMilliSeconds = startCalendar.getTime().getTime();
|
|
endCalendarMilliSeconds = endCalendar.getTime().getTime();
|
|
timeDifferenceList.add(new Long(endCalendarMilliSeconds - startCalendarMilliSeconds));
|
|
}
|
|
while (i.hasNext()) {
|
|
o = i.next();
|
|
if (!(o instanceof TimeDifference)) {
|
|
pPrintStream.println(TIMEDIFFERENCES_WRONG_DATATYPE_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
timeDifference = (TimeDifference) o;
|
|
startCalendar = timeDifference.getStartCalendar();
|
|
endCalendar = timeDifference.getEndCalendar();
|
|
startCalendarMilliSeconds = startCalendar.getTime().getTime();
|
|
endCalendarMilliSeconds = endCalendar.getTime().getTime();
|
|
timeDifferenceList.add(new Long(endCalendarMilliSeconds - startCalendarMilliSeconds));
|
|
}
|
|
totalEndCalendar = endCalendar;
|
|
int numberOfElements = timeDifferenceList.size();
|
|
long timeDifferenceElement;
|
|
long timeDifferenceSum = 0;
|
|
|
|
for (Iterator i2 = timeDifferenceList.iterator(); i2.hasNext(); ) {
|
|
timeDifferenceElement = ((Long) i2.next()).longValue();
|
|
timeDifferenceSum += timeDifferenceElement;
|
|
}
|
|
|
|
// Total elapsed time
|
|
String totalElapsedTime = buildTimeDifference(totalStartCalendar, totalEndCalendar);
|
|
|
|
// Time average presentation format
|
|
pPrintStream.println("Average time difference: " + timeDifferenceSum / numberOfElements + "ms (" + numberOfElements
|
|
+ " elements, total elapsed time: " + totalElapsedTime + ")");
|
|
}
|
|
|
|
/**
|
|
* Prints out the average time difference from a collection of {@code com.twelvemonkeys.util.DebugUtil.TimeDifference} objects to {@code System.out}.
|
|
* <p>
|
|
*
|
|
* @param pTimeDifferences
|
|
*/
|
|
public static void printTimeAverage(final Collection pTimeDifferences) {
|
|
printTimeAverage(pTimeDifferences, System.out);
|
|
}
|
|
|
|
// Reflective methods
|
|
|
|
/**
|
|
* Prints the top-wrapped class name of a {@code java.lang.Object} to a {@code java.io.PrintStream}.
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be printed.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/Class.html">{@code java.lang.Class}</a>
|
|
*/
|
|
public static void printClassName(final Object pObject, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
pPrintStream.println(getClassName(pObject));
|
|
}
|
|
|
|
/**
|
|
* Prints the top-wrapped class name of a {@code java.lang.Object} to {@code System.out}.
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be printed.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/Class.html">{@code java.lang.Class}</a>
|
|
*/
|
|
public static void printClassName(final Object pObject) {
|
|
printClassName(pObject, System.out);
|
|
}
|
|
|
|
/**
|
|
* Builds the top-wrapped class name of a {@code java.lang.Object}.
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be analysed.
|
|
* @return the object's class name.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/Class.html">{@code java.lang.Class}</a>
|
|
*/
|
|
public static String getClassName(final Object pObject) {
|
|
|
|
if (pObject == null) {
|
|
return OBJECT_IS_NULL_ERROR_MESSAGE;
|
|
}
|
|
return pObject.getClass().getName();
|
|
}
|
|
|
|
/**
|
|
* Prints javadoc-like, the top wrapped class fields and methods of a {@code java.lang.Object} to a {@code java.io.PrintStream}.
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be analysed.
|
|
* @param pObjectName the name of the object instance, for identification purposes.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/Class.html">{@code java.lang.Class}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Modifier.html">{@code java.lang.reflect.Modifier}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Field.html">{@code java.lang.reflect.Field}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Constructor.html">{@code java.lang.reflect.Constructor}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Method.html">{@code java.lang.reflect.Method}</a>
|
|
*/
|
|
public static void printClassDetails(final Object pObject, final String pObjectName, final PrintStream pPrintStream) {
|
|
|
|
if (pPrintStream == null) {
|
|
System.err.println(PRINTSTREAM_IS_NULL_ERROR_MESSAGE);
|
|
return;
|
|
}
|
|
pPrintStream.println(getClassDetails(pObject, pObjectName));
|
|
}
|
|
|
|
/**
|
|
* Prints javadoc-like, the top wrapped class fields and methods of a {@code java.lang.Object} to {@code System.out}.
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be analysed.
|
|
* @param pObjectName the name of the object instance, for identification purposes.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/Class.html">{@code java.lang.Class}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Modifier.html">{@code java.lang.reflect.Modifier}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Field.html">{@code java.lang.reflect.Field}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Constructor.html">{@code java.lang.reflect.Constructor}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Method.html">{@code java.lang.reflect.Method}</a>
|
|
*/
|
|
public static void printClassDetails(final Object pObject, final String pObjectName) {
|
|
printClassDetails(pObject, pObjectName, System.out);
|
|
}
|
|
|
|
/**
|
|
* Prints javadoc-like, the top wrapped class fields and methods of a {@code java.lang.Object} to {@code System.out}.
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be analysed.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/Class.html">{@code java.lang.Class}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Modifier.html">{@code java.lang.reflect.Modifier}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Field.html">{@code java.lang.reflect.Field}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Constructor.html">{@code java.lang.reflect.Constructor}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Method.html">{@code java.lang.reflect.Method}</a>
|
|
*/
|
|
public static void printClassDetails(final Object pObject) {
|
|
printClassDetails(pObject, null, System.out);
|
|
}
|
|
|
|
/**
|
|
* Prints javadoc-like, the top wrapped class fields and methods of a {@code java.lang.Object} to a {@code java.io.PrintStream}.
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be analysed.
|
|
* @param pPrintStream the {@code java.io.PrintStream} for flushing the results.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/Class.html">{@code java.lang.Class}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Modifier.html">{@code java.lang.reflect.Modifier}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Field.html">{@code java.lang.reflect.Field}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Constructor.html">{@code java.lang.reflect.Constructor}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Method.html">{@code java.lang.reflect.Method}</a>
|
|
*/
|
|
public static void printClassDetails(final Object pObject, final PrintStream pPrintStream) {
|
|
printClassDetails(pObject, null, pPrintStream);
|
|
}
|
|
|
|
/**
|
|
* Builds a javadoc-like presentation of the top wrapped class fields and methods of a {@code java.lang.Object}.
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be analysed.
|
|
* @return a listing of the object's class details.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/Class.html">{@code java.lang.Class}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Modifier.html">{@code java.lang.reflect.Modifier}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Field.html">{@code java.lang.reflect.Field}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Constructor.html">{@code java.lang.reflect.Constructor}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Method.html">{@code java.lang.reflect.Method}</a>
|
|
*/
|
|
public static String getClassDetails(final Object pObject) {
|
|
return getClassDetails(pObject, null);
|
|
}
|
|
|
|
/**
|
|
* Builds a javadoc-like presentation of the top wrapped class fields and methods of a {@code java.lang.Object}.
|
|
* <p>
|
|
* @param pObject the {@code java.lang.Object} to be analysed.
|
|
* @param pObjectName the name of the object instance, for identification purposes.
|
|
* @return a listing of the object's class details.
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/Class.html">{@code java.lang.Class}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Modifier.html">{@code java.lang.reflect.Modifier}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Field.html">{@code java.lang.reflect.Field}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Constructor.html">{@code java.lang.reflect.Constructor}</a>
|
|
* @see <a href="http://java.sun.com/products/jdk/1.3/docs/api/java/lang/reflect/Method.html">{@code java.lang.reflect.Method}</a>
|
|
*/
|
|
public static String getClassDetails(final Object pObject, final String pObjectName) {
|
|
|
|
if (pObject == null) {
|
|
return OBJECT_IS_NULL_ERROR_MESSAGE;
|
|
}
|
|
final String endOfLine = System.getProperty("line.separator");
|
|
final String dividerLine = "---------------------------------------------------------";
|
|
Class c = pObject.getClass();
|
|
StringTokenizer tokenizedString;
|
|
String str;
|
|
String className = new String();
|
|
String superClassName = new String();
|
|
StringBuilder buffer = new StringBuilder();
|
|
|
|
// Heading
|
|
buffer.append(endOfLine);
|
|
buffer.append("**** class details");
|
|
if (!StringUtil.isEmpty(pObjectName)) {
|
|
buffer.append(" for \"" + pObjectName + "\"");
|
|
}
|
|
buffer.append(" ****");
|
|
buffer.append(endOfLine);
|
|
|
|
// Package
|
|
Package p = c.getPackage();
|
|
|
|
if (p != null) {
|
|
buffer.append(p.getName());
|
|
}
|
|
buffer.append(endOfLine);
|
|
|
|
// Class or Interface
|
|
if (c.isInterface()) {
|
|
buffer.append("I n t e r f a c e ");
|
|
} else {
|
|
buffer.append("C l a s s ");
|
|
}
|
|
str = c.getName();
|
|
tokenizedString = new StringTokenizer(str, ".");
|
|
while (tokenizedString.hasMoreTokens()) {
|
|
className = tokenizedString.nextToken().trim();
|
|
}
|
|
str = new String();
|
|
char[] charArray = className.toCharArray();
|
|
|
|
for (int i = 0; i < charArray.length; i++) {
|
|
str += charArray[i] + " ";
|
|
}
|
|
buffer.append(str);
|
|
buffer.append(endOfLine);
|
|
buffer.append(endOfLine);
|
|
|
|
// Class Hierarch
|
|
List classNameList = new Vector();
|
|
|
|
classNameList.add(c.getName());
|
|
Class superclass = c.getSuperclass();
|
|
|
|
while (superclass != null) {
|
|
classNameList.add(superclass.getName());
|
|
superclass = superclass.getSuperclass();
|
|
}
|
|
Object[] classNameArray = classNameList.toArray();
|
|
int counter = 0;
|
|
|
|
for (int i = classNameArray.length - 1; i >= 0; i--) {
|
|
for (int j = 0; j < counter; j++) {
|
|
buffer.append(" ");
|
|
}
|
|
if (counter > 0) {
|
|
buffer.append("|");
|
|
buffer.append(endOfLine);
|
|
}
|
|
for (int j = 0; j < counter; j++) {
|
|
buffer.append(" ");
|
|
}
|
|
if (counter > 0) {
|
|
buffer.append("+-");
|
|
}
|
|
buffer.append((String) classNameArray[i]);
|
|
buffer.append(endOfLine);
|
|
counter++;
|
|
}
|
|
|
|
// Divider
|
|
buffer.append(endOfLine);
|
|
buffer.append(dividerLine);
|
|
buffer.append(endOfLine);
|
|
buffer.append(endOfLine);
|
|
|
|
// Profile
|
|
int classModifier = c.getModifiers();
|
|
|
|
buffer.append(Modifier.toString(classModifier) + " ");
|
|
if (c.isInterface()) {
|
|
buffer.append("Interface ");
|
|
} else {
|
|
buffer.append("Class ");
|
|
}
|
|
buffer.append(className);
|
|
buffer.append(endOfLine);
|
|
if ((classNameArray != null) && (classNameArray[classNameArray.length - 2] != null)) {
|
|
str = (String) classNameArray[classNameArray.length - 2];
|
|
tokenizedString = new StringTokenizer(str, ".");
|
|
while (tokenizedString.hasMoreTokens()) {
|
|
superClassName = tokenizedString.nextToken().trim();
|
|
}
|
|
buffer.append("extends " + superClassName);
|
|
buffer.append(endOfLine);
|
|
}
|
|
if (!c.isInterface()) {
|
|
Class[] interfaces = c.getInterfaces();
|
|
|
|
if ((interfaces != null) && (interfaces.length > 0)) {
|
|
buffer.append("implements ");
|
|
str = interfaces[0].getName();
|
|
tokenizedString = new StringTokenizer(str, ".");
|
|
while (tokenizedString.hasMoreTokens()) {
|
|
str = tokenizedString.nextToken().trim();
|
|
}
|
|
buffer.append(str);
|
|
for (int i = 1; i < interfaces.length; i++) {
|
|
str = interfaces[i].getName();
|
|
tokenizedString = new StringTokenizer(str, ".");
|
|
while (tokenizedString.hasMoreTokens()) {
|
|
str = tokenizedString.nextToken().trim();
|
|
}
|
|
buffer.append(", " + str);
|
|
}
|
|
buffer.append(endOfLine);
|
|
}
|
|
}
|
|
|
|
// Divider
|
|
buffer.append(endOfLine);
|
|
buffer.append(dividerLine);
|
|
buffer.append(endOfLine);
|
|
buffer.append(endOfLine);
|
|
|
|
// Fields
|
|
buffer.append("F I E L D S U M M A R Y");
|
|
buffer.append(endOfLine);
|
|
Field[] fields = c.getFields();
|
|
|
|
if (fields != null) {
|
|
for (int i = 0; i < fields.length; i++) {
|
|
buffer.append(Modifier.toString(fields[i].getType().getModifiers()) + " ");
|
|
str = fields[i].getType().getName();
|
|
tokenizedString = new StringTokenizer(str, ".");
|
|
while (tokenizedString.hasMoreTokens()) {
|
|
str = tokenizedString.nextToken().trim();
|
|
}
|
|
buffer.append(str + " ");
|
|
buffer.append(fields[i].getName());
|
|
buffer.append(endOfLine);
|
|
}
|
|
}
|
|
buffer.append(endOfLine);
|
|
|
|
// Constructors
|
|
buffer.append("C O N S T R U C T O R S U M M A R Y");
|
|
buffer.append(endOfLine);
|
|
Constructor[] constructors = c.getConstructors();
|
|
|
|
if (constructors != null) {
|
|
for (int i = 0; i < constructors.length; i++) {
|
|
buffer.append(className + "(");
|
|
Class[] parameterTypes = constructors[i].getParameterTypes();
|
|
|
|
if (parameterTypes != null) {
|
|
if (parameterTypes.length > 0) {
|
|
str = parameterTypes[0].getName();
|
|
tokenizedString = new StringTokenizer(str, ".");
|
|
while (tokenizedString.hasMoreTokens()) {
|
|
str = tokenizedString.nextToken().trim();
|
|
}
|
|
buffer.append(str);
|
|
for (int j = 1; j < parameterTypes.length; j++) {
|
|
str = parameterTypes[j].getName();
|
|
tokenizedString = new StringTokenizer(str, ".");
|
|
while (tokenizedString.hasMoreTokens()) {
|
|
str = tokenizedString.nextToken().trim();
|
|
}
|
|
buffer.append(", " + str);
|
|
}
|
|
}
|
|
}
|
|
buffer.append(")");
|
|
buffer.append(endOfLine);
|
|
}
|
|
}
|
|
buffer.append(endOfLine);
|
|
|
|
// Methods
|
|
buffer.append("M E T H O D S U M M A R Y");
|
|
buffer.append(endOfLine);
|
|
Method[] methods = c.getMethods();
|
|
|
|
if (methods != null) {
|
|
for (int i = 0; i < methods.length; i++) {
|
|
buffer.append(Modifier.toString(methods[i].getModifiers()) + " ");
|
|
str = methods[i].getReturnType().getName();
|
|
tokenizedString = new StringTokenizer(str, ".");
|
|
while (tokenizedString.hasMoreTokens()) {
|
|
str = tokenizedString.nextToken().trim();
|
|
}
|
|
buffer.append(str + " ");
|
|
buffer.append(methods[i].getName() + "(");
|
|
Class[] parameterTypes = methods[i].getParameterTypes();
|
|
|
|
if ((parameterTypes != null) && (parameterTypes.length > 0)) {
|
|
if (parameterTypes[0] != null) {
|
|
str = parameterTypes[0].getName();
|
|
tokenizedString = new StringTokenizer(str, ".");
|
|
while (tokenizedString.hasMoreTokens()) {
|
|
str = tokenizedString.nextToken().trim();
|
|
}
|
|
|
|
// array bugfix
|
|
if (str.charAt(str.length() - 1) == ';') {
|
|
str = str.substring(0, str.length() - 1) + "[]";
|
|
}
|
|
buffer.append(str);
|
|
for (int j = 1; j < parameterTypes.length; j++) {
|
|
str = parameterTypes[j].getName();
|
|
tokenizedString = new StringTokenizer(str, ".");
|
|
while (tokenizedString.hasMoreTokens()) {
|
|
str = tokenizedString.nextToken().trim();
|
|
}
|
|
buffer.append(", " + str);
|
|
}
|
|
}
|
|
}
|
|
buffer.append(")");
|
|
buffer.append(endOfLine);
|
|
}
|
|
}
|
|
buffer.append(endOfLine);
|
|
|
|
// Ending
|
|
buffer.append("**** class details");
|
|
if (!StringUtil.isEmpty(pObjectName)) {
|
|
buffer.append(" for \"" + pObjectName + "\"");
|
|
}
|
|
buffer.append(" end ****");
|
|
buffer.append(endOfLine);
|
|
return buffer.toString();
|
|
}
|
|
|
|
/**
|
|
* Prettyprints a large number.
|
|
* <p>
|
|
*
|
|
* @param pBigNumber
|
|
* @return prettyprinted number with dot-separation each 10e3.
|
|
*/
|
|
public static String getLargeNumber(final long pBigNumber) {
|
|
|
|
StringBuilder buffer = new StringBuilder(new Long(pBigNumber).toString());
|
|
char[] number = new Long(pBigNumber).toString().toCharArray();
|
|
int reverseIndex = 0;
|
|
|
|
for (int i = number.length; i >= 0; i--) {
|
|
reverseIndex++;
|
|
if ((reverseIndex % 3 == 0) && (i > 1)) {
|
|
buffer = buffer.insert(i - 1, '.');
|
|
}
|
|
}
|
|
return buffer.toString();
|
|
}
|
|
|
|
/**
|
|
* Prettyprints milliseconds to ?day(s) ?h ?m ?s ?ms.
|
|
* <p>
|
|
*
|
|
* @param pMilliseconds
|
|
* @return prettyprinted time duration.
|
|
*/
|
|
public static String getTimeInterval(final long pMilliseconds) {
|
|
|
|
long timeIntervalMilliseconds = pMilliseconds;
|
|
long timeIntervalSeconds = 0;
|
|
long timeIntervalMinutes = 0;
|
|
long timeIntervalHours = 0;
|
|
long timeIntervalDays = 0;
|
|
boolean printMilliseconds = true;
|
|
boolean printSeconds = false;
|
|
boolean printMinutes = false;
|
|
boolean printHours = false;
|
|
boolean printDays = false;
|
|
final long MILLISECONDS_IN_SECOND = 1000;
|
|
final long MILLISECONDS_IN_MINUTE = 60 * MILLISECONDS_IN_SECOND; // 60000
|
|
final long MILLISECONDS_IN_HOUR = 60 * MILLISECONDS_IN_MINUTE; // 3600000
|
|
final long MILLISECONDS_IN_DAY = 24 * MILLISECONDS_IN_HOUR; // 86400000
|
|
StringBuilder timeIntervalBuffer = new StringBuilder();
|
|
|
|
// Days
|
|
if (timeIntervalMilliseconds >= MILLISECONDS_IN_DAY) {
|
|
timeIntervalDays = timeIntervalMilliseconds / MILLISECONDS_IN_DAY;
|
|
timeIntervalMilliseconds = timeIntervalMilliseconds % MILLISECONDS_IN_DAY;
|
|
printDays = true;
|
|
printHours = true;
|
|
printMinutes = true;
|
|
printSeconds = true;
|
|
}
|
|
|
|
// Hours
|
|
if (timeIntervalMilliseconds >= MILLISECONDS_IN_HOUR) {
|
|
timeIntervalHours = timeIntervalMilliseconds / MILLISECONDS_IN_HOUR;
|
|
timeIntervalMilliseconds = timeIntervalMilliseconds % MILLISECONDS_IN_HOUR;
|
|
printHours = true;
|
|
printMinutes = true;
|
|
printSeconds = true;
|
|
}
|
|
|
|
// Minutes
|
|
if (timeIntervalMilliseconds >= MILLISECONDS_IN_MINUTE) {
|
|
timeIntervalMinutes = timeIntervalMilliseconds / MILLISECONDS_IN_MINUTE;
|
|
timeIntervalMilliseconds = timeIntervalMilliseconds % MILLISECONDS_IN_MINUTE;
|
|
printMinutes = true;
|
|
printSeconds = true;
|
|
}
|
|
|
|
// Seconds
|
|
if (timeIntervalMilliseconds >= MILLISECONDS_IN_SECOND) {
|
|
timeIntervalSeconds = timeIntervalMilliseconds / MILLISECONDS_IN_SECOND;
|
|
timeIntervalMilliseconds = timeIntervalMilliseconds % MILLISECONDS_IN_SECOND;
|
|
printSeconds = true;
|
|
}
|
|
|
|
// Prettyprint
|
|
if (printDays) {
|
|
timeIntervalBuffer.append(timeIntervalDays);
|
|
if (timeIntervalDays > 1) {
|
|
timeIntervalBuffer.append("days ");
|
|
} else {
|
|
timeIntervalBuffer.append("day ");
|
|
}
|
|
}
|
|
if (printHours) {
|
|
timeIntervalBuffer.append(timeIntervalHours);
|
|
timeIntervalBuffer.append("h ");
|
|
}
|
|
if (printMinutes) {
|
|
timeIntervalBuffer.append(timeIntervalMinutes);
|
|
timeIntervalBuffer.append("m ");
|
|
}
|
|
if (printSeconds) {
|
|
timeIntervalBuffer.append(timeIntervalSeconds);
|
|
timeIntervalBuffer.append("s ");
|
|
}
|
|
if (printMilliseconds) {
|
|
timeIntervalBuffer.append(timeIntervalMilliseconds);
|
|
timeIntervalBuffer.append("ms");
|
|
}
|
|
return timeIntervalBuffer.toString();
|
|
}
|
|
}
|
|
|
|
|
|
/*--- Formatted in Sun Java Convention Style on ma, des 1, '03 ---*/
|
|
|
|
|
|
/*------ Formatted by Jindent 3.23 Basic 1.0 --- http://www.jindent.de ------*/
|