Index: src/java/org/apache/james/util/logging/JamesLoggingEnabled.java
===================================================================
--- src/java/org/apache/james/util/logging/JamesLoggingEnabled.java	(revision 0)
+++ src/java/org/apache/james/util/logging/JamesLoggingEnabled.java	(revision 0)
@@ -0,0 +1,766 @@
+/****************************************************************
+ * 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.                                           *
+ ****************************************************************/
+
+package org.apache.james.util.logging;
+
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.logger.Logger;
+
+public class JamesLoggingEnabled extends AbstractLogEnabled {
+    
+    // 
+    // Composition
+    //
+
+    private final String compose(Object message) {
+        String result = "[NULL]";
+        if (message != null) {
+            try {
+                result = message.toString();
+            } catch (RuntimeException e) {
+                logForDebugging("Failed to log message", e);
+            }
+        }
+        return result;
+    }
+    
+
+    private final String compose(final Object msgPart1, final Object msgPart2) {
+        // TODO: consider adding concatination option based on system property
+        final String result = composeUsingStringBuffer(msgPart1, msgPart2);
+        return result;
+    }
+
+    private String composeUsingStringBuffer(final Object msgPart1, final Object msgPart2) {
+        final StringBuffer buffer = new StringBuffer();
+        buffer.append(msgPart1);
+        buffer.append(msgPart2);
+        return buffer.toString();
+    }
+    
+    private final String compose(final Object msgPart1, final Object msgPart2, final Object msgPart3) {
+        // TODO: consider adding concatination option based on system property
+        final String result = composeUsingStringBuffer(msgPart1, msgPart2, msgPart3);
+        return result;
+    }
+
+    private String composeUsingStringBuffer(final Object msgPart1, final Object msgPart2,final Object msgPart3) {
+        final StringBuffer buffer = new StringBuffer();
+        buffer.append(msgPart1);
+        buffer.append(msgPart2);
+        buffer.append(msgPart3);
+        return buffer.toString();
+    }
+
+    private final String compose(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4) {
+        // TODO: consider adding concatination option based on system property
+        final String result = composeUsingStringBuffer(msgPart1, msgPart2, msgPart3, msgPart4);
+        return result;
+    }
+
+    private String composeUsingStringBuffer(final Object msgPart1, final Object msgPart2,final Object msgPart3,
+            final Object msgPart4) {
+        final StringBuffer buffer = new StringBuffer();
+        buffer.append(msgPart1);
+        buffer.append(msgPart2);
+        buffer.append(msgPart3);
+        buffer.append(msgPart4);
+        return buffer.toString();
+    }
+    
+    private final String compose(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5) {
+        // TODO: consider adding concatination option based on system property
+        final String result = composeUsingStringBuffer(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5);
+        return result;
+    }
+
+    private String composeUsingStringBuffer(final Object msgPart1, final Object msgPart2,final Object msgPart3,
+            final Object msgPart4, final Object msgPart5) {
+        final StringBuffer buffer = new StringBuffer();
+        buffer.append(msgPart1);
+        buffer.append(msgPart2);
+        buffer.append(msgPart3);
+        buffer.append(msgPart4);
+        buffer.append(msgPart5);
+        return buffer.toString();
+    }
+    
+    
+    private final String compose(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Object msgPart6) {
+        // TODO: consider adding concatination option based on system property
+        final String result = composeUsingStringBuffer(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5,
+                msgPart6);
+        return result;
+    }
+
+    private String composeUsingStringBuffer(final Object msgPart1, final Object msgPart2,final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Object msgPart6) {
+        final StringBuffer buffer = new StringBuffer();
+        buffer.append(msgPart1);
+        buffer.append(msgPart2);
+        buffer.append(msgPart3);
+        buffer.append(msgPart4);
+        buffer.append(msgPart5);
+        buffer.append(msgPart6);
+        return buffer.toString();
+    }
+    
+    //
+    // 
+    // DEBUG 
+    //
+    //
+    
+    protected final void logForDebugging(final Object msg) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isDebugEnabled()) {
+                final String message = compose(msg);
+                log.debug(message);
+            }
+        }
+    }
+    
+    protected final void logForDebugging(Object msg, Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isDebugEnabled()) {
+                final String message = compose(msg);
+                log.debug(message, t);
+            }
+        }
+    }
+    
+    protected final void logForDebugging(final Object msgPart1, final Object msgPart2) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isDebugEnabled()) {
+                final String message = compose(msgPart1, msgPart2);
+                log.debug(message);
+            }
+        }
+    }
+    
+    protected final void logForDebugging(final Object msgPart1, final Object msgPart2, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isDebugEnabled()) {
+                final String message = compose(msgPart1, msgPart2);
+                log.debug(message, t);
+            }
+        }
+    }
+    
+    protected final void logForDebugging(final Object msgPart1, final Object msgPart2, final Object msgPart3) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isDebugEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3);
+                log.debug(message);
+            }
+        }
+    }
+ 
+    protected final void logForDebugging(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isDebugEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3);
+                log.debug(message, t);
+            }
+        }
+    }
+    
+    protected final void logForDebugging(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isDebugEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4);
+                log.debug(message);
+            }
+        }
+    }
+    
+    protected final void logForDebugging(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isDebugEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4);
+                log.debug(message, t);
+            }
+        }
+    }
+    
+    protected final void logForDebugging(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isDebugEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5);
+                log.debug(message);
+            }
+        }
+    }
+    
+    protected final void logForDebugging(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isDebugEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5);
+                log.debug(message, t);
+            }
+        }
+    }
+    
+    protected final void logForDebugging(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Object msgPart6) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isDebugEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5,
+                        msgPart6);
+                log.debug(message);
+            }
+        }
+    }
+    
+    protected final void logForDebugging(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Object msgPart6, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isDebugEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5,
+                        msgPart6);
+                log.debug(message, t);
+            }
+        }
+    }
+    
+
+    //
+    // 
+    // INFO 
+    //
+    //
+    
+    protected final void logInfo(final Object msg) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isInfoEnabled()) {
+                final String message = compose(msg);
+                log.info(message);
+            }
+        }
+    }
+    
+    protected final void logInfo(Object msg, Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isInfoEnabled()) {
+                final String message = compose(msg);
+                log.info(message, t);
+            }
+        }
+    }
+    
+    protected final void logInfo(final Object msgPart1, final Object msgPart2) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isInfoEnabled()) {
+                final String message = compose(msgPart1, msgPart2);
+                log.info(message);
+            }
+        }
+    }
+    
+    protected final void logInfo(final Object msgPart1, final Object msgPart2, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isInfoEnabled()) {
+                final String message = compose(msgPart1, msgPart2);
+                log.info(message, t);
+            }
+        }
+    }
+    
+    protected final void logInfo(final Object msgPart1, final Object msgPart2, final Object msgPart3) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isInfoEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3);
+                log.info(message);
+            }
+        }
+    }
+ 
+    protected final void logInfo(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isInfoEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3);
+                log.info(message, t);
+            }
+        }
+    }
+    
+    protected final void logInfo(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isInfoEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4);
+                log.info(message);
+            }
+        }
+    }
+    
+    protected final void logInfo(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isInfoEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4);
+                log.info(message, t);
+            }
+        }
+    }
+    
+    protected final void logInfo(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isInfoEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5);
+                log.info(message);
+            }
+        }
+    }
+    
+    protected final void logInfo(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isInfoEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5);
+                log.info(message, t);
+            }
+        }
+    }
+    
+    protected final void logInfo(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Object msgPart6) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isInfoEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5,
+                        msgPart6);
+                log.info(message);
+            }
+        }
+    }
+    
+    protected final void logInfo(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Object msgPart6, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isInfoEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5,
+                        msgPart6);
+                log.info(message, t);
+            }
+        }
+    }
+    
+
+    //
+    // 
+    // WARN 
+    //
+    //
+    
+    protected final void logWarning(final Object msg) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isWarnEnabled()) {
+                final String message = compose(msg);
+                log.warn(message);
+            }
+        }
+    }
+    
+    protected final void logWarning(Object msg, Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isWarnEnabled()) {
+                final String message = compose(msg);
+                log.warn(message, t);
+            }
+        }
+    }
+    
+    protected final void logWarning(final Object msgPart1, final Object msgPart2) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isWarnEnabled()) {
+                final String message = compose(msgPart1, msgPart2);
+                log.warn(message);
+            }
+        }
+    }
+    
+    protected final void logWarning(final Object msgPart1, final Object msgPart2, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isWarnEnabled()) {
+                final String message = compose(msgPart1, msgPart2);
+                log.warn(message, t);
+            }
+        }
+    }
+    
+    protected final void logWarning(final Object msgPart1, final Object msgPart2, final Object msgPart3) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isWarnEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3);
+                log.warn(message);
+            }
+        }
+    }
+ 
+    protected final void logWarning(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isWarnEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3);
+                log.warn(message, t);
+            }
+        }
+    }
+    
+    protected final void logWarning(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isWarnEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4);
+                log.warn(message);
+            }
+        }
+    }
+    
+    protected final void logWarning(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isWarnEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4);
+                log.warn(message, t);
+            }
+        }
+    }
+    
+    protected final void logWarning(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isWarnEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5);
+                log.warn(message);
+            }
+        }
+    }
+    
+    protected final void logWarning(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isWarnEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5);
+                log.warn(message, t);
+            }
+        }
+    }
+    
+    protected final void logWarning(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Object msgPart6) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isWarnEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5,
+                        msgPart6);
+                log.warn(message);
+            }
+        }
+    }
+    
+    protected final void logWarning(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Object msgPart6, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isWarnEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5,
+                        msgPart6);
+                log.warn(message, t);
+            }
+        }
+    }
+    
+
+    //
+    // 
+    // ERROR 
+    //
+    //
+    
+    protected final void logError(final Object msg) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isErrorEnabled()) {
+                final String message = compose(msg);
+                log.error(message);
+            }
+        }
+    }
+    
+    protected final void logError(Object msg, Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isErrorEnabled()) {
+                final String message = compose(msg);
+                log.error(message, t);
+            }
+        }
+    }
+    
+    protected final void logError(final Object msgPart1, final Object msgPart2) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isErrorEnabled()) {
+                final String message = compose(msgPart1, msgPart2);
+                log.error(message);
+            }
+        }
+    }
+    
+    protected final void logError(final Object msgPart1, final Object msgPart2, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isErrorEnabled()) {
+                final String message = compose(msgPart1, msgPart2);
+                log.error(message, t);
+            }
+        }
+    }
+    
+    protected final void logError(final Object msgPart1, final Object msgPart2, final Object msgPart3) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isErrorEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3);
+                log.error(message);
+            }
+        }
+    }
+ 
+    protected final void logError(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isErrorEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3);
+                log.error(message, t);
+            }
+        }
+    }
+    
+    protected final void logError(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isErrorEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4);
+                log.error(message);
+            }
+        }
+    }
+    
+    protected final void logError(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isErrorEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4);
+                log.error(message, t);
+            }
+        }
+    }
+    
+    protected final void logError(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isErrorEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5);
+                log.error(message);
+            }
+        }
+    }
+    
+    protected final void logError(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isErrorEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5);
+                log.error(message, t);
+            }
+        }
+    }
+    
+    protected final void logError(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Object msgPart6) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isErrorEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5,
+                        msgPart6);
+                log.error(message);
+            }
+        }
+    }
+    
+    protected final void logError(final Object msgPart1, final Object msgPart2, final Object msgPart3,
+            final Object msgPart4, final Object msgPart5, final Object msgPart6, final Throwable t) {
+        final Logger log = getLogger();
+        if (log == null) {
+            // TODO: consider logging to java.util.logging
+        } else {
+            if (log.isErrorEnabled()) {
+                final String message = compose(msgPart1, msgPart2, msgPart3, msgPart4, msgPart5,
+                        msgPart6);
+                log.error(message, t);
+            }
+        }
+    }
+    
+}
Index: src/java/org/apache/james/imapserver/ImapResponse.java
===================================================================
--- src/java/org/apache/james/imapserver/ImapResponse.java	(revision 475827)
+++ src/java/org/apache/james/imapserver/ImapResponse.java	(working copy)
@@ -24,17 +24,16 @@
 
 import javax.mail.Flags;
 
-import org.apache.avalon.framework.logger.AbstractLogEnabled;
-import org.apache.avalon.framework.logger.Logger;
 import org.apache.james.imapserver.commands.ImapCommand;
 import org.apache.james.imapserver.store.MessageFlags;
 import org.apache.james.util.InternetPrintWriter;
+import org.apache.james.util.logging.JamesLoggingEnabled;
 
 /**
  * Class providing methods to send response messages from the server
  * to the client.
  */
-public class ImapResponse  extends AbstractLogEnabled implements ImapConstants {
+public class ImapResponse extends JamesLoggingEnabled implements ImapConstants {
     
     private PrintWriter writer;
     private String tag = UNTAGGED;
@@ -115,10 +114,7 @@
         message( "failed." );
         message( reason );
         end();
-        final Logger logger = getLogger();
-        if (logger.isInfoEnabled()) {
-            logger.info("COMMAND FAILED [" + responseCode + "] - " + reason);
-        }
+        logInfo("COMMAND FAILED [", responseCode, "] ", tag, " - ", reason);
     }
 
     /**
@@ -135,10 +131,7 @@
         message( BAD );
         message( message );
         end();
-        final Logger logger = getLogger();
-        if (logger.isInfoEnabled()) {
-            logger.info("ERROR - " + message); 
-        }
+        logInfo("ERROR ", tag, " - ", message); 
     }
 
     /**
@@ -150,10 +143,7 @@
         message( BAD );
         message( message );
         end();
-        final Logger logger = getLogger(); 
-        if (logger.isInfoEnabled()) { 
-            logger.info("BAD - " + message); 
-        }
+        logInfo("BAD ", tag, " - ", message); 
     }
 
     /**
@@ -169,6 +159,7 @@
         responseCode( responseCode );
         message( message );
         end();
+        logForDebugging("OK [", responseCode, "] ", tag, " - ", message);
     }
 
     public void flagsResponse( Flags flags )
@@ -244,6 +235,7 @@
         untagged();
         message( message );
         end();
+        logForDebugging("UNTAGGED - ", message); 
     }
     
     public void byeResponse( String message ) {
