You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2010/12/31 20:50:50 UTC

svn commit: r1054163 - in /james/server/trunk/container-spring/src/main: config/james/context/ java/org/apache/james/container/spring/bean/factorypostprocessor/ java/org/apache/james/container/spring/provider/log/

Author: norman
Date: Fri Dec 31 19:50:50 2010
New Revision: 1054163

URL: http://svn.apache.org/viewvc?rev=1054163&view=rev
Log:
Allow to change loglevel via JMX

Added:
    james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/provider/log/LogProviderManagementMBean.java
Modified:
    james/server/trunk/container-spring/src/main/config/james/context/james-server-context.xml
    james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/ProtocolHandlerChainFactoryPostProcessor.java
    james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/provider/log/LogProviderImpl.java

Modified: james/server/trunk/container-spring/src/main/config/james/context/james-server-context.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/container-spring/src/main/config/james/context/james-server-context.xml?rev=1054163&r1=1054162&r2=1054163&view=diff
==============================================================================
--- james/server/trunk/container-spring/src/main/config/james/context/james-server-context.xml (original)
+++ james/server/trunk/container-spring/src/main/config/james/context/james-server-context.xml Fri Dec 31 19:50:50 2010
@@ -393,11 +393,12 @@
           <entry key="org.apache.james:type=component,name=mailboxmanagement" value-ref="mailboxmanagermanagement"/>
           <entry key="org.apache.james:type=component,component=mailetcontainer,name=mailspooler" value-ref="mailspooler"/>
           <entry key="org.apache.james:type=mailbox,name=mailboxcopier" value-ref="mailboxcopiermanagement"/>
+          <entry key="org.apache.james:type=container,name=logprovider" value-ref="logProvider"/>
         </map>
       </property>
       <property name="assembler">
           <bean class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">
-            <property name="managedInterfaces" value="org.apache.james.smtpserver.netty.SMTPServerMBean,org.apache.james.pop3server.netty.POP3ServerMBean,org.apache.james.imapserver.netty.IMAPServerMBean,org.apache.james.fetchmail.FetchSchedulerMBean,org.apache.james.domainlist.api.DomainListManagementMBean,org.apache.james.dnsservice.api.DNSServiceMBean,org.apache.james.vut.api.VirtualUserTableManagementMBean,org.apache.james.user.api.UsersRepositoryManagementMBean,org.apache.james.adapter.mailbox.MailboxManagerManagementMBean,org.apache.james.container.spring.mailbox.MailboxCopierManagementMBean,org.apache.james.mailetcontainer.api.jmx.MailSpoolerMBean"/>
+            <property name="managedInterfaces" value="org.apache.james.smtpserver.netty.SMTPServerMBean,org.apache.james.pop3server.netty.POP3ServerMBean,org.apache.james.imapserver.netty.IMAPServerMBean,org.apache.james.fetchmail.FetchSchedulerMBean,org.apache.james.domainlist.api.DomainListManagementMBean,org.apache.james.dnsservice.api.DNSServiceMBean,org.apache.james.vut.api.VirtualUserTableManagementMBean,org.apache.james.user.api.UsersRepositoryManagementMBean,org.apache.james.adapter.mailbox.MailboxManagerManagementMBean,org.apache.james.container.spring.mailbox.MailboxCopierManagementMBean,org.apache.james.mailetcontainer.api.jmx.MailSpoolerMBean,org.apache.james.container.spring.provider.log.LogProviderManagementMBean"/>
           </bean>
       </property>
     </bean>

Modified: james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/ProtocolHandlerChainFactoryPostProcessor.java
URL: http://svn.apache.org/viewvc/james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/ProtocolHandlerChainFactoryPostProcessor.java?rev=1054163&r1=1054162&r2=1054163&view=diff
==============================================================================
--- james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/ProtocolHandlerChainFactoryPostProcessor.java (original)
+++ james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/ProtocolHandlerChainFactoryPostProcessor.java Fri Dec 31 19:50:50 2010
@@ -30,6 +30,8 @@ import org.apache.commons.configuration.
 import org.apache.commons.logging.Log;
 import org.apache.james.container.spring.provider.configuration.ConfigurationProvider;
 import org.apache.james.container.spring.provider.log.LogProvider;
+import org.apache.james.lifecycle.api.Configurable;
+import org.apache.james.lifecycle.api.LogEnabled;
 import org.apache.james.protocols.api.ExtensibleHandler;
 import org.apache.james.protocols.api.HandlersPackage;
 import org.apache.james.protocols.api.ProtocolHandlerChain;
@@ -121,6 +123,7 @@ public abstract class ProtocolHandlerCha
             }
             
 
+            ClassLoader loader = beanFactory.getBeanClassLoader();
             for (int i = 0; i < children.size(); i++) {
                 HierarchicalConfiguration hConf = children.get(i);
                 String className = hConf.getString("[@class]", null);
@@ -131,9 +134,15 @@ public abstract class ProtocolHandlerCha
 
                         String handlerBeanName = getBeanName(className);
 
-                        // register the log and configuration for it
-                        logProvider.registerLog(handlerBeanName, log);
-                        confProvider.registerConfiguration(handlerBeanName, hConf);
+                        Class<?> clazz =  loader.loadClass(className);
+                        if (Configurable.class.isAssignableFrom(clazz)) {
+                            confProvider.registerConfiguration(handlerBeanName, hConf);
+
+                        }
+                        if (LogEnabled.class.isAssignableFrom(clazz)) {
+                            logProvider.registerLog(handlerBeanName, log);
+                        }
+                       
 
                         // now register the BeanDefinition on the context and store the beanname for later usage
                         BeanDefinition handlerDef = BeanDefinitionBuilder.genericBeanDefinition(className).getBeanDefinition();
@@ -149,6 +158,8 @@ public abstract class ProtocolHandlerCha
             
         } catch (ConfigurationException e) {
             throw new FatalBeanException("Unable to load configuration for bean " + beanname, e);
+        } catch (ClassNotFoundException ex) {
+            throw new FatalBeanException("Unable to load configuration for bean " + beanname, ex);
         }
 
         

Modified: james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/provider/log/LogProviderImpl.java
URL: http://svn.apache.org/viewvc/james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/provider/log/LogProviderImpl.java?rev=1054163&r1=1054162&r2=1054163&view=diff
==============================================================================
--- james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/provider/log/LogProviderImpl.java (original)
+++ james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/provider/log/LogProviderImpl.java Fri Dec 31 19:50:50 2010
@@ -18,12 +18,18 @@
  ****************************************************************/
 package org.apache.james.container.spring.provider.log;
 
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.impl.Log4JLogger;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
 import org.springframework.beans.factory.InitializingBean;
 
 /**
@@ -31,9 +37,9 @@ import org.springframework.beans.factory
  * 
  *
  */
-public class LogProviderImpl implements LogProvider, InitializingBean {
+public class LogProviderImpl implements LogProvider, InitializingBean, LogProviderManagementMBean {
 
-    private final Map<String, Log> logMap = new HashMap<String, Log>();
+    private final ConcurrentHashMap<String, Log> logMap = new ConcurrentHashMap<String, Log>();
     private Map<String, String> logs;
     private final static String PREFIX = "james.";
 
@@ -62,7 +68,7 @@ public class LogProviderImpl implements 
             while(it.hasNext()) {
                 String key = it.next();
                 String value = logs.get(key);
-                registerLog(key, new Log4JLogger(PREFIX + value));
+                registerLog(key, createLog(PREFIX + value));
             }
         }
     }
@@ -72,12 +78,8 @@ public class LogProviderImpl implements 
      * @see org.apache.james.container.spring.lifecycle.LogProvider#getLog(java.lang.String)
      */
     public Log getLog(String name) {
-        Log log = logMap.get(name);
-        if (log != null) {
-            return log;
-        } else {
-            return createLog(PREFIX + name);
-        }
+        logMap.putIfAbsent(name, createLog(PREFIX + name));
+        return logMap.get(name);
     }
 
     /*
@@ -87,4 +89,62 @@ public class LogProviderImpl implements 
     public void registerLog(String beanName, Log log) {
         logMap.put(beanName, log);
     }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.container.spring.provider.log.LogProviderManagementMBean#getSupportedLogLevels()
+     */
+    public List<String> getSupportedLogLevels() {
+        return Arrays.asList("DEBUG", "INFO", "WARN", "ERROR", "OFF");
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.container.spring.provider.log.LogProviderManagementMBean#getLogLevels()
+     */
+    public Map<String, String> getLogLevels() {
+        TreeMap<String, String> levels = new TreeMap<String, String>();
+        Iterator<String> names = logMap.keySet().iterator();
+        while(names.hasNext()) {
+            String name = names.next();
+            String level = getLogLevel(name);
+            if (level != null) levels.put(name, level);
+        }
+        return levels;
+
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.container.spring.provider.log.LogProviderManagementMBean#getLogLevel(java.lang.String)
+     */
+    public String getLogLevel(String component) {
+        Log log = logMap.get(component);
+        if (log == null) {
+            throw new IllegalArgumentException("No Log for component "+ component);
+        }
+        Logger logger = ((Log4JLogger)log).getLogger();
+        if (logger == null || logger.getLevel() == null) {
+            return null;
+        }
+        Level level = logger.getLevel();
+        return level.toString();
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.container.spring.provider.log.LogProviderManagementMBean#setLogLevel(java.lang.String, java.lang.String)
+     */
+    public void setLogLevel(String component, String loglevel) {
+        if (getSupportedLogLevels().contains(loglevel) == false) {
+            throw new IllegalArgumentException("Not supported loglevel given");
+        } else {
+            ((Log4JLogger)logMap.get(component)).getLogger().setLevel(Level.toLevel(loglevel));
+        }
+    }
+    
 }

Added: james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/provider/log/LogProviderManagementMBean.java
URL: http://svn.apache.org/viewvc/james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/provider/log/LogProviderManagementMBean.java?rev=1054163&view=auto
==============================================================================
--- james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/provider/log/LogProviderManagementMBean.java (added)
+++ james/server/trunk/container-spring/src/main/java/org/apache/james/container/spring/provider/log/LogProviderManagementMBean.java Fri Dec 31 19:50:50 2010
@@ -0,0 +1,38 @@
+/****************************************************************
+ * 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.container.spring.provider.log;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Allow to change loglevel via JMX
+ *
+ */
+public interface LogProviderManagementMBean {
+    
+    public List<String> getSupportedLogLevels();
+    
+    public Map<String, String> getLogLevels();
+    
+    public String getLogLevel(String component);
+    
+    public void setLogLevel(String component, String loglevel);
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org