151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.util.logging; 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.UnsupportedEncodingException; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A <tt>Handler</tt> object takes log messages from a <tt>Logger</tt> and 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * exports them. It might for example, write them to a console 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or write them to a file, or send them to a network logging service, 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or forward them to an OS log, or whatever. 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A <tt>Handler</tt> can be disabled by doing a <tt>setLevel(Level.OFF)</tt> 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and can be re-enabled by doing a <tt>setLevel</tt> with an appropriate level. 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>Handler</tt> classes typically use <tt>LogManager</tt> properties to set 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * default values for the <tt>Handler</tt>'s <tt>Filter</tt>, <tt>Formatter</tt>, 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and <tt>Level</tt>. See the specific documentation for each concrete 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>Handler</tt> class. 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class Handler { 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final int offValue = Level.OFF.intValue(); 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private LogManager manager = LogManager.getLogManager(); 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Filter filter; 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Formatter formatter; 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Level logLevel = Level.ALL; 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private ErrorManager errorManager = new ErrorManager(); 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private String encoding; 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Package private support for security checking. When sealed 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // is true, we access check updates to the class. 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean sealed = true; 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Default constructor. The resulting <tt>Handler</tt> has a log 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * level of <tt>Level.ALL</tt>, no <tt>Formatter</tt>, and no 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>Filter</tt>. A default <tt>ErrorManager</tt> instance is installed 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as the <tt>ErrorManager</tt>. 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected Handler() { 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Publish a <tt>LogRecord</tt>. 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The logging request was made initially to a <tt>Logger</tt> object, 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * which initialized the <tt>LogRecord</tt> and forwarded it here. 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <tt>Handler</tt> is responsible for formatting the message, when and 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if necessary. The formatting should include localization. 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param record description of the log event. A null record is 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * silently ignored and is not published 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract void publish(LogRecord record); 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Flush any buffered output. 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract void flush(); 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Close the <tt>Handler</tt> and free all associated resources. 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The close method will perform a <tt>flush</tt> and then close the 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>Handler</tt>. After close has been called this <tt>Handler</tt> 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * should no longer be used. Method calls may either be silently 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ignored or may throw runtime exceptions. 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception SecurityException if a security manager exists and if 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the caller does not have <tt>LoggingPermission("control")</tt>. 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract void close() throws SecurityException; 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Set a <tt>Formatter</tt>. This <tt>Formatter</tt> will be used 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to format <tt>LogRecords</tt> for this <tt>Handler</tt>. 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Some <tt>Handlers</tt> may not use <tt>Formatters</tt>, in 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * which case the <tt>Formatter</tt> will be remembered, but not used. 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param newFormatter the <tt>Formatter</tt> to use (may not be null) 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception SecurityException if a security manager exists and if 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the caller does not have <tt>LoggingPermission("control")</tt>. 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setFormatter(Formatter newFormatter) throws SecurityException { 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski checkPermission(); 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Check for a null pointer: 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski newFormatter.getClass(); 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski formatter = newFormatter; 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the <tt>Formatter</tt> for this <tt>Handler</tt>. 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the <tt>Formatter</tt> (may be null). 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Formatter getFormatter() { 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return formatter; 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Set the character encoding used by this <tt>Handler</tt>. 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The encoding should be set before any <tt>LogRecords</tt> are written 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to the <tt>Handler</tt>. 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param encoding The name of a supported character encoding. 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * May be null, to indicate the default platform encoding. 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception SecurityException if a security manager exists and if 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the caller does not have <tt>LoggingPermission("control")</tt>. 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception UnsupportedEncodingException if the named encoding is 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * not supported. 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setEncoding(String encoding) 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws SecurityException, java.io.UnsupportedEncodingException { 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski checkPermission(); 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (encoding != null) { 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if(!java.nio.charset.Charset.isSupported(encoding)) { 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnsupportedEncodingException(encoding); 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (java.nio.charset.IllegalCharsetNameException e) { 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnsupportedEncodingException(encoding); 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.encoding = encoding; 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the character encoding for this <tt>Handler</tt>. 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The encoding name. May be null, which indicates the 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * default encoding should be used. 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getEncoding() { 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return encoding; 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Set a <tt>Filter</tt> to control output on this <tt>Handler</tt>. 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P> 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * For each call of <tt>publish</tt> the <tt>Handler</tt> will call 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this <tt>Filter</tt> (if it is non-null) to check if the 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>LogRecord</tt> should be published or discarded. 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param newFilter a <tt>Filter</tt> object (may be null) 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception SecurityException if a security manager exists and if 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the caller does not have <tt>LoggingPermission("control")</tt>. 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setFilter(Filter newFilter) throws SecurityException { 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski checkPermission(); 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski filter = newFilter; 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get the current <tt>Filter</tt> for this <tt>Handler</tt>. 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <tt>Filter</tt> object (may be null) 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Filter getFilter() { 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return filter; 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Define an ErrorManager for this Handler. 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The ErrorManager's "error" method will be invoked if any 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * errors occur while using this Handler. 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param em the new ErrorManager 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception SecurityException if a security manager exists and if 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the caller does not have <tt>LoggingPermission("control")</tt>. 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setErrorManager(ErrorManager em) { 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski checkPermission(); 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (em == null) { 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException(); 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski errorManager = em; 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Retrieves the ErrorManager for this Handler. 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception SecurityException if a security manager exists and if 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the caller does not have <tt>LoggingPermission("control")</tt>. 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ErrorManager getErrorManager() { 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski checkPermission(); 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return errorManager; 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Protected convenience method to report an error to this Handler's 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ErrorManager. Note that this method retrieves and uses the ErrorManager 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * without doing a security check. It can therefore be used in 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * environments where the caller may be non-privileged. 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param msg a descriptive string (may be null) 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param ex an exception (may be null) 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param code an error code defined in ErrorManager 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void reportError(String msg, Exception ex, int code) { 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski errorManager.error(msg, ex, code); 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception ex2) { 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("Handler.reportError caught:"); 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ex2.printStackTrace(); 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Set the log level specifying which message levels will be 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * logged by this <tt>Handler</tt>. Message levels lower than this 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * value will be discarded. 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The intention is to allow developers to turn on voluminous 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * logging, but to limit the messages that are sent to certain 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>Handlers</tt>. 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param newLevel the new value for the log level 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception SecurityException if a security manager exists and if 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the caller does not have <tt>LoggingPermission("control")</tt>. 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized void setLevel(Level newLevel) throws SecurityException { 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (newLevel == null) { 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException(); 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski checkPermission(); 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski logLevel = newLevel; 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get the log level specifying which messages will be 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * logged by this <tt>Handler</tt>. Message levels lower 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * than this level will be discarded. 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the level of messages being logged. 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized Level getLevel() { 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return logLevel; 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Check if this <tt>Handler</tt> would actually log a given <tt>LogRecord</tt>. 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method checks if the <tt>LogRecord</tt> has an appropriate 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>Level</tt> and whether it satisfies any <tt>Filter</tt>. It also 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * may make other <tt>Handler</tt> specific checks that might prevent a 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * handler from logging the <tt>LogRecord</tt>. It will return false if 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the <tt>LogRecord</tt> is null. 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param record a <tt>LogRecord</tt> 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return true if the <tt>LogRecord</tt> would be logged. 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isLoggable(LogRecord record) { 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int levelValue = getLevel().intValue(); 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (record.getLevel().intValue() < levelValue || levelValue == offValue) { 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Filter filter = getFilter(); 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (filter == null) { 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return filter.isLoggable(record); 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Package-private support method for security checks. 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // If "sealed" is true, we check that the caller has 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // appropriate security privileges to update Handler 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // state and if not throw a SecurityException. 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void checkPermission() throws SecurityException { 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (sealed) { 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski manager.checkPermission(); 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 305