JAMES-2439 Extract configuration management from JMXServer
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/3c3c8fc6 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/3c3c8fc6 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/3c3c8fc6 Branch: refs/heads/master Commit: 3c3c8fc6bf247727a6f3311e0626f389ccd8b51f Parents: 81db3c2 Author: benwa <[email protected]> Authored: Mon Jun 25 11:42:02 2018 +0700 Committer: benwa <[email protected]> Committed: Tue Jun 26 16:10:41 2018 +0700 ---------------------------------------------------------------------- server/container/guice/jmx/pom.xml | 20 ++++++ .../apache/james/modules/server/JMXServer.java | 35 +++------ .../james/modules/server/JMXServerModule.java | 19 +++++ .../james/modules/server/JmxConfiguration.java | 75 ++++++++++++++++++++ .../modules/server/JmxConfigurationTest.java | 55 ++++++++++++++ 5 files changed, 177 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/3c3c8fc6/server/container/guice/jmx/pom.xml ---------------------------------------------------------------------- diff --git a/server/container/guice/jmx/pom.xml b/server/container/guice/jmx/pom.xml index df9326f..aa1190f 100644 --- a/server/container/guice/jmx/pom.xml +++ b/server/container/guice/jmx/pom.xml @@ -77,6 +77,26 @@ <artifactId>guice-multibindings</artifactId> </dependency> <dependency> + <groupId>nl.jqno.equalsverifier</groupId> + <artifactId>equalsverifier</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.assertj</groupId> + <artifactId>assertj-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-engine</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-launcher</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/3c3c8fc6/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JMXServer.java ---------------------------------------------------------------------- diff --git a/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JMXServer.java b/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JMXServer.java index 9fc69fe..130b572 100644 --- a/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JMXServer.java +++ b/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JMXServer.java @@ -19,7 +19,6 @@ package org.apache.james.modules.server; -import java.io.FileNotFoundException; import java.lang.management.ManagementFactory; import java.net.ServerSocket; import java.rmi.registry.LocateRegistry; @@ -35,21 +34,13 @@ import javax.management.remote.JMXConnectorServer; import javax.management.remote.JMXConnectorServerFactory; import javax.management.remote.JMXServiceURL; -import org.apache.commons.configuration.ConfigurationException; -import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.james.util.RestrictingRMISocketFactory; -import org.apache.james.utils.PropertiesProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.github.fge.lambdas.Throwing; import com.google.common.collect.ImmutableMap; public class JMXServer { - - private static final Logger LOGGER = LoggerFactory.getLogger(JMXServer.class); - - private final PropertiesProvider propertiesProvider; + private final JmxConfiguration jmxConfiguration; private final Set<String> registeredKeys; private final Object lock; private JMXConnectorServer jmxConnectorServer; @@ -57,8 +48,8 @@ public class JMXServer { private RestrictingRMISocketFactory restrictingRMISocketFactory; @Inject - public JMXServer(PropertiesProvider propertiesProvider) { - this.propertiesProvider = propertiesProvider; + public JMXServer(JmxConfiguration jmxConfiguration) { + this.jmxConfiguration = jmxConfiguration; isStarted = false; registeredKeys = new HashSet<>(); lock = new Object(); @@ -94,12 +85,11 @@ public class JMXServer { private void doStart() { try { - PropertiesConfiguration configuration = getPropertiesConfiguration(); - String address = configuration.getString("jmx.address", "localhost"); - int port = configuration.getInt("jmx.port", 9999); - String serviceURL = "service:jmx:rmi://" + address + "/jndi/rmi://" + address + ":" + port + "/jmxrmi"; - restrictingRMISocketFactory = new RestrictingRMISocketFactory(address); - LocateRegistry.createRegistry(port, restrictingRMISocketFactory, restrictingRMISocketFactory); + String serviceURL = "service:jmx:rmi://" + jmxConfiguration.getHost().getHostName() + + "/jndi/rmi://" + jmxConfiguration.getHost().getHostName() + + ":" + jmxConfiguration.getHost().getPort() + "/jmxrmi"; + restrictingRMISocketFactory = new RestrictingRMISocketFactory(jmxConfiguration.getHost().getHostName()); + LocateRegistry.createRegistry(jmxConfiguration.getHost().getPort(), restrictingRMISocketFactory, restrictingRMISocketFactory); Map<String, ?> environment = ImmutableMap.of(); jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(new JMXServiceURL(serviceURL), @@ -112,15 +102,6 @@ public class JMXServer { } } - private PropertiesConfiguration getPropertiesConfiguration() throws ConfigurationException { - try { - return propertiesProvider.getConfiguration("jmx"); - } catch (FileNotFoundException e) { - LOGGER.warn("Could not locate configuration file for JMX. Defaults to rmi://127.0.0.1:9999"); - return new PropertiesConfiguration(); - } - } - private void doStop() { try { MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); http://git-wip-us.apache.org/repos/asf/james-project/blob/3c3c8fc6/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JMXServerModule.java ---------------------------------------------------------------------- diff --git a/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JMXServerModule.java b/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JMXServerModule.java index ca6938f..92105a5 100644 --- a/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JMXServerModule.java +++ b/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JMXServerModule.java @@ -19,8 +19,10 @@ package org.apache.james.modules.server; +import java.io.FileNotFoundException; import java.util.List; +import org.apache.commons.configuration.ConfigurationException; import org.apache.james.adapter.mailbox.MailboxCopierManagement; import org.apache.james.adapter.mailbox.MailboxCopierManagementMBean; import org.apache.james.adapter.mailbox.MailboxManagerManagement; @@ -47,10 +49,14 @@ import org.apache.james.user.api.UsersRepositoryManagementMBean; import org.apache.james.user.lib.UsersRepositoryManagement; import org.apache.james.utils.ConfigurationPerformer; import org.apache.james.utils.GuiceMailboxManagerResolver; +import org.apache.james.utils.PropertiesProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableList; import com.google.inject.AbstractModule; import com.google.inject.Inject; +import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.Singleton; import com.google.inject.multibindings.Multibinder; @@ -58,6 +64,8 @@ import com.google.inject.name.Names; public class JMXServerModule extends AbstractModule { + private static final Logger LOGGER = LoggerFactory.getLogger(JMXServerModule.class); + private static final String JMX_COMPONENT_DOMAINLIST = "org.apache.james:type=component,name=domainlist"; private static final String JMX_COMPONENT_USERS_REPOSITORY = "org.apache.james:type=component,name=usersrepository"; private static final String JMX_COMPONENT_RECIPIENTREWRITETABLE = "org.apache.james:type=component,name=recipientrewritetable"; @@ -94,6 +102,17 @@ public class JMXServerModule extends AbstractModule { configurationMultibinder.addBinding().to(JMXModuleConfigurationPerformer.class); } + @Provides + @Singleton + public JmxConfiguration provideConfiguration(PropertiesProvider propertiesProvider) throws ConfigurationException { + try { + return JmxConfiguration.fromProperties(propertiesProvider.getConfiguration("jmx")); + } catch (FileNotFoundException e) { + LOGGER.warn("Could not locate configuration file for JMX. Defaults to rmi://127.0.0.1:9999"); + return JmxConfiguration.DEFAULT_CONFIGURATION; + } + } + @Singleton public static class JMXModuleConfigurationPerformer implements ConfigurationPerformer { http://git-wip-us.apache.org/repos/asf/james-project/blob/3c3c8fc6/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JmxConfiguration.java ---------------------------------------------------------------------- diff --git a/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JmxConfiguration.java b/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JmxConfiguration.java new file mode 100644 index 0000000..793e930 --- /dev/null +++ b/server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JmxConfiguration.java @@ -0,0 +1,75 @@ +/**************************************************************** + * 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.modules.server; + +import java.util.Objects; + +import org.apache.commons.configuration.PropertiesConfiguration; +import org.apache.james.util.Host; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.MoreObjects; + +public class JmxConfiguration { + + public static final String LOCALHOST = "localhost"; + public static final int DEFAULT_PORT = 9999; + + public static final JmxConfiguration DEFAULT_CONFIGURATION = new JmxConfiguration(Host.from(LOCALHOST, DEFAULT_PORT)); + + public static JmxConfiguration fromProperties(PropertiesConfiguration configuration) { + String address = configuration.getString("jmx.address", LOCALHOST); + int port = configuration.getInt("jmx.port", DEFAULT_PORT); + return new JmxConfiguration(Host.from(address, port)); + } + + private final Host host; + + @VisibleForTesting + JmxConfiguration(Host host) { + this.host = host; + } + + public Host getHost() { + return host; + } + + @Override + public final boolean equals(Object o) { + if (o instanceof JmxConfiguration) { + JmxConfiguration that = (JmxConfiguration) o; + + return Objects.equals(this.host, that.host); + } + return false; + } + + @Override + public final int hashCode() { + return Objects.hash(host); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("host", host) + .toString(); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/3c3c8fc6/server/container/guice/jmx/src/test/java/org/apache/james/modules/server/JmxConfigurationTest.java ---------------------------------------------------------------------- diff --git a/server/container/guice/jmx/src/test/java/org/apache/james/modules/server/JmxConfigurationTest.java b/server/container/guice/jmx/src/test/java/org/apache/james/modules/server/JmxConfigurationTest.java new file mode 100644 index 0000000..a727b58 --- /dev/null +++ b/server/container/guice/jmx/src/test/java/org/apache/james/modules/server/JmxConfigurationTest.java @@ -0,0 +1,55 @@ +/**************************************************************** + * 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.modules.server; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.StringReader; + +import org.apache.commons.configuration.PropertiesConfiguration; +import org.apache.james.util.Host; +import org.junit.jupiter.api.Test; + +import nl.jqno.equalsverifier.EqualsVerifier; + +public class JmxConfigurationTest { + @Test + void shouldMatchBeanContract() { + EqualsVerifier.forClass(JmxConfiguration.class) + .verify(); + } + + @Test + void fromPropertiesShouldReturnDefaultWhenEmpty() { + assertThat(JmxConfiguration.fromProperties(new PropertiesConfiguration())) + .isEqualTo(JmxConfiguration.DEFAULT_CONFIGURATION); + } + + @Test + void fromPropertiesShouldReturnConfiguredValues() throws Exception { + PropertiesConfiguration configuration = new PropertiesConfiguration(); + configuration.load(new StringReader( + "jmx.address=172.0.0.5\n" + + "jmx.port=889\n")); + + assertThat(JmxConfiguration.fromProperties(configuration)) + .isEqualTo(new JmxConfiguration(Host.from("172.0.0.5", 889))); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
