package org.codehaus.mojo.jaxb2.shared.environment.logging; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import org.apache.maven.plugin.logging.Log; import org.codehaus.mojo.jaxb2.AbstractJaxbMojo; import org.codehaus.mojo.jaxb2.shared.Validate; import org.codehaus.mojo.jaxb2.shared.environment.AbstractLogAwareFacet; import java.util.ArrayList; import java.util.List; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; /** * EnvironmentFacet for replacing Handlers from Java Util Logging with a Maven Log. * This is required as an environment facet for capturing log statements from tools * that use the Java Util Logging system internally - such as the JDK SchemaGen tool. * * @author <a href="mailto:lj@jguru.se">Lennart Jörelid</a>, jGuru Europe AB * @since 2.1 */ public class LoggingHandlerEnvironmentFacet extends AbstractLogAwareFacet { /** * Standard logger names/categories for the java.util.Logger. */ public static final String[] DEFAULT_LOGGER_NAMES = new String[]{"com.sun", "javax.xml", "javax.tools"}; // Internal state private boolean restored; private Logger rootLogger; private Level originalRootLoggerLevel; private List<Handler> originalHandlers; private MavenLogHandler mavenLogHandler; private String logPrefix; private String encoding; private String[] loggerNamePrefixes; /** * Creates a new JavaLoggingEnvironment, using the supplied variables to set up a MavenLogHandler. * The MavenLogHandler is then assigned to the root logger. * * @param logPrefix The prefix to use for the logger, indicating which tool is used by the log. Example: "XJC" * or "SchemaGen". * @param mavenLog The active Maven Log. * @param encoding The configured encoding. * @param loggerNamePrefixes The prefixes of the Logger names to be permitted logging. */ public LoggingHandlerEnvironmentFacet(final String logPrefix, final Log mavenLog, final String encoding, final String[] loggerNamePrefixes) { super(mavenLog); // Check sanity Validate.notEmpty(encoding, "encoding"); Validate.notNull(loggerNamePrefixes, "loggerNamePrefixes"); // Assign internal state this.originalHandlers = new ArrayList<Handler>(); this.logPrefix = logPrefix; rootLogger = Logger.getLogger(""); originalRootLoggerLevel = rootLogger.getLevel(); this.encoding = encoding; this.loggerNamePrefixes = loggerNamePrefixes; } /** * {@inheritDoc} * <p>Redirects JUL logging statements to the Maven Log.</p> */ @Override public void setup() { // Redirect the JUL Logging statements to the Maven Log. rootLogger.setLevel(MavenLogHandler.getJavaUtilLoggingLevelFor(log)); this.mavenLogHandler = new MavenLogHandler(log, logPrefix, encoding, loggerNamePrefixes); for (Handler current : rootLogger.getHandlers()) { // Stash the original handlers from the RootLogger. originalHandlers.add(current); // Remove the original handler from the RootLogger. rootLogger.removeHandler(current); } // Add the new Maven Log handler. rootLogger.addHandler(this.mavenLogHandler); } /** * Restores the original root Logger state, including Level and Handlers. */ public void restore() { if (!restored) { // Remove the extra Handler from the RootLogger rootLogger.removeHandler(mavenLogHandler); // Restore the original state to the Root logger rootLogger.setLevel(originalRootLoggerLevel); for (Handler current : originalHandlers) { rootLogger.addHandler(current); } // All done. restored = true; } } /** * Factory method creating a new LoggingHandlerEnvironmentFacet wrapping the supplied properties. * * @param mavenLog The active Maven Log. * @param caller The AbstractJaxbMojo subclass which invoked this LoggingHandlerEnvironmentFacet factory method. * @param encoding The encoding used by the Maven Mojo subclass. * @return A fully set up LoggingHandlerEnvironmentFacet */ public static LoggingHandlerEnvironmentFacet create(final Log mavenLog, final Class<? extends AbstractJaxbMojo> caller, final String encoding) { // Check sanity Validate.notNull(mavenLog, "mavenLog"); Validate.notNull(caller, "caller"); Validate.notEmpty(encoding, "encoding"); // Find the standard log prefix for the tool in question. final String logPrefix = caller.getClass().getCanonicalName().toUpperCase().contains("XJC") ? "XJC" : "SchemaGen"; // All done. return new LoggingHandlerEnvironmentFacet(logPrefix, mavenLog, encoding, DEFAULT_LOGGER_NAMES); } }