package org.jboss.seam.ui.facelet;
import static org.jboss.seam.ScopeType.APPLICATION;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.lang.reflect.Field;
import java.util.logging.Filter;
import java.util.logging.Logger;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Startup;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.interop.jul.Log4JConversionFilter;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.util.Reflections;
import com.sun.facelets.FaceletViewHandler;
import com.sun.facelets.compiler.TagLibraryConfig;
import com.sun.facelets.impl.DefaultFaceletFactory;
import com.sun.facelets.tag.jsf.ComponentHandler;
import com.sun.facelets.util.Resource;
@Name("org.jboss.seam.ui.facelet.faceletsJBossLogging")
@Scope(APPLICATION)
@Install(classDependencies={"com.sun.facelets.Facelet", "org.jboss.logging.Logger", "org.apache.log4j.Logger", "org.jboss.seam.interop.jul.Log4JConversionFilter"}, precedence=BUILT_IN)
@Startup
@BypassInterceptors
public class FaceletsJBossLogging
{
private LogProvider log = Logging.getLogProvider(FaceletsJBossLogging.class);
@SuppressWarnings("deprecation")
@Create
public void create()
{
Filter conversionFilter = null;
try
{
conversionFilter = new Log4JConversionFilter();
}
catch (Exception e)
{
// Filter isn't installed in the container
return;
}
try
{
java.util.logging.Logger julLogger;
// Gah have to do this by reflection as the loggers are protected
// And some aren't static, so this really is best effort
julLogger = getPrivateStaticLogger(TagLibraryConfig.class, "log");
julLogger.setFilter(conversionFilter);
julLogger = getPrivateStaticLogger(com.sun.facelets.compiler.Compiler.class, "log");
julLogger.setFilter(conversionFilter);
julLogger = getPrivateStaticLogger(DefaultFaceletFactory.class, "log");
julLogger.setFilter(conversionFilter);
julLogger = getPrivateStaticLogger(TagLibraryConfig.class, "log");
julLogger.setFilter(conversionFilter);
julLogger = getPrivateStaticLogger(ComponentHandler.class, "log");
julLogger.setFilter(conversionFilter);
julLogger = getPrivateStaticLogger(Resource.class, "log");
julLogger.setFilter(conversionFilter);
julLogger = getPrivateStaticLogger(FaceletViewHandler.class, "log");
julLogger.setFilter(conversionFilter);
// These ones are in a package-scoped class
julLogger = getPrivateStaticLogger("com.sun.facelets.compiler.CompilationManager", "log");
julLogger.setFilter(conversionFilter);
julLogger = getPrivateStaticLogger("com.sun.facelets.tag.jsf.ComponentRule", "log");
julLogger.setFilter(conversionFilter);
julLogger = getPrivateStaticLogger("com.sun.facelets.tag.MetaRulesetImpl", "log");
julLogger.setFilter(conversionFilter);
}
catch (Exception e)
{
log.warn("Unable to wrap Facelets JDK logging in Log4j logging", e);
}
}
private Logger getPrivateStaticLogger(Class clazz, String fieldName) throws Exception
{
Field field = Reflections.getField(clazz, fieldName);
field.setAccessible(true);
return (Logger) Reflections.get(field, new Object());
}
private Logger getPrivateStaticLogger(String className, String fieldName) throws Exception
{
return getPrivateStaticLogger(Reflections.classForName(className), fieldName);
}
}