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);
+ }
}