[izpack-changes] r1775 - izpack-src/trunk/src/lib/com/izforge/izpack/util
noreply at berlios.de
noreply at berlios.de
Fri Mar 9 15:58:53 CET 2007
Author: bartzkau
Date: 2007-03-09 15:58:53 +0100 (Fri, 09 Mar 2007)
New Revision: 1775
Added:
izpack-src/trunk/src/lib/com/izforge/izpack/util/Log.java
izpack-src/trunk/src/lib/com/izforge/izpack/util/LogError.java
izpack-src/trunk/src/lib/com/izforge/izpack/util/LogMessage.java
izpack-src/trunk/src/lib/com/izforge/izpack/util/LogWarning.java
Log:
New logging stuff (from Elmar).
Added: izpack-src/trunk/src/lib/com/izforge/izpack/util/Log.java
===================================================================
--- izpack-src/trunk/src/lib/com/izforge/izpack/util/Log.java 2007-03-09 14:56:41 UTC (rev 1774)
+++ izpack-src/trunk/src/lib/com/izforge/izpack/util/Log.java 2007-03-09 14:58:53 UTC (rev 1775)
@@ -0,0 +1,961 @@
+/*
+ * $Id:$
+ * IzPack - Copyright 2001-2007 Julien Ponge, All Rights Reserved.
+ *
+ * http://www.izforge.com/izpack/
+ * http://developer.berlios.de/projects/izpack/
+ *
+ * Copyright 2006 Elmar Grom
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.izforge.izpack.util;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Vector;
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.text.MessageFormat;
+import java.io.File;
+import java.io.FileWriter;
+import java.text.SimpleDateFormat;
+import java.text.DateFormatSymbols;
+import javax.swing.JOptionPane;
+import javax.swing.JFileChooser;
+
+import com.izforge.izpack.installer.AutomatedInstallData;
+
+/*---------------------------------------------------------------------------*/
+/**
+ * This class handles informing the user about unusual events during the installation process and
+ * therefore about the possibility that the installation may not have succeeded at all or may have
+ * succeeded only partially. Because the logger represents a single resource it is implemented as
+ * singleton.
+ *
+ * <h1>Usage</h1>
+ * To add a message to the install log call one of the <code>addMessage()</code> methods, using
+ * the appropriate message index. If the message contains placeholders for variables, provide a
+ * <code>String</code> array that supplies the necessary variable text. Calling
+ * <code>addMessage()</code> will add an informative message to the log. These may be used to
+ * indicate actions taken by the installer throughout the progression of the install. Calling
+ * <code>addWarning()</code> will not only add the requested warning message to the log but also
+ * cause the user to be alerted about the fact that the install might not have succeeded completely.
+ * <code>addError()</code> goes one step further, by alerting the user that the installation has
+ * failed.
+ *
+ * <h1>Adding Messages</h1>
+ * Messages are divided into three categories:
+ * <ol>
+ * <li>informative/general messages
+ * <li>warning messages
+ * <li>error messages
+ * </ol>
+ * To add a message, define the text resource in the language packs. Then add a new constant for the
+ * message, along with a brief description of the purpose of the message. If the message contains
+ * place holders for variable text add an ordered list to the description, that lists all variables
+ * in proper order, so that other programmers have no difficulty to form a correct call for the
+ * message. The constants are defined in the individual interfaces <code>LogMessage</code>,
+ * <code>LogWarning</code> and <code>LogError</code>.
+ * <p>
+ * To derive a correct integer value for the message index add a new value to either
+ * <code>MESSAGE_BASE</code>, <code>WARNING_BASE</code> or <code>ERROR_BASE</code>,
+ * depending on the message category. Next, increment the MAX_ constant for the message category, to
+ * ensure that the add... methods actually allow the message to be added. The key for the text
+ * resource must be named either <code>log.message_</code>, <code>log.warning_</code> or
+ * <code>log.error_</code> in accordance with the chosen index base. In addition, the key must be
+ * appended by the message index (without the base, since this implementation will automatically
+ * subtract the base). Variable place holders must conform to the specification for
+ * <code>java.text.MessageFormat</code>.
+ *
+ * <h1>Debug Messages</h1>
+ * The output of debug messages is controlled through system properties. These properties may be set
+ * using the -D command line option. Please note, that the -D option is a command line switch for
+ * the VM, not for IzPack. In order for this to work, these options must be listed on the command
+ * line before IzPack!
+ *
+ * <h2>Turning Debug On</h2>
+ * In order to receive debug output, it is necessary to turn this feature on explicitely. This is
+ * done with the command line otprion:
+ *
+ * <pre>
+ * -DIzPack.debug=on
+ * </pre>
+ *
+ * <h2>Selecting Debug Channels</h2>
+ * Setting the list of specific debug channels to trace is accomplished with the following command
+ * line option:
+ *
+ * <pre>
+ * -DIzPack.debug.channel=<channelA,channelB,...>
+ * </pre>
+ *
+ * The parameter is a comma separated list of one or more channel identifiers.
+ *
+ * <h2>Dumping a List of Debug Channels</h2>
+ *
+ * <pre>
+ * -DIzPack.debug.dumpList=on
+ * </pre>
+ *
+ * To turn debug messages on
+ *
+ * @version 0.0.1 / 11/20/06
+ * @author Elmar Grom
+ */
+/*---------------------------------------------------------------------------*/
+
+public class Log implements LogError, LogWarning, LogMessage
+{
+
+ // --------------------------------------------------------------------------
+ // Constant Definitions
+ // --------------------------------------------------------------------------
+ /** The prefix for all text resources related to this class */
+ private static final String RESOURCE_PREFIX = "log.";
+
+ /** The formatting used for the report time stamp */
+ private static final String DATE_FORMAT = RESOURCE_PREFIX + "timeStamp";
+
+ /** The prefix for building message keys */
+ private static final String MESSAGE_PREFIX = RESOURCE_PREFIX + "message_";
+
+ /** The prefix for building warning message keys */
+ private static final String WARNING_PREFIX = RESOURCE_PREFIX + "warning_";
+
+ /** The prefix for building error message keys */
+ private static final String ERROR_PREFIX = RESOURCE_PREFIX + "error_";
+
+ /** System property to turn debug output on */
+ private static final String DEBUG_SWITCH = "IzPack.debug";
+
+ /** System property to set the debug channels to trace */
+ private static final String CHANNEL_SPEC = "IzPack.debug.channel";
+
+ /**
+ * System property to enable dumping of the list of debug channels that did record messages
+ */
+ private static final String CHANNEL_LIST = "IzPack.debug.dumpList";
+
+ // --------------------------------------------------------------------------
+ // Variable Declarations
+ // --------------------------------------------------------------------------
+ /** The only instance of <code>Messenger</code> */
+ private static Log me = null;
+
+ /** The system dependent newline character sequence */
+ private String newline = System.getProperty("line.separator");
+
+ /** Access to the installation information and the localized text resources */
+ private AutomatedInstallData installData = null;
+
+ /** The collection of installation messages */
+ private ArrayList messages = new ArrayList();
+
+ /** The collection of warning messages */
+ private ArrayList warnings = new ArrayList();
+
+ /** The collection of error messages */
+ private ArrayList errors = new ArrayList();
+
+ /** The collection of debug messages */
+ private ArrayList debug = new ArrayList();
+
+ /**
+ * The list of channels requested for debug output. A <code>Vector</code> must be used for
+ * this purpose, since this is the only class that explicitly specifies that the
+ * <code>equals()</code> method is used for determining if a particular object is contained.
+ */
+ private Vector channels = null;
+
+ /**
+ * This map keeps track of all channels that are recorded. It is used for information purposes.
+ */
+ private Hashtable recordedChannels = null;
+
+ /** This flag signals if debug messages should be recorded */
+ private boolean debugActive = false;
+
+ /**
+ * This flag signals that the identifiers of the recorded debug channels should be dumped
+ */
+ private boolean dumpChannels = false;
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * This class is installed as singleton. Therefore the constructor is declared private. Use
+ * <code>getInstance()</code> to get an instance.
+ */
+ /*--------------------------------------------------------------------------*/
+ private Log()
+ {
+ // ----------------------------------------------------
+ // gain access to the install data
+ // ----------------------------------------------------
+ installData = AutomatedInstallData.getInstance();
+
+ // ----------------------------------------------------
+ // get the debug setting
+ // ----------------------------------------------------
+ String temp = System.getProperty(DEBUG_SWITCH);
+ System.out.println("temp: " + temp);
+ if ((temp != null) && (temp.toUpperCase().equals("ON")))
+ {
+ debugActive = true;
+ }
+
+ if (debugActive)
+ {
+ // ----------------------------------------------------
+ // get the list of debug channels requested
+ // ----------------------------------------------------
+ temp = System.getProperty(CHANNEL_LIST);
+ if ((temp != null) && (temp.toUpperCase().equals("ON")))
+ {
+ dumpChannels = true;
+ }
+
+ // ----------------------------------------------------
+ // get the list of debug channels requested
+ // ----------------------------------------------------
+ temp = System.getProperty(CHANNEL_SPEC);
+ if (temp != null)
+ {
+ channels = new Vector();
+ recordedChannels = new Hashtable();
+ String[] channelList = temp.split(",");
+
+ for (int i = 0; i < channelList.length; i++)
+ {
+ channels.add(channelList[i]);
+ }
+ }
+ }
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Returns the only instance of <code>Log</code>
+ * @return the only instance of <code>Log</code>
+ */
+ /*--------------------------------------------------------------------------*/
+ public static Log getInstance()
+ {
+ if (me == null)
+ {
+ me = new Log();
+ }
+
+ return (me);
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * This method records general installation message
+ *
+ * @param message the numeric identifier of the message to add, as defined in
+ * {@link com.izforge.izpack.util.LogMessage <code>LogMessage</code>}
+ * @param detail a string array of variable fields that should be inserted into the message text
+ */
+ /*--------------------------------------------------------------------------*/
+ public void addMessage(int message, String[] detail)
+ {
+ if ((message >= LogMessage.MESSAGE_BASE) && (message < LogMessage.MAX_MESSAGE))
+ {
+ messages.add(new Record(message, detail));
+ }
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * This method records a general installation message, using a custom text template. It allows
+ * cusom code to insert message text that is not defined in IzPack. IzPack internal code should
+ * use the parallel version based on the message index.
+ *
+ * @param template the basic template of the message
+ * @param detail a string array of variable fields that should be inserted into the message
+ * text. Each array element will be inserted into the text template, replacing a marker.
+ *
+ * @see java.text.MessageFormat#format(java.lang.String, java.lang.Object[])
+ */
+ /*--------------------------------------------------------------------------*/
+ public void addCustomMessage(String template, String[] detail)
+ {
+ messages.add(new Record(template, detail));
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * This method records a warning message to the list of messages
+ *
+ * @param message the numeric identifier of the message to add, as defined in
+ * {@link com.izforge.izpack.util.LogWarning <code>LogWarning</code>}
+ * @param detail a string array of variable fields that should be inserted into the message
+ * text. Each array element will be inserted into the text template, replacing a marker.
+ * @param exception the exception associated with the event or <code>null</code> if there was
+ * none.
+ *
+ * @see java.text.MessageFormat#format(java.lang.String, java.lang.Object[])
+ */
+ /*--------------------------------------------------------------------------*/
+ public void addWarning(int message, String[] detail, Throwable exception)
+ {
+ if ((message >= LogWarning.WARNING_BASE) && (message < LogWarning.MAX_WARNING))
+ {
+ warnings.add(new Record(message, detail, exception));
+ }
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * This method records a warning message, using a custom text template. It allows cusom code to
+ * insert message text that is not defined in IzPack. IzPack internal code should use the
+ * parallel version based on the message index.
+ *
+ * @param template the basic template for the message
+ * @param detail a string array of variable fields that should be inserted into the message
+ * text. Each array element will be inserted into the text template, replacing a marker.
+ * @param exception the exception associated with the event or <code>null</code> if there was
+ * none.
+ *
+ * @see java.text.MessageFormat#format(java.lang.String, java.lang.Object[])
+ */
+ /*--------------------------------------------------------------------------*/
+ public void addCustomWarning(String template, String[] detail, Throwable exception)
+ {
+ warnings.add(new Record(template, detail, exception));
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * This method records an error message to the list of messages
+ *
+ * @param message the numeric identifier of the message to add, as defined in
+ * {@link com.izforge.izpack.util.LogError <code>LogError</code>}
+ * @param detail a string array of variable fields that should be inserted into the message
+ * text. Each array element will be inserted into the text template, replacing a marker.
+ * @param exception the exception associated with the event or <code>null</code> if there was
+ * none.
+ *
+ * @see java.text.MessageFormat#format(java.lang.String, java.lang.Object[])
+ */
+ /*--------------------------------------------------------------------------*/
+ public void addError(int message, String[] detail, Throwable exception)
+ {
+ if ((message >= LogError.ERROR_BASE) && (message < LogError.MAX_ERROR))
+ {
+ errors.add(new Record(message, detail, exception));
+ installData.installSuccess = false;
+ }
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * This method records an error message, using a custom text template. It allows cusom code to
+ * insert message text that is not defined in IzPack. IzPack internal code should use the
+ * parallel version based on the message index.
+ *
+ * @param template the basic template for the message
+ * @param detail a string array of variable fields that should be inserted into the message
+ * text. Each array element will be inserted into the text template, replacing a marker.
+ * @param exception the exception associated with the event or <code>null</code> if there was
+ * none.
+ *
+ * @see java.text.MessageFormat#format(java.lang.String, java.lang.Object[])
+ */
+ /*--------------------------------------------------------------------------*/
+ public void addCustomError(String template, String[] detail, Throwable exception)
+ {
+ errors.add(new Record(template, detail, exception));
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * This method provides a channel for debugging messages in IzPack development. Note that debug
+ * messages are used solely for this purpose. Adding debug messages does not trigger user
+ * notification. If the user should be notified about a specific situation, please also call the
+ * appropriate (message, warning, error) method. Debug messages are not localized, please use
+ * English only.
+ * <p>
+ * In order to prevent flooding developers with messages that are generally of no interest, each
+ * message may be associated with a specific channel. A message is associated with a channel
+ * simply by providing a channel identifier as call parameter. There is no need for registering
+ * channels beforehand. If <code>null</code> or an empty string is used as channel identifier
+ * the message will be output, regardless of the channel filter applied. Please use this option
+ * sparingly, just for really impotant messages of general interest.
+ * <p>
+ * To receive output for select channels, start IzPack with the command line option
+ * -DIzPack.debug.channel=, followed by a comma separated list of channel identifiers.
+ *
+ * @param template the basic template for the message
+ * @param detail a string array of variable fields that should be inserted into the message
+ * text. Each array element will be inserted into the text template, replacing a marker.
+ * @param channel the debug channel the message is associated with.
+ * @param exception the exception associated with the event or <code>null</code> if there was
+ * none.
+ */
+ /*--------------------------------------------------------------------------*/
+ public void addDebugMessage(String template, String[] detail, String channel,
+ Throwable exception)
+ {
+ if (debugActive)
+ {
+ recordedChannels.put(channel, channel);
+
+ if ((channel == null) || (channel.length() == 0) || channels.contains(channel))
+ {
+ Record record = new Record(template, detail, exception, channel);
+
+ debug.add(record);
+ System.out.println(buildDebug(record));
+ }
+ }
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Reports if any messages have been recorded.
+ *
+ * @return true if any messages have been recorded
+ */
+ /*--------------------------------------------------------------------------*/
+ public boolean messagesRecorded()
+ {
+ return (!messages.isEmpty());
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Reports if any warnings have been recorded.
+ *
+ * @return true if any warnings have been recorded
+ */
+ /*--------------------------------------------------------------------------*/
+ public boolean warningsRecorded()
+ {
+ return (!warnings.isEmpty());
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Reports if any errors have been recorded.
+ *
+ * @return true if any errors have been recorded
+ */
+ /*--------------------------------------------------------------------------*/
+ public boolean errorsRecorded()
+ {
+ return (!errors.isEmpty());
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Displays a dialog that informs the user about the fact that one or more unusual events have
+ * occurred during installation. If nothing has been recorded, this method returns immediately.
+ */
+ /*--------------------------------------------------------------------------*/
+ public void informUser()
+ {
+ String message = "";
+ int messageType = JOptionPane.WARNING_MESSAGE;
+
+ // ----------------------------------------------------
+ // fins out if there are any warnings or errors,
+ // otherwise return with no action
+ // ----------------------------------------------------
+ if (errorsRecorded())
+ {
+ messageType = JOptionPane.ERROR_MESSAGE;
+ message = installData.langpack.getString(RESOURCE_PREFIX + "informUserFail");
+ }
+ else if (warningsRecorded())
+ {
+ messageType = JOptionPane.WARNING_MESSAGE;
+ message = installData.langpack.getString(RESOURCE_PREFIX + "informUserPartial");
+ }
+ else
+ {
+ return;
+ }
+
+ // ----------------------------------------------------
+ // present the warning message
+ // ----------------------------------------------------
+ int userChoice = JOptionPane.showConfirmDialog(null, message, installData.langpack
+ .getString(RESOURCE_PREFIX + "informUserTitle"), JOptionPane.YES_NO_OPTION,
+ messageType);
+
+ // ----------------------------------------------------
+ // if the user has elected to write the report, present
+ // the file selection dialog.
+ // ----------------------------------------------------
+ if (userChoice == JOptionPane.OK_OPTION)
+ {
+ writeReport();
+ }
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Presents the user with a dialog to select a file and location for the installation report and
+ * writes a report contianing all messages to the user selected file.
+ */
+ /*--------------------------------------------------------------------------*/
+ public void writeReport()
+ {
+ JFileChooser fileChooser = new JFileChooser();
+ fileChooser
+ .setDialogTitle(installData.langpack.getString(RESOURCE_PREFIX + "saveLogTitle"));
+ fileChooser.setSelectedFile(new File(installData.langpack.getString(RESOURCE_PREFIX
+ + "LogFileName")));
+ int choice = fileChooser.showSaveDialog(null);
+
+ if (choice == JFileChooser.APPROVE_OPTION)
+ {
+ writeReport(fileChooser.getSelectedFile().getAbsolutePath());
+ }
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Writes a report contianing all messages to the indicated file.
+ *
+ * @param file the fully qualifies name of the file to write to.
+ */
+ /*--------------------------------------------------------------------------*/
+ public void writeReport(String file)
+ {
+ try
+ {
+ FileWriter writer = new FileWriter(file);
+ String text = compileReport();
+
+ writer.write(text, 0, text.length());
+
+ writer.flush();
+ writer.close();
+ }
+ catch (Throwable exception)
+ {
+ try
+ {
+ JOptionPane.showMessageDialog(null, installData.langpack.getString(
+ (RESOURCE_PREFIX + "reportWriteError"), new String[] { file}),
+ installData.langpack.getString(RESOURCE_PREFIX + "reportWriteErrorTitle"),
+ JOptionPane.ERROR_MESSAGE);
+ }
+ catch (Throwable exception2)
+ {
+ // What todo if writing log report fails?? We can ignore
+ // or write it exceptionally on stderr.
+ exception2.printStackTrace();
+ }
+ }
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Prepares an installation report from the recorded information
+ *
+ * @return the installation report
+ */
+ /*--------------------------------------------------------------------------*/
+ private String compileReport()
+ {
+ StringBuffer report = new StringBuffer();
+ String dateFormat = installData.langpack.getString(DATE_FORMAT);
+ int count;
+
+ // ----------------------------------------------------
+ // insert header
+ // ----------------------------------------------------
+ report
+ .append("-------------------------------------------------------------------------------");
+ report.append(newline);
+ report.append(installData.langpack.getString(RESOURCE_PREFIX + "reportHeading"));
+ report.append(newline);
+ report
+ .append("-------------------------------------------------------------------------------");
+ report.append(newline);
+
+ // ----------------------------------------------------
+ // insert a general warning message if appropriate
+ // ----------------------------------------------------
+ if (errorsRecorded())
+ {
+ report.append(newline);
+ report.append(installData.langpack.getString(RESOURCE_PREFIX + "installFailed"));
+ report.append(newline);
+ }
+ else if (warningsRecorded())
+ {
+ report.append(newline);
+ report.append(installData.langpack.getString(RESOURCE_PREFIX + "partialInstall"));
+ report.append(newline);
+ }
+
+ // ----------------------------------------------------
+ // insert general information about the installation
+ // ----------------------------------------------------
+ report.append(newline);
+ report.append(installData.langpack.getString(RESOURCE_PREFIX + "messageCount",
+ new String[] { Integer.toString(messages.size()),
+ Integer.toString(warnings.size()), Integer.toString(errors.size())}));
+ report.append(newline);
+ report.append(newline);
+
+ report.append(installData.langpack.getString(RESOURCE_PREFIX + "application", new String[] {
+ installData.info.getAppName(), installData.info.getAppVersion()}));
+ report.append(newline);
+ report.append(installData.langpack.getString(RESOURCE_PREFIX + "timePrefix",
+ new String[] { new SimpleDateFormat(dateFormat, new DateFormatSymbols())
+ .format(new Date())}));
+
+ report.append(newline);
+ report.append(installData.langpack.getString(RESOURCE_PREFIX + "pathPrefix",
+ new String[] { installData.getInstallPath()}));
+ report.append(newline);
+
+ // ----------------------------------------------------
+ // insert the recorded mnessages
+ // ----------------------------------------------------
+ if (messagesRecorded())
+ {
+ report.append(newline);
+ report.append(installData.langpack.getString(RESOURCE_PREFIX + "messageHeading"));
+ report.append(newline);
+ report.append(newline);
+
+ count = messages.size();
+
+ for (int i = 0; i < count; i++)
+ {
+ report.append(buildMessage(i));
+ }
+ }
+ // ----------------------------------------------------
+ // insert the recorded warning messages
+ // ----------------------------------------------------
+ if (warningsRecorded())
+ {
+ report.append(newline);
+ report.append(installData.langpack.getString(RESOURCE_PREFIX + "warningHeading"));
+ report.append(newline);
+ report.append(newline);
+
+ count = warnings.size();
+
+ for (int i = 0; i < count; i++)
+ {
+ report.append(buildWarning(i));
+ }
+ }
+ // ----------------------------------------------------
+ // insert the recorded error messages
+ // ----------------------------------------------------
+ if (errorsRecorded())
+ {
+ report.append(newline);
+ report.append(installData.langpack.getString(RESOURCE_PREFIX + "errorHeading"));
+ report.append(newline);
+ report.append(newline);
+
+ count = errors.size();
+
+ for (int i = 0; i < count; i++)
+ {
+ report.append(buildError(i));
+ }
+ }
+
+ // ----------------------------------------------------
+ // insert the debug messages
+ // ----------------------------------------------------
+ if (debugActive)
+ {
+ report.append(newline);
+ report.append(installData.langpack.getString(RESOURCE_PREFIX + "debugHeading"));
+ report.append(newline);
+ report.append(newline);
+
+ count = errors.size();
+
+ for (int i = 0; i < count; i++)
+ {
+ report.append(buildDebug(i));
+ }
+ }
+
+ report
+ .append("-------------------------------------------------------------------------------");
+ report.append(newline);
+
+ return (report.toString());
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Builds a general installation message from the information contained in the indicated record
+ *
+ * @param index the index of the requested message entry
+ */
+ /*--------------------------------------------------------------------------*/
+ private String buildMessage(int index)
+ {
+ Record record = (Record) messages.get(index);
+ StringBuffer message = new StringBuffer();
+
+ // ----------------------------------------------------
+ // append the message text
+ // ----------------------------------------------------
+ message.append(installData.langpack.getString(RESOURCE_PREFIX + "messagePrefix",
+ new String[] { Integer.toString(index)}));
+
+ if (record.message >= 0)
+ {
+ message
+ .append(installData.langpack.getString(MESSAGE_PREFIX
+ + Integer.toString(record.message - LogMessage.MESSAGE_BASE),
+ record.variables));
+ }
+ else
+ {
+ message.append(MessageFormat.format(record.template, record.variables));
+ }
+
+ message.append(newline);
+ return (message.toString());
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Builds a warning message from the information contained in the indicated warning record
+ *
+ * @param index the index of the requested warning entry
+ */
+ /*--------------------------------------------------------------------------*/
+ private String buildWarning(int index)
+ {
+ Record record = (Record) warnings.get(index);
+ StringBuffer message = new StringBuffer();
+
+ // ----------------------------------------------------
+ // append the message text
+ // ----------------------------------------------------
+ message.append(installData.langpack.getString(RESOURCE_PREFIX + "warningPrefix",
+ new String[] { Integer.toString(index)}));
+
+ if (record.message >= 0)
+ {
+ message
+ .append(installData.langpack.getString(WARNING_PREFIX
+ + Integer.toString(record.message - LogWarning.WARNING_BASE),
+ record.variables));
+ }
+ else
+ {
+ message.append(MessageFormat.format(record.template, record.variables));
+ }
+
+ // ----------------------------------------------------
+ // append the exception
+ // ----------------------------------------------------
+ if (record.exception != null)
+ {
+ message.append(newline);
+ message.append(installData.langpack.getString(RESOURCE_PREFIX + "exceptionPrefix",
+ new String[] { record.exception.toString()}));
+ }
+
+ message.append(newline);
+ return (message.toString());
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Builds an error message from the information contained in the indicated error record
+ *
+ * @param index the index of the requested error entry
+ */
+ /*--------------------------------------------------------------------------*/
+ private String buildError(int index)
+ {
+ Record record = (Record) errors.get(index);
+ StringBuffer message = new StringBuffer();
+
+ // ----------------------------------------------------
+ // append the message text
+ // ----------------------------------------------------
+ message.append(installData.langpack.getString(RESOURCE_PREFIX + "errorPrefix",
+ new String[] { Integer.toString(index)}));
+
+ if (record.message >= 0)
+ {
+ message.append(installData.langpack.getString(ERROR_PREFIX
+ + Integer.toString(record.message - LogError.ERROR_BASE), record.variables));
+ }
+ else
+ {
+ message.append(MessageFormat.format(record.template, record.variables));
+ }
+
+ // ----------------------------------------------------
+ // append the exception
+ // ----------------------------------------------------
+ if (record.exception != null)
+ {
+ message.append(newline);
+ message.append(installData.langpack.getString(RESOURCE_PREFIX + "exceptionPrefix",
+ new String[] { record.exception.toString()}));
+ }
+
+ message.append(newline);
+ return (message.toString());
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Builds a debug message from the information contained in the indicated debug record
+ *
+ * @param index the index of the requested debug entry
+ */
+ /*--------------------------------------------------------------------------*/
+ private String buildDebug(int index)
+ {
+ Record record = (Record) debug.get(index);
+
+ return (buildDebug(record));
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Builds a debug message from the information contained in a specific debug record
+ *
+ * @param record the debug record
+ */
+ /*--------------------------------------------------------------------------*/
+ private String buildDebug(Record record)
+ {
+ StringBuffer message = new StringBuffer();
+
+ // ----------------------------------------------------
+ // append the message text
+ // ----------------------------------------------------
+ if ((record.channel == null) || (record.channel.length() == 0))
+ {
+ message.append("Debug - general: ");
+ }
+ else
+ {
+ message.append("Debug - " + record.channel + ": ");
+ }
+
+ message.append(MessageFormat.format(record.template, record.variables));
+
+ // ----------------------------------------------------
+ // append the exception
+ // ----------------------------------------------------
+ if (record.exception != null)
+ {
+ message.append(newline);
+ message.append(installData.langpack.getString(RESOURCE_PREFIX + "exceptionPrefix",
+ new String[] { record.exception.toString()}));
+ }
+
+ message.append(newline);
+ return (message.toString());
+ }
+
+ /*--------------------------------------------------------------------------*/
+ /**
+ * Dumps the list of debug channels to stdout that have recorded messages
+ */
+ /*--------------------------------------------------------------------------*/
+ public void dumpRecordedChannels()
+ {
+ if (debugActive && dumpChannels)
+ {
+ System.out.println();
+ System.out.println("The following debug channels did record messages:");
+ System.out.println();
+
+ Enumeration list = recordedChannels.keys();
+
+ while (list.hasMoreElements())
+ {
+ System.out.println(" - " + list.nextElement().toString());
+ }
+
+ System.out.println();
+ }
+ }
+
+ // --------------------------------------------------------------------------
+ // class definition to handle individual entries
+ // --------------------------------------------------------------------------
+ private class Record
+ {
+
+ String channel;
+
+ String template;
+
+ int message;
+
+ String[] variables;
+
+ Throwable exception;
+
+ // ----------------------------------------------------
+ // Constructors
+ // ----------------------------------------------------
+ Record(int message, String[] variables)
+ {
+ this.message = message;
+ this.variables = variables;
+ }
+
+ Record(String template, String[] variables)
+ {
+ this.message = -1;
+ this.template = template;
+ this.variables = variables;
+ }
+
+ Record(int message, String[] variables, Throwable exception)
+ {
+ this.message = message;
+ this.variables = variables;
+ this.exception = exception;
+ }
+
+ Record(String template, String[] variables, Throwable exception)
+ {
+ this.message = -1;
+ this.template = template;
+ this.variables = variables;
+ this.exception = exception;
+ }
+
+ Record(String template, String[] variables, Throwable exception, String channel)
+ {
+ this.message = -1;
+ this.template = template;
+ this.variables = variables;
+ this.exception = exception;
+ this.channel = channel;
+ }
+ }
+}
+/*---------------------------------------------------------------------------*/
Added: izpack-src/trunk/src/lib/com/izforge/izpack/util/LogError.java
===================================================================
--- izpack-src/trunk/src/lib/com/izforge/izpack/util/LogError.java 2007-03-09 14:56:41 UTC (rev 1774)
+++ izpack-src/trunk/src/lib/com/izforge/izpack/util/LogError.java 2007-03-09 14:58:53 UTC (rev 1775)
@@ -0,0 +1,45 @@
+/*
+ * $Id:$
+ * IzPack - Copyright 2001-2007 Julien Ponge, All Rights Reserved.
+ *
+ * http://www.izforge.com/izpack/
+ * http://developer.berlios.de/projects/izpack/
+ *
+ * Copyright 2006 Elmar Grom
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.izforge.izpack.util;
+
+/**
+ * Interface for handle error logging with IzPack Log class.
+ * @author Elmar Grom
+ */
+public interface LogError
+{
+ /** First index for error messages */
+ static final int ERROR_BASE = 2000;
+
+ /** Informs the user that a specific file could not be written<br>
+ * Detail Paramters
+ * <ol>
+ * <li>name of the file that could not be written
+ * </ol>
+ * */
+ public static final int COULD_NOT_WRITE_FILE = ERROR_BASE + 0;
+
+ /** The highest legal error message number is less than this value. */
+ static final int MAX_ERROR = ERROR_BASE + 1;
+}
+
Added: izpack-src/trunk/src/lib/com/izforge/izpack/util/LogMessage.java
===================================================================
--- izpack-src/trunk/src/lib/com/izforge/izpack/util/LogMessage.java 2007-03-09 14:56:41 UTC (rev 1774)
+++ izpack-src/trunk/src/lib/com/izforge/izpack/util/LogMessage.java 2007-03-09 14:58:53 UTC (rev 1775)
@@ -0,0 +1,37 @@
+/*
+ * $Id:$
+ * IzPack - Copyright 2001-2007 Julien Ponge, All Rights Reserved.
+ *
+ * http://www.izforge.com/izpack/
+ * http://developer.berlios.de/projects/izpack/
+ *
+ * Copyright 2006 Elmar Grom
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.izforge.izpack.util;
+
+/**
+ * Interface for handle message logging with IzPack Log class.
+ * @author Elmar Grom
+ */
+public interface LogMessage
+{
+ /** First index for warning messages */
+ static final int MESSAGE_BASE = 0;
+
+ /** The highest legal error message number is less than this value. */
+ static final int MAX_MESSAGE = MESSAGE_BASE + 0;
+}
+
Added: izpack-src/trunk/src/lib/com/izforge/izpack/util/LogWarning.java
===================================================================
--- izpack-src/trunk/src/lib/com/izforge/izpack/util/LogWarning.java 2007-03-09 14:56:41 UTC (rev 1774)
+++ izpack-src/trunk/src/lib/com/izforge/izpack/util/LogWarning.java 2007-03-09 14:58:53 UTC (rev 1775)
@@ -0,0 +1,37 @@
+/*
+ * $Id:$
+ * IzPack - Copyright 2001-2007 Julien Ponge, All Rights Reserved.
+ *
+ * http://www.izforge.com/izpack/
+ * http://developer.berlios.de/projects/izpack/
+ *
+ * Copyright 2006 Elmar Grom
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.izforge.izpack.util;
+
+/**
+ * Interface for handle warnings logging with IzPack Log class.
+ * @author Elmar Grom
+ */
+public interface LogWarning
+{
+ /** First index for warning messages */
+ static final int WARNING_BASE = 1000;
+
+ /** The highest legal error message number is less than this value. */
+ static final int MAX_WARNING = WARNING_BASE + 0;
+}
+
More information about the izpack-changes
mailing list