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