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,75 @@
 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
+    // Private PrivilegedAction to configure a StreamHandler from constructor parameters,
+    // LogManager properties and/or default values as specified in the class
     // javadoc.
-    private void configure() {
+    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 = getClass().getName();
+            String cname = StreamHandler.this.getClass().getName();
 
         setLevel(manager.getLevelProperty(cname +".level", Level.INFO));
         setFilter(manager.getFilterProperty(cname +".filter", null));
-        setFormatter(manager.getFormatterProperty(cname +".formatter", new SimpleFormatter()));
+            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() {
-        sealed = false;
-        configure();
-        sealed = true;
+        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) {
-        sealed = false;
-        configure();
-        setFormatter(formatter);
-        setOutputStream(out);
-        sealed = true;
+        AccessController.doPrivileged(new ConfigureAction(out, formatter),
+                                      null, LogManager.controlPermission);
     }
 
     /**
      * Change the output stream.
      * <P>