/* * $Id$ * * License Agreement. * * Rich Faces - Natural Ajax for Java Server Faces (JSF) * * Copyright (C) 2007 Exadel, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package org.richfaces.cdk; import java.util.logging.Level; import java.util.logging.LogRecord; /** * <p class="changed_added_4_0"> * That logger delegates all calls to the JDK {@link java.util.logging.Logger} * </p> * * @author asmirnov@exadel.com */ public class JavaLogger implements Logger { public static final String CDK_LOG = "org.richfaces.cdk"; private static final String CLASS_NAME = JavaLogger.class.getName(); private int errorCount = 0; private Throwable firstError; private java.util.logging.Logger jdkLogger = java.util.logging.Logger.getLogger(CDK_LOG); private void fillCallerData(String fqn, LogRecord record) { StackTraceElement[] stackTrace = new Exception().getStackTrace(); int i = 0; for (; i < stackTrace.length; i++) { if (fqn.equals(stackTrace[i].getClassName())) { break; } } int idx = i + 1; for (; idx < stackTrace.length; idx++) { if (!fqn.equals(stackTrace[idx].getClassName())) { break; } } if (idx < stackTrace.length) { record.setSourceMethodName(stackTrace[idx].getMethodName()); record.setSourceClassName(stackTrace[idx].getClassName()); } } private LogRecord createRecord(Level level, CharSequence message, Throwable thrown) { // millis and thread are filled by the constructor LogRecord record = new LogRecord(level, message != null ? message.toString() : null); // TODO resource bundle? record.setLoggerName(jdkLogger.getName()); record.setThrown(thrown); fillCallerData(CLASS_NAME, record); return record; } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#debug(java.lang.CharSequence) */ @Override public void debug(CharSequence content) { if (jdkLogger.isLoggable(Level.FINE)) { jdkLogger.log(createRecord(Level.FINE, content, null)); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#debug(java.lang.CharSequence, java.lang.Throwable) */ @Override public void debug(CharSequence content, Throwable error) { if (jdkLogger.isLoggable(Level.FINE)) { jdkLogger.log(createRecord(Level.FINE, content, error)); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#debug(java.lang.Throwable) */ @Override public void debug(Throwable error) { if (jdkLogger.isLoggable(Level.FINE)) { jdkLogger.log(createRecord(Level.FINE, "", error)); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#error(java.lang.CharSequence) */ @Override public void error(CharSequence content) { errorCount++; firstError = new CdkException(content.toString()); if (jdkLogger.isLoggable(Level.SEVERE)) { jdkLogger.log(createRecord(Level.SEVERE, content, null)); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#error(java.lang.CharSequence, java.lang.Throwable) */ @Override public void error(CharSequence content, Throwable error) { errorCount++; firstError = error; if (jdkLogger.isLoggable(Level.SEVERE)) { jdkLogger.log(createRecord(Level.SEVERE, content, error)); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#error(java.lang.Throwable) */ @Override public void error(Throwable error) { errorCount++; firstError = error; if (jdkLogger.isLoggable(Level.SEVERE)) { jdkLogger.log(createRecord(Level.SEVERE, "", error)); } } @Override public int getErrorCount() { return errorCount; } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#info(java.lang.CharSequence) */ @Override public void info(CharSequence content) { if (jdkLogger.isLoggable(Level.INFO)) { jdkLogger.log(createRecord(Level.INFO, content, null)); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#info(java.lang.CharSequence, java.lang.Throwable) */ @Override public void info(CharSequence content, Throwable error) { if (jdkLogger.isLoggable(Level.INFO)) { jdkLogger.log(createRecord(Level.INFO, content, error)); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#info(java.lang.Throwable) */ @Override public void info(Throwable error) { if (jdkLogger.isLoggable(Level.INFO)) { jdkLogger.log(createRecord(Level.INFO, "", error)); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#isDebugEnabled() */ @Override public boolean isDebugEnabled() { return jdkLogger.isLoggable(Level.FINE); } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#isErrorEnabled() */ @Override public boolean isErrorEnabled() { return jdkLogger.isLoggable(Level.SEVERE); } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#isInfoEnabled() */ @Override public boolean isInfoEnabled() { return jdkLogger.isLoggable(Level.INFO); } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#isWarnEnabled() */ @Override public boolean isWarnEnabled() { return jdkLogger.isLoggable(Level.WARNING); } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#warn(java.lang.CharSequence) */ @Override public void warn(CharSequence content) { if (jdkLogger.isLoggable(Level.WARNING)) { jdkLogger.log(createRecord(Level.WARNING, content, null)); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#warn(java.lang.CharSequence, java.lang.Throwable) */ @Override public void warn(CharSequence content, Throwable error) { if (jdkLogger.isLoggable(Level.WARNING)) { jdkLogger.log(createRecord(Level.WARNING, content, error)); } } /* * (non-Javadoc) * * @see org.richfaces.cdk.Logger#warn(java.lang.Throwable) */ @Override public void warn(Throwable error) { if (jdkLogger.isLoggable(Level.WARNING)) { jdkLogger.log(createRecord(Level.WARNING, "", error)); } } @Override public Throwable getFirstError() { return firstError; } }