1 /*
   2  * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.javafx.logging;
  27 
  28 import java.lang.ref.WeakReference;
  29 import java.util.Arrays;
  30 import java.util.HashMap;
  31 import java.util.Map;
  32 import java.util.ResourceBundle;
  33 
  34 /**
  35  * Platform logger provides an API for the JavaFX components to log
  36  * messages. It is an internal logger intended to be used by JavaFX modules.
  37  *
  38  * The PlatformLogger uses an underlying System.Logger
  39  * obtained by calling {@link java.lang.System.Logger#getLogger(String)}
  40  *
  41  * PlatformLogger implements System.Logger as to facilitiate logging of
  42  * calling class and method.
  43  * Note : JDK internal loggers know to skip any calls from System.Logger
  44  * classes when looking for the calling class / method.
  45  */
  46 public class PlatformLogger implements System.Logger {
  47 
  48     /**
  49      * PlatformLogger logging levels.
  50      */
  51     public static enum Level {
  52         // The name and value must match that of {@code java.lang.System.Level}s.
  53         // Declare in ascending order of the given value
  54         ALL(System.Logger.Level.ALL),
  55         FINEST(System.Logger.Level.TRACE),
  56         FINER(System.Logger.Level.TRACE),
  57         FINE(System.Logger.Level.DEBUG),
  58         INFO(System.Logger.Level.INFO),
  59         WARNING(System.Logger.Level.WARNING),
  60         SEVERE(System.Logger.Level.ERROR),
  61         OFF(System.Logger.Level.OFF);
  62 
  63         final System.Logger.Level systemLevel;
  64         Level(System.Logger.Level systemLevel) {
  65             this.systemLevel = systemLevel;
  66         }
  67     }
  68 
  69     private System.Logger.Level getSystemLoggerLevel(Level l) {
  70         switch (l) {
  71             case ALL :    return System.Logger.Level.ALL;
  72             case FINEST:  return System.Logger.Level.TRACE;
  73             case FINER:   return System.Logger.Level.TRACE;
  74             case FINE:    return System.Logger.Level.DEBUG;
  75             case INFO:    return System.Logger.Level.INFO;
  76             case WARNING: return System.Logger.Level.WARNING;
  77             case SEVERE:  return System.Logger.Level.ERROR;
  78             case OFF:     return System.Logger.Level.OFF;
  79             default :     return System.Logger.Level.ALL;
  80         }
  81     }
  82 
  83 
  84     // Table of known loggers.  Maps names to PlatformLoggers.
  85     private static final Map<String,WeakReference<PlatformLogger>> loggers =
  86         new HashMap<>();
  87 
  88     /**
  89      * Returns a PlatformLogger of a given name.
  90      * @param name the name of the logger
  91      * @return a PlatformLogger
  92      */
  93     public static synchronized PlatformLogger getLogger(String name) {
  94         PlatformLogger log = null;
  95         WeakReference<PlatformLogger> ref = loggers.get(name);
  96         if (ref != null) {
  97             log = ref.get();
  98         }
  99         if (log == null) {
 100             log = new PlatformLogger(System.getLogger(name));
 101             loggers.put(name, new WeakReference<>(log));
 102         }
 103         return log;
 104     }
 105 
 106 
 107     private final System.Logger loggerProxy;
 108     private PlatformLogger(System.Logger loggerProxy) {
 109         this.loggerProxy = loggerProxy;
 110     }
 111 
 112     // ------------------------------------------------------------------------
 113     //          From System.Logger interface
 114     // ------------------------------------------------------------------------
 115 
 116     /**
 117      * Gets the name for this platform logger.
 118      * @return the name of the platform logger.
 119      */
 120     @Override
 121     public String getName() {
 122        throw new UnsupportedOperationException("not implemented");
 123     }
 124 
 125     @Override
 126     public boolean isLoggable(System.Logger.Level level) {
 127         throw new UnsupportedOperationException("not implemented");
 128     }
 129 
 130     @Override
 131     public void log(System.Logger.Level level, ResourceBundle bundle, String format, Object... params) {
 132         throw new UnsupportedOperationException("not implemented");
 133     }
 134 
 135     @Override
 136     public void log(System.Logger.Level level, ResourceBundle bundle, String msg, Throwable thrown) {
 137         throw new UnsupportedOperationException("not implemented");
 138     }
 139 
 140     // ------------------------------------------------------------------------
 141 
 142 
 143     /**
 144      * Returns true if a message of the given level would actually
 145      * be logged by this logger.
 146      * @param level the level
 147      * @return whether a message of that level would be logged
 148      */
 149     public boolean isLoggable(Level level) {
 150         if (level == null) {
 151             throw new NullPointerException();
 152         }
 153 
 154         return loggerProxy.isLoggable(getSystemLoggerLevel(level));
 155     }
 156 
 157     /**
 158      * Logs a SEVERE message.
 159      * @param msg the message
 160      */
 161     public void severe(String msg) {
 162         if (!loggingEnabled) return;
 163         loggerProxy.log(System.Logger.Level.ERROR, msg, (Object[])null);
 164     }
 165 
 166     public void severe(String msg, Throwable t) {
 167         if (!loggingEnabled) return;
 168         loggerProxy.log(System.Logger.Level.ERROR, msg, t);
 169     }
 170 
 171     public void severe(String msg, Object... params) {
 172         if (!loggingEnabled) return;
 173         loggerProxy.log(System.Logger.Level.ERROR, msg, params);
 174     }
 175 
 176     /**
 177      * Logs a WARNING message.
 178      * @param msg the message
 179      */
 180     public void warning(String msg) {
 181         if (!loggingEnabled) return;
 182         loggerProxy.log(System.Logger.Level.WARNING, msg, (Object[])null);
 183     }
 184 
 185     public void warning(String msg, Throwable t) {
 186         if (!loggingEnabled) return;
 187         loggerProxy.log(System.Logger.Level.WARNING, msg, t);
 188     }
 189 
 190     public void warning(String msg, Object... params) {
 191         if (!loggingEnabled) return;
 192         loggerProxy.log(System.Logger.Level.WARNING, msg, params);
 193     }
 194 
 195     /**
 196      * Logs an INFO message.
 197      * @param msg the message
 198      */
 199     public void info(String msg) {
 200         if (!loggingEnabled) return;
 201         loggerProxy.log(System.Logger.Level.INFO, msg, (Object[])null);
 202     }
 203 
 204     public void info(String msg, Throwable t) {
 205         if (!loggingEnabled) return;
 206         loggerProxy.log(System.Logger.Level.INFO, msg, t);
 207     }
 208 
 209     public void info(String msg, Object... params) {
 210         if (!loggingEnabled) return;
 211         loggerProxy.log(System.Logger.Level.INFO, msg, params);
 212     }
 213 
 214     /**
 215      * Logs a FINE message.
 216      * @param msg the message
 217      */
 218     public void fine(String msg) {
 219         if (!loggingEnabled) return;
 220         loggerProxy.log(System.Logger.Level.DEBUG, msg, (Object[])null);
 221     }
 222 
 223     public void fine(String msg, Throwable t) {
 224         if (!loggingEnabled) return;
 225         loggerProxy.log(System.Logger.Level.DEBUG, msg, t);
 226     }
 227 
 228     public void fine(String msg, Object... params) {
 229         if (!loggingEnabled) return;
 230         loggerProxy.log(System.Logger.Level.DEBUG, msg, params);
 231     }
 232 
 233     /**
 234      * Logs a FINER message.
 235      * @param msg the message
 236      */
 237     public void finer(String msg) {
 238         if (!loggingEnabled) return;
 239         loggerProxy.log(System.Logger.Level.TRACE, msg, (Object[])null);
 240     }
 241 
 242     public void finer(String msg, Throwable t) {
 243         if (!loggingEnabled) return;
 244         loggerProxy.log(System.Logger.Level.TRACE, msg, t);
 245     }
 246 
 247     public void finer(String msg, Object... params) {
 248         if (!loggingEnabled) return;
 249         loggerProxy.log(System.Logger.Level.TRACE, msg, params);
 250     }
 251 
 252     /**
 253      * Logs a FINEST message.
 254      * @param msg the message
 255      */
 256     public void finest(String msg) {
 257         if (!loggingEnabled) return;
 258         loggerProxy.log(System.Logger.Level.TRACE, msg, (Object[])null);
 259     }
 260 
 261     public void finest(String msg, Throwable t) {
 262         if (!loggingEnabled) return;
 263         loggerProxy.log(System.Logger.Level.TRACE, msg, t);
 264     }
 265 
 266     public void finest(String msg, Object... params) {
 267         if (!loggingEnabled) return;
 268         loggerProxy.log(System.Logger.Level.TRACE, msg, params);
 269     }
 270 
 271     // Methods for unit tests
 272     private boolean loggingEnabled = true;
 273     public void enableLogging() {
 274         loggingEnabled = true;
 275     };
 276 
 277     public void disableLogging() {
 278         loggingEnabled = false;
 279     }
 280 }
 281