# HG changeset patch # User dfuchs # Date 1484740056 0 # Node ID 1c192219e3dde00284b2379a3242a6782ea45d6a # Parent d75d9ff8d4e79326a46150d6030dc20dd0b0ee58 8172886: Add a test that shows how the LogManager can be implemented by a module Reviewed-by: mchung diff -r d75d9ff8d4e7 -r 1c192219e3dd jdk/test/java/util/logging/modules/LogManagerInModule/LogManagerInModuleTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/logging/modules/LogManagerInModule/LogManagerInModuleTest.java Wed Jan 18 11:47:36 2017 +0000 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.nio.file.Paths; +import java.util.logging.Handler; +import java.util.logging.LogManager; +import java.util.logging.Logger; + +/** + * @test + * @bug 8172886 + * @summary Verifies that a custom LogManager or custom Handler can be + * instantiated by the logging system if they are in a package + * that is exported to java.logging by a module. + * @build test.logmanager/test.logmanager.TestLogManager + * test.handlers/test.handlers.TestHandler + * test.config/test.config.LogConfig + * LogManagerInModuleTest + * @run main/othervm --add-modules test.logmanager,test.handlers + * -Djava.util.logging.manager=test.logmanager.TestLogManager + * LogManagerInModuleTest + * @run main/othervm --add-modules test.logmanager,test.handlers,test.config + * -Djava.util.logging.manager=test.logmanager.TestLogManager + * -Djava.util.logging.config.class=test.config.LogConfig + * LogManagerInModuleTest + * + * @author danielfuchs + */ +public class LogManagerInModuleTest { + + public static void main(String[] args) throws Exception { + if (System.getProperty("java.util.logging.config.class", null) == null) { + System.setProperty("java.util.logging.config.file", + Paths.get(System.getProperty("test.src", "src"), + "logging.properties").toString()); + } + // sanity check + if (LogManagerInModuleTest.class.getModule().isNamed()) { + throw new RuntimeException("Unexpected named module for " + + LogManagerInModuleTest.class + ": " + + LogManagerInModuleTest.class.getModule().getName()); + } + + // now check that the LogManager was correctly instantiated. + LogManager manager = LogManager.getLogManager(); + System.out.println("LogManager: " + manager); + Class logManagerClass = manager.getClass(); + if (!"test.logmanager".equals(logManagerClass.getModule().getName())) { + throw new RuntimeException("Bad module for log manager: " + + logManagerClass.getModule() + "; class is: " + + logManagerClass.getName()); + } + + Logger logger = Logger.getLogger("com.xyz.foo"); + Handler[] handlers = logger.getHandlers(); + if (handlers.length != 1) { + throw new RuntimeException("Expected 1 handler, found " + handlers.length); + } + Class handlerClass = handlers[0].getClass(); + if (!"test.handlers".equals(handlerClass.getModule().getName())) { + throw new RuntimeException("Bad module for handler: " + + handlerClass.getModule() + "; class is: " + + handlerClass.getName()); + } + } + +} diff -r d75d9ff8d4e7 -r 1c192219e3dd jdk/test/java/util/logging/modules/LogManagerInModule/logging.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/logging/modules/LogManagerInModule/logging.properties Wed Jan 18 11:47:36 2017 +0000 @@ -0,0 +1,56 @@ +############################################################ +# Global properties +############################################################ + +# "handlers" specifies a comma separated list of log Handler +# classes. These handlers will be installed during VM startup. +# Note that these classes must be on the system classpath. +# By default we only configure a ConsoleHandler, which will only +# show messages at the INFO and above levels. +handlers= java.util.logging.ConsoleHandler + +# To also add the FileHandler, use the following line instead. +#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler + +# Default global logging level. +# This specifies which kinds of events are logged across +# all loggers. For any given facility this global level +# can be overriden by a facility specific level +# Note that the ConsoleHandler also has a separate level +# setting to limit messages printed to the console. +.level= INFO + +############################################################ +# Handler specific properties. +# Describes specific configuration info for Handlers. +############################################################ + +# default file output is in user's home directory. +java.util.logging.FileHandler.pattern = %h/java%u.log +java.util.logging.FileHandler.limit = 50000 +java.util.logging.FileHandler.count = 1 +# Default number of locks FileHandler can obtain synchronously. +# This specifies maximum number of attempts to obtain lock file by FileHandler +# implemented by incrementing the unique field %u as per FileHandler API documentation. +java.util.logging.FileHandler.maxLocks = 100 +java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter + +# Limit the message that are printed on the console to INFO and above. +java.util.logging.ConsoleHandler.level = INFO +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter + +# Example to customize the SimpleFormatter output format +# to print one-line log message like this: +# : [] +# +# java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n + +############################################################ +# Facility specific properties. +# Provides extra control for each logger. +############################################################ + +# For example, set the com.xyz.foo logger to only log SEVERE +# messages: +com.xyz.foo.level = SEVERE +com.xyz.foo.handlers = test.handlers.TestHandler diff -r d75d9ff8d4e7 -r 1c192219e3dd jdk/test/java/util/logging/modules/LogManagerInModule/test.config/module-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/logging/modules/LogManagerInModule/test.config/module-info.java Wed Jan 18 11:47:36 2017 +0000 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +module test.config { + requires java.logging; + requires test.handlers; + // makes it possible for java.logging to instantiate test.config.LogConfig; + // this doesn't need to be a qualified export, but making it so will prevent + // any other module from being able to instantiate the provided classes. + exports test.config to java.logging; +} diff -r d75d9ff8d4e7 -r 1c192219e3dd jdk/test/java/util/logging/modules/LogManagerInModule/test.config/test/config/LogConfig.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/logging/modules/LogManagerInModule/test.config/test/config/LogConfig.java Wed Jan 18 11:47:36 2017 +0000 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package test.config; + +import java.util.ArrayList; +import java.util.List; +import java.util.logging.LogManager; +import java.util.logging.Logger; +import test.handlers.TestHandler; + +/** + * A dummy class that configures the logging system. + * @author danielfuchs + */ +public class LogConfig { + private static final List LOGGERS = new ArrayList<>(); + public LogConfig() { + LogManager manager = LogManager.getLogManager(); + Logger logger = Logger.getLogger("com.xyz.foo"); + if (logger.getHandlers().length > 0) { + System.err.println(this.getClass().getName() + ": " + + "Unexpected handlers: " + + List.of(logger.getHandlers())); + throw new RuntimeException("Unexpected handlers: " + + List.of(logger.getHandlers())); + } + logger.addHandler(new TestHandler()); + LOGGERS.add(logger); + } +} diff -r d75d9ff8d4e7 -r 1c192219e3dd jdk/test/java/util/logging/modules/LogManagerInModule/test.handlers/module-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/logging/modules/LogManagerInModule/test.handlers/module-info.java Wed Jan 18 11:47:36 2017 +0000 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +module test.handlers { + requires transitive java.logging; + // makes it possible for java.logging and test.config to instantiate + // test.handlers.TestHandler; + // this doesn't need to be a qualified export, but making it so will prevent + // any other module from being able to instantiate the provided classes. + exports test.handlers to java.logging, test.config; +} diff -r d75d9ff8d4e7 -r 1c192219e3dd jdk/test/java/util/logging/modules/LogManagerInModule/test.handlers/test/handlers/TestHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/logging/modules/LogManagerInModule/test.handlers/test/handlers/TestHandler.java Wed Jan 18 11:47:36 2017 +0000 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package test.handlers; + +import java.util.logging.Handler; +import java.util.logging.LogRecord; + +/** + * A dummy Handler that does nothing. + * @author danielfuchs + */ +public class TestHandler extends Handler { + + @Override + public void publish(LogRecord record) { + } + + @Override + public void flush() { + } + + @Override + public void close() throws SecurityException { + } + +} diff -r d75d9ff8d4e7 -r 1c192219e3dd jdk/test/java/util/logging/modules/LogManagerInModule/test.logmanager/module-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/logging/modules/LogManagerInModule/test.logmanager/module-info.java Wed Jan 18 11:47:36 2017 +0000 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +module test.logmanager { + requires java.logging; + // makes it possible for java.logging to instantiate + // test.logmanager.TestLogManager; + // this doesn't need to be a qualified export, but making it so will prevent + // any other module from being able to instantiate the provided classes. + exports test.logmanager to java.logging; +} diff -r d75d9ff8d4e7 -r 1c192219e3dd jdk/test/java/util/logging/modules/LogManagerInModule/test.logmanager/test/logmanager/TestLogManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/logging/modules/LogManagerInModule/test.logmanager/test/logmanager/TestLogManager.java Wed Jan 18 11:47:36 2017 +0000 @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package test.logmanager; + +import java.util.logging.LogManager; + +/** + * A dummy LogManager that simply extends the standard class. + * @author danielfuchs + */ +public class TestLogManager extends LogManager { + +}