src/share/classes/java/util/logging/StreamHandler.java
Print this page
*** 25,34 ****
--- 25,36 ----
package java.util.logging;
import java.io.*;
+ import java.security.AccessController;
+ import java.security.PrivilegedAction;
/**
* 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>
--- 77,151 ----
public class StreamHandler extends Handler {
private OutputStream output;
private boolean doneHeader;
private volatile Writer writer;
! // Private PrivilegedAction to configure a StreamHandler from constructor parameters,
! // LogManager properties and/or default values as specified in the class
// javadoc.
! private class ConfigureAction implements PrivilegedAction<Void> {
! private final OutputStream out;
! private final Formatter formatter;
!
! ConfigureAction() {
! this.out = null;
! this.formatter = null;
! }
!
! ConfigureAction(OutputStream out, Formatter formatter) {
! if (out == null || formatter == null) {
! throw new NullPointerException();
! }
! this.out = out;
! this.formatter = formatter;
! }
!
! @Override
! public Void run() {
LogManager manager = LogManager.getLogManager();
! String cname = StreamHandler.this.getClass().getName();
setLevel(manager.getLevelProperty(cname +".level", Level.INFO));
setFilter(manager.getFilterProperty(cname +".filter", null));
! setFormatter(formatter == null // use configured formatter if null
! ? manager.getFormatterProperty(cname +".formatter", new SimpleFormatter())
! : formatter);
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;
}
}
+ if (out != null) { // don't set output stream if null
+ setOutputStream(out);
+ }
+ return null;
+ }
}
/**
* Create a <tt>StreamHandler</tt>, with no current output stream.
*/
public StreamHandler() {
! AccessController.doPrivileged(new ConfigureAction(),
! null, LogManager.controlPermission);
}
/**
* 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) {
! AccessController.doPrivileged(new ConfigureAction(out, formatter),
! null, LogManager.controlPermission);
}
/**
* Change the output stream.
* <P>