001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package java.util.logging;
019:
020: import org.apache.harmony.logging.internal.nls.Messages;
021:
022: /**
023: * An error reporting facility for {@link Handler} implementations to record any
024: * error that may happen during logging. <code>Handlers</code> should report
025: * errors to an <code>ErrorManager</code>, instead of throwing exceptions,
026: * which would interfere with the log issuer's execution.
027: */
028: public class ErrorManager {
029:
030: /**
031: * The error code indicating a failure that does not fit in any of the
032: * specific types of failures that follow.
033: */
034: public static final int GENERIC_FAILURE = 0;
035:
036: /**
037: * The error code indicating a failure when writing to an output stream.
038: */
039: public static final int WRITE_FAILURE = 1;
040:
041: /**
042: * The error code indicating a failure when flushing an output stream.
043: */
044: public static final int FLUSH_FAILURE = 2;
045:
046: /**
047: * The error code indicating a failure when closing an output stream.
048: */
049: public static final int CLOSE_FAILURE = 3;
050:
051: /**
052: * The error code indicating a failure when opening an output stream.
053: */
054: public static final int OPEN_FAILURE = 4;
055:
056: /**
057: * The error code indicating a failure when formatting the error messages.
058: */
059: public static final int FORMAT_FAILURE = 5;
060:
061: @SuppressWarnings("nls")
062: private static final String[] FAILURES = new String[] {
063: "GENERIC_FAILURE", "WRITE_FAILURE", "FLUSH_FAILURE",
064: "CLOSE_FAILURE", "OPEN_FAILURE", "FORMAT_FAILURE" };
065:
066: /**
067: * An indicator for determining if the error manager has been called at
068: * least once before.
069: */
070: private boolean called;
071:
072: /**
073: * Constructs an instance of <code>ErrorManager</code>.
074: */
075: public ErrorManager() {
076: super ();
077: }
078:
079: /**
080: * Reports an error using the given message, exception and error code. This
081: * implementation will write out the message to {@link System#err} on the
082: * first call and all subsequent calls are ignored. A subclass of this class
083: * should override this method.
084: *
085: * @param message
086: * The error message, which may be <code>null</code>.
087: * @param exception
088: * The exception associated with the error, which may be
089: * <code>null</code>.
090: * @param errorCode
091: * The error code that identifies the type of error; see the
092: * constant fields on this class.
093: */
094: public void error(String message, Exception exception, int errorCode) {
095: synchronized (this ) {
096: if (called) {
097: return;
098: }
099: called = true;
100: }
101: System.err.println(this .getClass().getName()
102: + ": " + FAILURES[errorCode]); //$NON-NLS-1$
103: if (message != null) {
104: // logging.1E=Error message - {0}
105: System.err.println(Messages
106: .getString("logging.1E", message)); //$NON-NLS-1$
107: }
108: if (exception != null) {
109: // logging.1F=Exception - {0}
110: System.err.println(Messages.getString(
111: "logging.1F", exception)); //$NON-NLS-1$
112: }
113: }
114: }
|