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

Print this page

        

@@ -25,10 +25,12 @@
 
 
 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,54 +77,30 @@
 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;
+        configure(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) {
-        sealed = false;
-        configure();
-        setFormatter(formatter);
-        setOutputStream(out);
-        sealed = true;
+        if (formatter == null) {
+            throw new NullPointerException();
+        }
+        configure(formatter);
+        setOutputStreamPrivileged(out);
     }
 
     /**
      * Change the output stream.
      * <P>

@@ -299,6 +277,19 @@
      */
     @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);
+    }
 }