|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object com.cleancode.data.Diagnostic
public class Diagnostic
Provides configurable diagnostic logging of several message types to several output channels.
// initialize import ...Data.Diagnostic; Diagnostic.init(...); diag = new Diagnostic(myClassName); VERSION = Version.getVersion(myClassName, "$Revision: 9 $"); // for specific trails diag.enter(); // at top of a method diag.leave(); // at bottom of a method diag.create(); // in a constructor // for general information diag.print("me", "checking " + itemName); diag.print("me", PARAM_LIST); diag.warnPrint("field '" + itemName + "' not in library"); diag.errPrint("fatal error: " + errCode); // for wrap-up diag.print("me", Diagnostic.getWarnCount() + " warning(s)"); diag.print("me", Diagnostic.getErrCount() + " error(s)"); Diagnostic.exit();In a nutshell:
Each class that you wish to use
diagnostics must have one or more Diagnostic
objects--
each with its own diagnostic level--and be instrumented appropriately.
What gets output and where it goes (that is, which specific diagnostics and
which channels) is configurable from either the command-line or from a
configuration file (or both), using an InputOptions
object.
This section discusses how to quickly convert an existing module to use diagnostics; the following sections provide much more detail.
Create one or more diagnostic objects per module:
diag = new Diagnostic();
Change your System.err.println
statements
to errPrint
or warnPrint
method calls...
System.err.println(msg) => diag.errPrint(msg);
...and your regular print statements to print
method calls...
if (DEBUG) print msg (or similar) => diag.print($msg);
Initialize the Diagnostic package in your main program (more detail on how to construct a parameter list follows the step-by-step section):
Diagnostic.init(); // for errors and warnings only --OR-- Diagnostic.init(this); // for diags for this package --OR-- Diagnostic.init("pkg1","pkg2",...); // for diags for listed packages --OR-- Diagnostic.init("pkg1",["v1",...]); // for variants of pkg1 diag --OR-- Diagnostic.init($settings); // for more advanced uses
Finally, to avoid a warning from the diagnostic object itself, always
define your package's VERSION
variable.
diag = new Diagnostic(className); -- OR -- diag = new Diagnostic(this);
The latter version is perhaps slightly preferable in that
it does not need a hard-coded string.
But note that you only need one Diagnostic
object
per class (not per instance),
so it is recommended to assign it to a class variable.
You may actually want more than one Diagnostic
object,
but even so, they should still all be class objects.
Use the variant constructors for to create more than one:
diag = new Diagnostic(className, variant); -- OR -- diag = new Diagnostic(this, variant);
Instrument your code by placing enter
and
leave
method calls near the top and
bottom, respectively, of the methods (and constructors) to be traced.
Typically, use the no-argument form in constructors
(since they do not have a method name).
These methods will output
ENTER--->
and LEAVE--->
labels to the currently selected output channels. In addition, they will
indent (positively or negatively) subsequent messages to show
the call sequence nested.
The nesting prefix is configurable
via the TRACE_INDENT
property.
Instrument your code by placing create
method calls
near the top of each constructor (or bottom--just be consistent).
This method will output a message indicating creating an instance of the
owning class to the currently selected output channels.
Instrument your code by placing print
method calls
as needed to display static messages, variable values, etc.
This method will output an arbitrary message
to the currently selected output channels.
You may pass a string or an arbitrary object
(whose toString
method will be invoked).
Use warnPrint
and
errPrint
where appropriate.
This is an invaluable tool for locating system problems.
Say, for example, a program serves web pages.
It is not always appropriate to indicate
file system errors to the user nor to use System.err.print
,
but using errPrint
can also capture the message to a log file.
These methods will output an arbitrary message preceded with either a
WARNING:
or ERROR:
label.
Call the class method Version.getVersion(Object)
to extract a version
number from a version-control string, and to display it to the
currently selected output channels.
You are not required to use a configuration file--for simple situations it is not necessary; see discussion further on about this. If you're interested in diagnostics from multiple modules, or multiple diagnostics within a single module, then you'll probably want a configuration file.
Create a configuration file as described in the API
for the InputOptions
class.
Add properties used by Diagnostic
objects as listed below.
Also, add className_DIAG
properties
for each class you have instrumented.
See the discussion on Diagnostic Selection for further details.
In your program initialization,
invoke the init
method with a variety of parameter choices,
as shown in the introduction to this section above.
The selection of channels is made by
the OUTPUT_DIAG
and OUTPUT_ERR
properties from
the InputOptions
object.
See the table of InputOptions
for this class.
Each message type is shown in the table below along with the method used to generate it. The remaining two columns are explained following the table.
Message type | Method | Switch |
---|---|---|
warning | warnPrint |
WARNINGS_ON |
error | errPrint |
always output |
general | print |
className_DIAG |
object creation | create |
CREATE_DIAG or className_DIAG |
method trace | enter and leave |
TRACE_DIAG or className_DIAG |
class version | Version.getVersion |
VERSION_DIAG or className_DIAG |
server environment | -- |
ENV_DIAG |
Messages will print only when one of the switches
shown is active in the system diagnostic level mask.
Note that several messages have more than one switch;
those messages will print when either switch is active.
Thus, one has the option of seeing, for example,
create messages for all classes
by activating the CREATE_DIAG
switch, or of seeing all
messages for one class by activating its class switch.
The selection of active diagnostic switches is
the DIAG_LEVEL
property as explained below.
The key to seeing just what you want to see in the diagnostic output is
the diagnostic selection mask. First, in the configuration file
(or from the command-line) specify a InputOptions
property for DIAG_LEVEL
.
Each bit of DIAG_LEVEL
is an on/off switch.
Therefore, it is best to use a hexadecimal, rather than decimal,
representation where it is clear which bits are active. Example:
DIAG_LEVEL = 0x04000fffNext, define the diagnostic levels for the predefined
Diagnostic
switches. Example:
VERSION_DIAG = 0x40000000 CREATE_DIAG = 0x20000000 TRACE_DIAG = 0x10000000Then, define the diagnostic levels for any library classes you are using. These will be named
className_DIAG
.
Of course, you only need to do this if you care about
seeing diagnostics for them.
Any classes you do not explicitly define will get a default level of 1.
Therefore, it is best not to use the 1 bit for anything else, as you will
then get a lot of "noise". Example:
INPUTOPTIONS_DIAG = 0x08000000 // for InputOptions class DIAGNOSTIC_DIAG = 0x04000000 // for Diagnostic class URLCONNECTIONMGR_DIAG = 0x00800000 // for UrlConnectionMgr classFinally, define the diagnostic levels for any of your classes you have instrumented. As shown above, the diagnostic level properties are named with all capitals and a
_DIAG
suffix.
So, if you have a class named SomeClass
its corresponding diagnostic
level in the configuration file will be labelled SOMECLASS_DIAG
.
Generally, each level should be a single bit, but this is not mandated.
You could, for example, overlap bits to create a shorthand for seeing a
group of certain diagnostics.
If you have more than one Diagnostic
object in your module
(created with one of the variant constructors), you need to define a
diagnostic level for each one using the form
className_variant_DIAG
.
So if you created one with a variant "A" in module SomeClass, then you'll
also define SOMECLASS_A_DIAG
.
InputOptions properties used by this class |
|||
Property | Type | Default | Specifies... |
---|---|---|---|
OUTPUT_DIAG | int | OUTPUT_DIAG_LOGFILE |
output channels for regular (non-error and non-warning) messages |
OUTPUT_ERR | int | OUTPUT_DIAG_LOGFILE and OUTPUT_DIAG_STDERR |
output channels for error and warning messages |
DIAG_LEVEL | int | 0 | active diag levels for regular messages |
WARNINGS_ON | boolean | true |
display or suppress warning messages |
SHOW_THREAD | boolean | true |
show or hide thread name with each message |
TRACE_INDENT | String | 2 spaces | characters to indent at enter or leave calls |
LOG_DIR | String | log | directory in which to create log files |
LOG_DIAG_NAME | String | errors | base name of the error (and warning) log file |
LOG_ERR_NAME | String | diagnostics | base name of the diagnostic (non-error, non-warning) log file |
CREATE_DIAG | int | 1 | diag used to show all object creations |
TRACE_DIAG | int | 1 | diag used to show all trace messages |
VERSION_DIAG | int | 1 | diag used to show all class versions |
ENV_DIAG | int | 1 | diag used to show all system environment variables |
In order to provide the most robust and flexible diagnostic facility,
the Diagnostic class was designed so that objects may be created and used
before the class initialization -- and even the object initialization(!) --
has been performed.
The initialization is typically performed by passing an
InputOptions
object to init
(see below).
But you may not have the arguments for these methods available without
running some other code first.
So until the initialization is done, the Diagnostic
module
quietly collects all messages in a queue, retaining all parameters
of a message so that the diagnostic filters can be processed later.
The initialization process sets a variety of parameters from
the system configuration, including specifying the diagnostic mask,
the diagnostic levels for each module, and so forth.
It also finishes initializing each Diagnostic
object that has
been created since the program started.
Once initialization has completed, the message queue is processed,
sending each message to the appropriate channel for the appropriate levels
(or to the bit bucket if the message is not selected).
The initialization buffering is then disabled;
any subsequent Diagnostic
method calls are passed through immediately.
(Note that the secondary buffering controlled by setWebChannelBuffer
is completely independent; it may or may not buffer depending on your setting.)
In the interests of reasonable behavior, this initialization buffering
has some additional flexibility.
First, if you do not call init
, and
a library module prints a diagnostic warning or error message,
reasonable behavior dictates that the message should appear on STDERR,
as described in the next section.
So by the time your program ends, if you have not called init
,
any collected error/warning messages will be output to STDERR automatically.
Second, if there is a lot of diagnostic traffic, it would not be nice
to collect megabytes of messages which are never used.
So after 100 messages have been collected, init
is automatically
invoked in the "casual user" mode,
displays any collected errors/warnings, empties the buffer,
and thus any subsequent errors/warnings are displayed immediately.
Normal program sequence suggests that init
be called, passing it
an InputOptions
object,
before creating any Diagnostic
objects, since
configuration file settings are used by Diagnostic
objects.
But the casual user of my libraries, and perhaps of your libraries,
will create objects which do create Diagnostic objects without
any notion of a configuration file or of using InputOptions
.
That's okay; it's fine if init
is never called,
or is called with an InputOptions
object which uses
command-line parameters but no configuration file.
If a configuration file is not used, the following properties are
adjusted for more sensible use:
OUTPUT_DIAG is initialized to OUTPUT_DIAG_STDOUT
OUTPUT_ERR is initialized to OUTPUT_DIAG_STDERR
That is, log file output is disabled, and
if there are any errors or warnings to be printed along the way,
they will simply be output to STDERR, rather than quietly go into a log
file which the user/developer is not even aware of.
Other diagnostic messages may or may not be displayed, depending upon
your invocation of init
.
SHOW_THREAD is initialized to false
For any messages which are displayed, they will not show the thread, just
the plain message, again to keep things straightforward for the user.
To get started with creating your own InputOptions
object,
define a level for each Diagnostic
object you're interested in,
and set the diagnostic mask (DIAG_LEVEL
) to that level.
In the example, "2" is used. Any level will do as long as it is
not the default level for unassigned diagnostics (the value 1).
For a class named SomeClass, you would need only this:
private static final String[] diagOutputOn = { "SOMECLASS_DIAG=2", "DIAG_LEVEL=2" }; InputOptions settings = new InputOptions(diagOutputOn); Diagnostic.init(settings);Note that if that is all you wish to do, it can be done more simply with
But let's explore further.
Which output channels are selected? That is, what are the settings of the
OUTPUT_DIAG and OUTPUT_ERR properties?
Recall that normally the former would be just to the log file,
while the latter would be STDERR and the log file.
But, as described in the discussion above of running without
a configuration file, these will be automatically adjusted to point
only to STDOUT and STDERR, respectively.
Hence, you get to see the output just as if you'd used
System.out.println
and System.err.println
.
To tailor where the output goes, let's add to
the InputOptions
object.
Here we show regular and error output explicitly set (note that for clarity
I have left out package names on the variables in
the Diagnostic
namespace).
private static final String[] diagOutputOn = { "OUTPUT_DIAG="+Diagnostic.OUTPUT_DIAG_STDOUT, "OUTPUT_ERR="+ (Diagnostic.OUTPUT_DIAG_STDERR|Diagnostic.OUTPUT_DIAG_LOGFILE), "SOMECLASS_DIAG=2", "VERSION_DIAG=4", "DIAG_LEVEL=6" };
Several points to note:
Diagnostic output to the STDERR channel and to the log file channel
is sent to these destinations as encountered.
The STDOUT channel, however, may either be used for command line processing
or for CGI output for a web server.
Diagnostic
therefore provides web channel buffering
which you must enable
if you are generating CGI output. Otherwise, you may have diagnostic output
even before your HTTP headers, which will generate a server error.
Almost as bad, you might get diagnostic output interspersed with your
regular generated output.
Use the setWebChannelBuffer
method
with a true value to enable it.
From that point on, all output destined for the web channel will
be queued until such time you explicitly ask for it
via the output
method.
This allows you to insert the diagnostic output wherever you'd like
in your generated web page.
The output
method provides
some convenience features which depend
on the input you feed it; see the method description for more detail.
Once you call this method, the message queue is emptied, and
will then start collecting subsequent Diagnostic
output,
if any, from scratch.
Nested Class Summary | |
---|---|
static class |
Diagnostic.Test
A standalone test class to exercise the Diagnostic class. |
Field Summary | |
---|---|
static String |
CONSTRUCTOR
A label which specifies a constructor method, used as an argument to the print method. |
static String |
DEFAULT_LOG_DIAG_NAME
Default standard logging file prefix name. |
static String |
DEFAULT_LOG_DIR
Default directory for log output of diagnostics. |
static String |
DEFAULT_LOG_ERR_NAME
Default error/warning logging file prefix name. |
static String |
ERROR_LABEL
Constant label prefixing all error messages. |
static int |
OUTPUT_DIAG_LOGFILE
A bit switch directing output to a log file as plain text. |
static int |
OUTPUT_DIAG_STDERR
A bit switch directing output to STDERR as plain text. |
static int |
OUTPUT_DIAG_STDOUT
A bit switch directing output to STDOUT formatted as plain text. |
static int |
OUTPUT_DIAG_WEBPAGE
A bit switch directing output to STDOUT formatted as HTML. |
static ParamMap |
paramMap
The diagnostic parameters for the Diagnostic class itself. |
static String |
VERSION
Current version of this class. |
static String |
WARNING_LABEL
Constant label prefixing all warning messages. |
Constructor Summary | |
---|---|
Diagnostic(Object anObject)
Creates a Diagnostic object with the standard level for
the specified class. |
|
Diagnostic(Object anObject,
String variant)
Creates a Diagnostic object with a variation of
the standard level for the specified class. |
|
Diagnostic(String className)
Creates a Diagnostic object with the standard level for
the specified class. |
|
Diagnostic(String className,
String variant)
Creates a Diagnostic object with a variation of
the standard level for the specified class. |
Method Summary | |
---|---|
void |
create()
Prints a message indicating creation of an object of the owning class. |
void |
create(Object obj)
Prints a message indicating creation of an object of the specified class. |
void |
create(String supplementalMsg)
Prints a message indicating creation of an object of the owning class with a supplemental message. |
void |
enter()
Prints a message indicating entering a constructor of the owning class. |
void |
enter(String methodName)
Prints a message indicating entering a method of the owning class with a supplemental message. |
void |
enter(String methodName,
String supplementalMsg)
Prints a message indicating entering a method of the owning class. |
void |
errPrint(String msg)
Output an error message prefixed with the class name of the owning class. |
void |
errPrint(String methodName,
String msg)
Output an error message prefixed with a method name. |
static void |
exit()
Cleanup routine to close all active log streams. |
static void |
flush()
Flush all active log streams. |
static String |
formatTable(Object msgObj)
Formats a one- or two-dimensional table for display. |
String |
getClassName()
Returns the name of the owning class. |
String |
getDiagName()
Returns the name of the diagnostic for the class which created it. |
int |
getErrCount()
Return number of errors observed. |
int |
getWarnCount()
Returns number of warnings observed. |
boolean |
getWebPageEnabled()
Indicates whether either the standard or the error channels have specified the web page channel for output from the configuration settings. |
static void |
init()
Initializes the diagnostic system enabling only warnings and errors to STDERR. |
static void |
init(boolean enableAll)
Initializes the diagnostic system enabling all diagnostics for all classes. |
static void |
init(InputOptions mySettings)
Initializes the diagnostic system with custom settings. |
static void |
init(String className)
Initializes the diagnostic system enabling all diagnostics for the specified class. |
static void |
init(String[] classNames)
Initializes the diagnostic system enabling all diagnostics for all the specified classes. |
static void |
init(String className,
String variantChars)
Initializes the diagnostic system enabling selected diagnostics for the specified class. |
static void |
init(String className,
String[] variant)
Initializes the diagnostic system enabling selected diagnostics for the specified class. |
boolean |
isActive()
Indicates whether the Diagnostic is selected by
the current diagnostic level. |
void |
leave()
Prints a message indicating leaving a constructor of the owning class. |
void |
leave(String methodName)
Prints a message indicating leaving a method of the owning class with a supplemental message. |
void |
leave(String methodName,
String supplementalMsg)
Prints a message indicating leaving a method of the owning class. |
String |
output()
Retrieves the collected web channel output when web channel buffering is enabled. |
static String |
output(String webPage)
Retrieves the collected web channel output when web channel buffering is enabled. |
void |
print(Object msg)
Output an arbitrary message with no prefix. |
void |
print(String methodName,
Object msg)
Output an arbitrary message prefixed with the method name. |
void |
printVersion(String targetClassName,
String verString)
Prints the version number of the specified class. |
static void |
reset()
Resets diagnostics to initial conditions, allowing init() to be called again. |
static void |
setPendingLimit(int limit)
Changes the pending limit of messages before the Diagnostic system is auto-initialized. |
void |
setTerse(boolean terse)
Selects whether Map objects should be output in a terse or verbose format. |
static void |
setWebChannelBuffer(boolean boolValue)
Activates or deactivates the web channel buffer. |
void |
warnPrint(String msg)
Output a warning message prefixed with the class name of the owning class. |
void |
warnPrint(String methodName,
String msg)
Output a warning message prefixed with a method name. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
public static final int OUTPUT_DIAG_STDOUT
public static final int OUTPUT_DIAG_STDERR
public static final int OUTPUT_DIAG_WEBPAGE
public static final int OUTPUT_DIAG_LOGFILE
public static final String CONSTRUCTOR
print
method. The print
method displays the
calling method along with its message. A constructor, though, is not a
method, and thus doesn't have a method name. One may, of course, pass
any string for the method name, but passing this constant provides
consistency.
public static final String VERSION
public static ParamMap paramMap
public static final String DEFAULT_LOG_DIR
public static final String DEFAULT_LOG_DIAG_NAME
public static final String DEFAULT_LOG_ERR_NAME
public static final String WARNING_LABEL
public static final String ERROR_LABEL
Constructor Detail |
---|
public Diagnostic(Object anObject)
Diagnostic
object with the standard level for
the specified class.
The level className_DIAG
is retrieved
from the InputOptions
property list.
If a property for this class is not defined,
a default value of 1 is used.
This constructor is typically used when assigning to an
instance variable, passing this
as the first argument.
anObject
- the owning objectpublic Diagnostic(String className)
Diagnostic
object with the standard level for
the specified class.
The level className_DIAG
is retrieved
from the InputOptions
property list.
If a property for this class is not defined,
a default value of 1 is used.
This constructor is typically used in a class variable declaration,
as there's no this
object to pass.
className
- name of the calling classpublic Diagnostic(Object anObject, String variant)
Diagnostic
object with a variation of
the standard level for the specified class.
The level className_variation_DIAG
is retrieved from the InputOptions
property list.
If a property for this class is not defined,
a default value of 1 is used.
This constructor is typically used when assigning to an
instance variable, passing this
as the first argument.
anObject
- the owning objectvariant
- a label variation for the class diagnosticpublic Diagnostic(String className, String variant)
Diagnostic
object with a variation of
the standard level for the specified class.
The level className_variation_DIAG
is retrieved from the InputOptions
property list.
If a property for this class is not defined,
a default value of 1 is used.
This constructor is typically used in a class variable declaration,
as there's no this
object to pass.
className
- name of the calling classvariant
- a label variation for the class diagnosticMethod Detail |
---|
public static void init()
public static void init(boolean enableAll)
enableAll
is true.
enableAll
- flag indicating to enable all or none
of the regular messages.public static void init(String className)
init(String,String[])
.
className
- name of class to enable Diagnostics forpublic static void init(String className, String[] variant)
variant
array identifies a specific
variant which you would have created with the Diagnostic constructor.
See init(String,String)
for a convenience method
for the special case of one-character variants.
className
- name of class to enable Diagnostics forvariant
- array of variant specifiers for the named classpublic static void init(String className, String variantChars)
init(String,String[])
method where you are using
single-letter variants.
So each character in the variant
string designates
a variant created from the constructor. If you have a class "someClass"
and you created variants "A", "B", and "C",
you can use "A", "BC", "BAC", or other combinations
for variant
to enable the ones you are interested in.
className
- name of class to enable Diagnostics forvariantChars
- String of single-character variant specifiers
for the named classpublic static void init(String[] classNames)
classNames
- array of class names to enable Diagnostics forpublic static void init(InputOptions mySettings)
InputOptions
object,
this variation of init
provides the most flexibility.
The InputOptions
object handles
a configuration file and/or command-line arguments.
mySettings
- an InputOptions object with custom settingspublic static void reset()
public static void setPendingLimit(int limit)
limit
- limit of messages buffered before automatically
initializing Diagnostic class.public String getClassName()
public String getDiagName()
className_DIAG
or
className_variant_DIAG
, depending on the
constructor used.
public int getWarnCount()
public int getErrCount()
public boolean getWebPageEnabled()
public static void setWebChannelBuffer(boolean boolValue)
output
method.
See the Description for further details.
boolValue
- selects on or off state.public static String output(String webPage)
output()
signature simply returns it as a string for you
to place where you please.
This form, on the other hand, accepts your web page as
an input parameter, inserts the stored web channel output, and
returns the updated page.
The diagnostic text is inserted at the spot where
a place holder is found in your text (the string "<DIAG_OUTPUT>").
If no place holder is found, and the text is HTML, then
the diagnostic text is inserted just before the /body tag.
If it is not HTML, then the diagnostic text is just tacked onto the
end of your output.
webPage
- your fully-formed web page as a string with a placeholder
public String output()
output(String)
form, on the other hand,
inserts the stored web channel output into your pre-existing web page.
public static void flush()
public static void exit()
public boolean isActive()
Diagnostic
is selected by
the current diagnostic level.
That is, the Diagnostic was created to respond to a
particular diagnostic switch.
The global DIAG_LEVEL
property specifies
all the switches which are active for this program invocation.
If this Diagnostic's level is one of the active switches,
true is returned.
Diagnostic
is selectedpublic void printVersion(String targetClassName, String verString)
Version
class
so one does not normally need to call it.
targetClassName
- name of calling classverString
- RCS version stringpublic void create(String supplementalMsg)
supplementalMsg
- a supplemental message to tack
on to the standard messagepublic void create()
general create method
public void create(Object obj)
obj
- Owning object to print diagnostic about.general create method
public void enter(String methodName, String supplementalMsg)
enter
and leave
should be balanced
to properly show indentation.
methodName
- name of calling methodsupplementalMsg
- a supplemental message to tack
on to the standard messageleave
public void enter()
general enter method
public void enter(String methodName)
methodName
- name of calling methodgeneral enter method
public void leave(String methodName, String supplementalMsg)
enter
and leave
should be balanced
to properly show indentation.
methodName
- name of calling methodsupplementalMsg
- a supplemental message to tack
on to the standard messageenter
public void leave()
general leave method
public void leave(String methodName)
methodName
- name of calling methodgeneral leave method
public void print(String methodName, Object msg)
methodName
- name of calling methodmsg
- message to printpublic void print(Object msg)
print(String,Object)
form in that it will not prefix the
message with any caller information; it just outputs the unadorned
message.
msg
- message to printpublic void warnPrint(String methodName, String msg)
methodName
- name of calling methodmsg
- message to printpublic void warnPrint(String msg)
warnPrint(String,String)
form.
msg
- message to printpublic void errPrint(String methodName, String msg)
methodName
- name of calling methodmsg
- message to printpublic void errPrint(String msg)
errPrint(String,String)
form.
msg
- message to printpublic void setTerse(boolean terse)
terse
- boolean indicating terse state.public static String formatTable(Object msgObj)
msgObj
- table to format for display.
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
CleanCode Java Libraries | Copyright © 2001-2012 Michael Sorens - Revised 2012.12.10 |