src/share/classes/java/util/logging/StreamHandler.java

Print this page

        

*** 25,34 **** --- 25,37 ---- package java.util.logging; import java.io.*; + import java.security.AccessController; + import java.security.PrivilegedAction; + import java.util.Objects; /** * Stream based logging <tt>Handler</tt>. * <p> * This is primarily intended as a base class or support class to
*** 75,128 **** public class StreamHandler extends Handler { private OutputStream output; private boolean doneHeader; private volatile Writer writer; - // Private method to configure a StreamHandler from LogManager - // properties and/or default values as specified in the class - // javadoc. - private void configure() { - LogManager manager = LogManager.getLogManager(); - String cname = getClass().getName(); - - setLevel(manager.getLevelProperty(cname +".level", Level.INFO)); - setFilter(manager.getFilterProperty(cname +".filter", null)); - setFormatter(manager.getFormatterProperty(cname +".formatter", new SimpleFormatter())); - try { - setEncoding(manager.getStringProperty(cname +".encoding", null)); - } catch (Exception ex) { - try { - setEncoding(null); - } catch (Exception ex2) { - // doing a setEncoding with null should always work. - // assert false; - } - } - } - /** * Create a <tt>StreamHandler</tt>, with no current output stream. */ public StreamHandler() { ! sealed = false; ! configure(); ! sealed = true; } /** * Create a <tt>StreamHandler</tt> with a given <tt>Formatter</tt> * and output stream. * <p> * @param out the target output stream * @param formatter Formatter to be used to format output */ public StreamHandler(OutputStream out, Formatter formatter) { ! sealed = false; ! configure(); ! setFormatter(formatter); ! setOutputStream(out); ! sealed = true; } /** * Change the output stream. * <P> --- 78,116 ---- public class StreamHandler extends Handler { private OutputStream output; private boolean doneHeader; private volatile Writer writer; /** * Create a <tt>StreamHandler</tt>, with no current output stream. */ public StreamHandler() { ! // configure with specific defaults for StreamHandler ! super(Level.INFO, new SimpleFormatter(), null); } /** * Create a <tt>StreamHandler</tt> with a given <tt>Formatter</tt> * and output stream. * <p> * @param out the target output stream * @param formatter Formatter to be used to format output */ public StreamHandler(OutputStream out, Formatter formatter) { ! // configure with default level but use specified formatter ! super(Level.INFO, null, Objects.requireNonNull(formatter)); ! ! setOutputStreamPrivileged(out); ! } ! ! /** ! * @see Handler#Handler(Level, Formatter, Formatter) ! */ ! StreamHandler(Level defaultLevel, ! Formatter defaultFormatter, ! Formatter specifiedFormatter) { ! super(defaultLevel, defaultFormatter, specifiedFormatter); } /** * Change the output stream. * <P>
*** 299,304 **** --- 287,304 ---- */ @Override public synchronized void close() throws SecurityException { flushAndClose(); } + + // Package-private support for setting OutputStream + // with elevated privilege. + final void setOutputStreamPrivileged(final OutputStream out) { + AccessController.doPrivileged(new PrivilegedAction<Void>() { + @Override + public Void run() { + setOutputStream(out); + return null; + } + }, null, LogManager.controlPermission); + } }