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.HashMap; 30 import java.util.Map; 31 import java.util.ResourceBundle; 32 33 /** 34 * Platform logger provides an API for the JavaFX components to log 35 * messages. It is an internal logger intended to be used by JavaFX modules. 36 * 37 * The PlatformLogger uses an underlying System.Logger 38 * obtained by calling {@link java.lang.System.Logger#getLogger(String)} 39 * 40 * PlatformLogger implements System.Logger as to facilitiate logging of 41 * calling class and method. 42 * Note : JDK internal loggers know to skip any calls from System.Logger 43 * classes when looking for the calling class / method. 44 */ 45 public class PlatformLogger implements System.Logger { 46 47 /** 48 * PlatformLogger logging levels. 49 */ 50 public static enum Level { 51 // The name and value must match that of {@code java.lang.System.Level}s. 52 // Declare in ascending order of the given value 53 ALL(System.Logger.Level.ALL), 54 FINEST(System.Logger.Level.TRACE), 55 FINER(System.Logger.Level.TRACE), 56 FINE(System.Logger.Level.DEBUG), 57 INFO(System.Logger.Level.INFO), 58 WARNING(System.Logger.Level.WARNING), 59 SEVERE(System.Logger.Level.ERROR), 60 OFF(System.Logger.Level.OFF); 61 62 final System.Logger.Level systemLevel; 63 Level(System.Logger.Level systemLevel) { 64 this.systemLevel = systemLevel; 65 } 66 } 67 68 private System.Logger.Level getSystemLoggerLevel(Level l) { 69 switch (l) { 70 case ALL : return System.Logger.Level.ALL; 71 case FINEST: return System.Logger.Level.TRACE; 72 case FINER: return System.Logger.Level.TRACE; 73 case FINE: return System.Logger.Level.DEBUG; 74 case INFO: return System.Logger.Level.INFO; 75 case WARNING: return System.Logger.Level.WARNING; 76 case SEVERE: return System.Logger.Level.ERROR; 77 case OFF: return System.Logger.Level.OFF; 78 default : return System.Logger.Level.ALL; 79 } 80 } 81 82 83 // Table of known loggers. Maps names to PlatformLoggers. 84 private static final Map<String,WeakReference<PlatformLogger>> loggers = 85 new HashMap<>(); 86 87 /** 88 * Returns a PlatformLogger of a given name. 89 * @param name the name of the logger 90 * @return a PlatformLogger 91 */ 92 public static synchronized PlatformLogger getLogger(String name) { 93 PlatformLogger log = null; 94 WeakReference<PlatformLogger> ref = loggers.get(name); 95 if (ref != null) { 96 log = ref.get(); 97 } 98 if (log == null) { 99 log = new PlatformLogger(System.getLogger(name)); 100 loggers.put(name, new WeakReference<>(log)); 101 } 102 return log; 103 } 104 105 106 private final System.Logger loggerProxy; 107 protected PlatformLogger(System.Logger loggerProxy) { 108 this.loggerProxy = loggerProxy; 109 } 110 111 // ------------------------------------------------------------------------ 112 // From System.Logger interface 113 // ------------------------------------------------------------------------ 114 115 /** 116 * Gets the name for this platform logger. 117 * @return the name of the platform logger. 118 */ 119 @Override 120 public String getName() { 121 throw new UnsupportedOperationException("not implemented"); 122 } 123 124 @Override 125 public boolean isLoggable(System.Logger.Level level) { 126 throw new UnsupportedOperationException("not implemented"); 127 } 128 129 @Override 130 public void log(System.Logger.Level level, ResourceBundle bundle, String format, Object... params) { 131 throw new UnsupportedOperationException("not implemented"); 132 } 133 134 @Override 135 public void log(System.Logger.Level level, ResourceBundle bundle, String msg, Throwable thrown) { 136 throw new UnsupportedOperationException("not implemented"); 137 } 138 139 // ------------------------------------------------------------------------ 140 141 142 /** 143 * Returns true if a message of the given level would actually 144 * be logged by this logger. 145 * @param level the level 146 * @return whether a message of that level would be logged 147 */ 148 public boolean isLoggable(Level level) { 149 if (level == null) { 150 throw new NullPointerException(); 151 } 152 153 return loggerProxy.isLoggable(getSystemLoggerLevel(level)); 154 } 155 156 /** 157 * Logs a SEVERE message. 158 * @param msg the message 159 */ 160 public void severe(String msg) { 161 if (!loggingEnabled) return; 162 loggerProxy.log(System.Logger.Level.ERROR, msg, (Object[])null); 163 } 164 165 public void severe(String msg, Throwable t) { 166 if (!loggingEnabled) return; 167 loggerProxy.log(System.Logger.Level.ERROR, msg, t); 168 } 169 170 public void severe(String msg, Object... params) { 171 if (!loggingEnabled) return; 172 loggerProxy.log(System.Logger.Level.ERROR, msg, params); 173 } 174 175 /** 176 * Logs a WARNING message. 177 * @param msg the message 178 */ 179 public void warning(String msg) { 180 if (!loggingEnabled) return; 181 loggerProxy.log(System.Logger.Level.WARNING, msg, (Object[])null); 182 } 183 184 public void warning(String msg, Throwable t) { 185 if (!loggingEnabled) return; 186 loggerProxy.log(System.Logger.Level.WARNING, msg, t); 187 } 188 189 public void warning(String msg, Object... params) { 190 if (!loggingEnabled) return; 191 loggerProxy.log(System.Logger.Level.WARNING, msg, params); 192 } 193 194 /** 195 * Logs an INFO message. 196 * @param msg the message 197 */ 198 public void info(String msg) { 199 if (!loggingEnabled) return; 200 loggerProxy.log(System.Logger.Level.INFO, msg, (Object[])null); 201 } 202 203 public void info(String msg, Throwable t) { 204 if (!loggingEnabled) return; 205 loggerProxy.log(System.Logger.Level.INFO, msg, t); 206 } 207 208 public void info(String msg, Object... params) { 209 if (!loggingEnabled) return; 210 loggerProxy.log(System.Logger.Level.INFO, msg, params); 211 } 212 213 /** 214 * Logs a FINE message. 215 * @param msg the message 216 */ 217 public void fine(String msg) { 218 if (!loggingEnabled) return; 219 loggerProxy.log(System.Logger.Level.DEBUG, msg, (Object[])null); 220 } 221 222 public void fine(String msg, Throwable t) { 223 if (!loggingEnabled) return; 224 loggerProxy.log(System.Logger.Level.DEBUG, msg, t); 225 } 226 227 public void fine(String msg, Object... params) { 228 if (!loggingEnabled) return; 229 loggerProxy.log(System.Logger.Level.DEBUG, msg, params); 230 } 231 232 /** 233 * Logs a FINER message. 234 * @param msg the message 235 */ 236 public void finer(String msg) { 237 if (!loggingEnabled) return; 238 loggerProxy.log(System.Logger.Level.TRACE, msg, (Object[])null); 239 } 240 241 public void finer(String msg, Throwable t) { 242 if (!loggingEnabled) return; 243 loggerProxy.log(System.Logger.Level.TRACE, msg, t); 244 } 245 246 public void finer(String msg, Object... params) { 247 if (!loggingEnabled) return; 248 loggerProxy.log(System.Logger.Level.TRACE, msg, params); 249 } 250 251 /** 252 * Logs a FINEST message. 253 * @param msg the message 254 */ 255 public void finest(String msg) { 256 if (!loggingEnabled) return; 257 loggerProxy.log(System.Logger.Level.TRACE, msg, (Object[])null); 258 } 259 260 public void finest(String msg, Throwable t) { 261 if (!loggingEnabled) return; 262 loggerProxy.log(System.Logger.Level.TRACE, msg, t); 263 } 264 265 public void finest(String msg, Object... params) { 266 if (!loggingEnabled) return; 267 loggerProxy.log(System.Logger.Level.TRACE, msg, params); 268 } 269 270 // Methods for unit tests 271 private boolean loggingEnabled = true; 272 public void enableLogging() { 273 loggingEnabled = true; 274 }; 275 276 public void disableLogging() { 277 loggingEnabled = false; 278 } 279 } 280