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.shared.Validate;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Filter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.SimpleFormatter;
/**
* Handler implementation which delegates its actual logging to an internal Maven log.
* This is required to capture logging 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.0
*/
public class MavenLogHandler extends Handler {
// Internal state
private Log log;
private String prefix;
/**
* Creates a new MavenLogHandler which adapts a {@link Handler} to emit log messages onto a Maven Log.
*
* @param log The Maven Log to emit log messages to.
* @param prefix An optional prefix used to prefix any log message.
* @param encoding The encoding which should be used.
* @param acceptedLogRecordPrefixes A non-null list of prefixes holding LogRecord logger names for
* permitted/accepted LogRecords.
*/
public MavenLogHandler(final Log log,
final String prefix,
final String encoding,
final String[] acceptedLogRecordPrefixes) {
// Check sanity
Validate.notNull(log, "log");
Validate.notNull(prefix, "prefix");
Validate.notEmpty(encoding, "encoding");
// Assign internal state
this.log = log;
this.prefix = prefix.isEmpty() ? "" : "[" + prefix + "]: ";
setFormatter(new SimpleFormatter());
setLevel(getJavaUtilLoggingLevelFor(log));
try {
setEncoding(encoding);
} catch (UnsupportedEncodingException e) {
log.error("Could not use encoding '" + encoding + "'", e);
}
if (acceptedLogRecordPrefixes != null && acceptedLogRecordPrefixes.length > 0) {
setFilter(getLoggingFilter(acceptedLogRecordPrefixes));
}
}
/**
* {@inheritDoc}
*/
@Override
public void publish(final LogRecord record) {
if (this.isLoggable(record)) {
final Level level = record.getLevel();
final String message = prefix + getFormatter().format(record);
if (Level.SEVERE.equals(level)) {
log.error(message);
} else if (Level.WARNING.equals(level)) {
log.warn(message);
} else if (Level.INFO.equals(level)) {
log.info(message);
} else {
log.debug(message);
}
}
}
/**
* {@inheritDoc}
*/
@Override
public void flush() {
// Do nothing.
}
/**
* {@inheritDoc}
*/
@Override
public void close() throws SecurityException {
// Do nothing.
}
/**
* Retrieves the JUL Level matching the supplied Maven Log.
*
* @param mavenLog A non-null Maven Log.
* @return The Corresponding JUL Level.
*/
public static Level getJavaUtilLoggingLevelFor(final Log mavenLog) {
// Check sanity
Validate.notNull(mavenLog, "mavenLog");
Level toReturn = Level.SEVERE;
if (mavenLog.isDebugEnabled()) {
toReturn = Level.FINER;
} else if (mavenLog.isInfoEnabled()) {
toReturn = Level.INFO;
} else if (mavenLog.isWarnEnabled()) {
toReturn = Level.WARNING;
}
// All Done.
return toReturn;
}
/**
* Retrieves a java.util.Logging filter used to ensure that only LogRecords whose
* logger names start with any of the required prefixes are logged.
*
* @param requiredPrefixes A non-null list of prefixes to be matched with the LogRecord logger names.
* @return A java.util.logging Filter that only permits logging LogRecords whose
* logger names start with any of the required prefixes.
*/
public static Filter getLoggingFilter(final String... requiredPrefixes) {
// Check sanity
Validate.notNull(requiredPrefixes, "requiredPrefixes");
// All done.
return new Filter() {
// Internal state
private List<String> requiredPrefs = Arrays.asList(requiredPrefixes);
@Override
public boolean isLoggable(final LogRecord record) {
final String loggerName = record.getLoggerName();
for (String current : requiredPrefs) {
if (loggerName.startsWith(current)) {
return true;
}
}
// No matches found.
return false;
}
};
}
}