Frames | No Frames |
1: /* ErrorManager.java -- 2: A class for dealing with errors that a Handler encounters 3: during logging 4: Copyright (C) 2002, 2003 Free Software Foundation, Inc. 5: 6: This file is part of GNU Classpath. 7: 8: GNU Classpath is free software; you can redistribute it and/or modify 9: it under the terms of the GNU General Public License as published by 10: the Free Software Foundation; either version 2, or (at your option) 11: any later version. 12: 13: GNU Classpath is distributed in the hope that it will be useful, but 14: WITHOUT ANY WARRANTY; without even the implied warranty of 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16: General Public License for more details. 17: 18: You should have received a copy of the GNU General Public License 19: along with GNU Classpath; see the file COPYING. If not, write to the 20: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 21: 02110-1301 USA. 22: 23: Linking this library statically or dynamically with other modules is 24: making a combined work based on this library. Thus, the terms and 25: conditions of the GNU General Public License cover the whole 26: combination. 27: 28: As a special exception, the copyright holders of this library give you 29: permission to link this library with independent modules to produce an 30: executable, regardless of the license terms of these independent 31: modules, and to copy and distribute the resulting executable under 32: terms of your choice, provided that you also meet, for each linked 33: independent module, the terms and conditions of the license of that 34: module. An independent module is a module which is not derived from 35: or based on this library. If you modify this library, you may extend 36: this exception to your version of the library, but you are not 37: obligated to do so. If you do not wish to do so, delete this 38: exception statement from your version. */ 39: 40: 41: package java.util.logging; 42: 43: /** 44: * An <code>ErrorManager</code> deals with errors that a <code>Handler</code> 45: * encounters while logging. 46: * 47: * @see Handler#setErrorManager(ErrorManager) 48: * 49: * @author Sascha Brawer (brawer@acm.org) 50: */ 51: public class ErrorManager 52: { 53: /* The values have been taken from Sun's public J2SE 1.4 API 54: * documentation. 55: * See http://java.sun.com/j2se/1.4/docs/api/constant-values.html 56: */ 57: 58: /** 59: * Indicates that there was a failure that does not readily 60: * fall into any of the other categories. 61: */ 62: public static final int GENERIC_FAILURE = 0; 63: 64: 65: /** 66: * Indicates that there was a problem upon writing to 67: * an output stream. 68: */ 69: public static final int WRITE_FAILURE = 1; 70: 71: 72: /** 73: * Indicates that there was a problem upon flushing 74: * an output stream. 75: */ 76: public static final int FLUSH_FAILURE = 2; 77: 78: 79: /** 80: * Indicates that there was a problem upon closing 81: * an output stream. 82: */ 83: public static final int CLOSE_FAILURE = 3; 84: 85: 86: /** 87: * Indicates that there was a problem upon opening 88: * an output stream. 89: */ 90: public static final int OPEN_FAILURE = 4; 91: 92: 93: /** 94: * Indicates that there was a problem upon formatting 95: * the message of a log record. 96: */ 97: public static final int FORMAT_FAILURE = 5; 98: 99: 100: /** 101: * Indicates whether the {@link #error} method of this ErrorManager 102: * has ever been used. 103: * 104: * Declared volatile in order to correctly support the 105: * double-checked locking idiom (once the revised Java Memory Model 106: * gets adopted); see Classpath bug #2944. 107: */ 108: private volatile boolean everUsed = false; 109: 110: 111: public ErrorManager() 112: { 113: } 114: 115: 116: /** 117: * Reports an error that occured upon logging. The default implementation 118: * emits the very first error to System.err, ignoring subsequent errors. 119: * 120: * @param message a message describing the error, or <code>null</code> if 121: * there is no suitable description. 122: * 123: * @param ex an exception, or <code>null</code> if the error is not 124: * related to an exception. 125: * 126: * @param errorCode one of the defined error codes, for example 127: * <code>ErrorManager.CLOSE_FAILURE</code>. 128: */ 129: public void error(String message, Exception ex, int errorCode) 130: { 131: if (everUsed) 132: return; 133: 134: synchronized (this) 135: { 136: /* The double check is intentional. If the first check was 137: * omitted, the monitor would have to be entered every time 138: * error() method was called. If the second check was 139: * omitted, the code below could be executed by multiple 140: * threads simultaneously. 141: * 142: * This is the 'double-checked locking' idiom, which is broken 143: * with the current version of the Java memory model. However, 144: * we assume that JVMs will have adopted a revised version of 145: * the Java Memory Model by the time GNU Classpath gains 146: * widespread acceptance. See Classpath bug #2944. 147: */ 148: if (everUsed) 149: return; 150: 151: everUsed = true; 152: } 153: 154: String codeMsg; 155: switch (errorCode) 156: { 157: case GENERIC_FAILURE: 158: codeMsg = "GENERIC_FAILURE"; 159: break; 160: 161: case WRITE_FAILURE: 162: codeMsg = "WRITE_FAILURE"; 163: break; 164: 165: case FLUSH_FAILURE: 166: codeMsg = "FLUSH_FAILURE"; 167: break; 168: 169: case CLOSE_FAILURE: 170: codeMsg = "CLOSE_FAILURE"; 171: break; 172: 173: case OPEN_FAILURE: 174: codeMsg = "OPEN_FAILURE"; 175: break; 176: 177: case FORMAT_FAILURE: 178: codeMsg = "FORMAT_FAILURE"; 179: break; 180: 181: default: 182: codeMsg = String.valueOf(errorCode); 183: break; 184: } 185: 186: System.err.println("Error upon logging: " + codeMsg); 187: if ((message != null) && (message.length() > 0)) 188: System.err.println(message); 189: 190: if (ex != null) 191: ex.printStackTrace(); 192: } 193: }