DELTASPIKE-1245 add ConfigEntry listing
Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/5c04cec3 Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/5c04cec3 Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/5c04cec3 Branch: refs/heads/master Commit: 5c04cec3b4c381f78a5de9888ab81f7f0c701ed9 Parents: 0a033b2 Author: Mark Struberg <[email protected]> Authored: Wed May 3 11:13:15 2017 +0200 Committer: Mark Struberg <[email protected]> Committed: Wed May 3 11:13:15 2017 +0200 ---------------------------------------------------------------------- .../impl/config/ConfigurationExtension.java | 6 + .../core/impl/config/DeltaSpikeConfigInfo.java | 198 ++++++++++++++++++- .../impl/config/DeltaSpikeConfigInfoMBean.java | 11 +- .../core/api/config/SecretTestConfigFilter.java | 2 +- .../test/core/impl/future/FutureableTest.java | 18 +- .../core/impl/jmx/SimpleRegistrationTest.java | 6 +- 6 files changed, 222 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/deltaspike/blob/5c04cec3/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/ConfigurationExtension.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/ConfigurationExtension.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/ConfigurationExtension.java index 1a14c18..d6e5223 100644 --- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/ConfigurationExtension.java +++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/ConfigurationExtension.java @@ -33,6 +33,7 @@ import javax.enterprise.inject.spi.Extension; import javax.enterprise.inject.spi.InjectionPoint; import javax.enterprise.inject.spi.ProcessAnnotatedType; import javax.enterprise.inject.spi.ProcessBean; +import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.MBeanServer; import javax.management.ObjectName; @@ -127,6 +128,11 @@ public class ConfigurationExtension implements Extension, Deactivatable ObjectName name = new ObjectName("deltaspike.config." + appName + ":type=DeltaSpikeConfig"); mBeanServer.registerMBean(cfgMBean, name); } + catch (InstanceAlreadyExistsException iae) + { + // all fine, the CfgBean got already registered. + // Most probably by the ServletConfigListener + } catch (Exception e) { throw new RuntimeException(e); http://git-wip-us.apache.org/repos/asf/deltaspike/blob/5c04cec3/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/DeltaSpikeConfigInfo.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/DeltaSpikeConfigInfo.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/DeltaSpikeConfigInfo.java index 87f4b52..286806b 100644 --- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/DeltaSpikeConfigInfo.java +++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/DeltaSpikeConfigInfo.java @@ -18,11 +18,21 @@ */ package org.apache.deltaspike.core.impl.config; -import org.apache.deltaspike.core.api.config.ConfigResolver; -import org.apache.deltaspike.core.spi.config.ConfigSource; +import javax.management.openmbean.CompositeDataSupport; +import javax.management.openmbean.CompositeType; +import javax.management.openmbean.OpenDataException; +import javax.management.openmbean.OpenType; +import javax.management.openmbean.SimpleType; +import javax.management.openmbean.TabularData; +import javax.management.openmbean.TabularDataSupport; +import javax.management.openmbean.TabularType; import java.util.ArrayList; import java.util.List; +import java.util.Map; + +import org.apache.deltaspike.core.api.config.ConfigResolver; +import org.apache.deltaspike.core.spi.config.ConfigSource; /** * JMX MBean for DeltaSpike @@ -37,22 +47,138 @@ public class DeltaSpikeConfigInfo implements DeltaSpikeConfigInfoMBean } @Override - public List<String> getConfigSources() + public String[] getConfigSourcesAsString() { ClassLoader originalCl = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(appConfigClassLoader); + + ConfigSource[] configSources = ConfigResolver.getConfigSources(); List<String> configSourceInfo = new ArrayList<String>(); + for (ConfigSource configSource : configSources) + { + configSourceInfo.add(Integer.toString(configSource.getOrdinal()) + + " - " + configSource.getConfigName()); + } + + return configSourceInfo.toArray(new String[configSourceInfo.size()]); + } + finally + { + // set back the original TCCL + Thread.currentThread().setContextClassLoader(originalCl); + } + + } + + @Override + public String[] getConfigEntriesAsString() + { + ClassLoader originalCl = Thread.currentThread().getContextClassLoader(); + try + { + Thread.currentThread().setContextClassLoader(appConfigClassLoader); + + List<ConfigEntry> configEntries = calculateConfigEntries(); + + String[] configArray = new String[configEntries.size()]; + + for (int i = 0 ; i < configEntries.size(); i++) + { + ConfigEntry configEntry = configEntries.get(i); + configArray[i] = configEntry.getKey() + " = " + configEntry.getValue() + + " - picked up from: " + configEntry.getFromConfigSource(); + } + + return configArray; + + } + finally + { + // set back the original TCCL + Thread.currentThread().setContextClassLoader(originalCl); + } + } + + @Override + public TabularData getConfigEntries() + { + ClassLoader originalCl = Thread.currentThread().getContextClassLoader(); + try + { + Thread.currentThread().setContextClassLoader(appConfigClassLoader); + + List<ConfigEntry> configEntries = calculateConfigEntries(); + + String[] configArray = new String[configEntries.size()]; + + for (int i = 0 ; i < configEntries.size(); i++) + { + ConfigEntry configEntry = configEntries.get(i); + configArray[i] = configEntry.getKey() + " = " + configEntry.getValue() + + " - picked up from: " + configEntry.getFromConfigSource(); + } + + String typeName = "ConfigEntries"; + OpenType<?>[] types = new OpenType<?>[]{SimpleType.STRING, SimpleType.STRING, SimpleType.STRING}; + String[] keys = new String[]{"Key", "Value", "fromConfigSource"}; + + CompositeType ct = new CompositeType(typeName, typeName, keys, keys, types); + TabularType type = new TabularType(typeName, typeName, ct, keys); + TabularDataSupport configEntryInfo = new TabularDataSupport(type); + + ConfigSource[] configSources = ConfigResolver.getConfigSources(); + for (ConfigEntry configEntry : configEntries) + { + configEntryInfo.put( + new CompositeDataSupport(ct, keys, + new Object[]{configEntry.getKey(), configEntry.getValue(), configEntry.getFromConfigSource()})); + } + + return configEntryInfo; + } + catch (OpenDataException e) + { + throw new RuntimeException(e); + } + finally + { + // set back the original TCCL + Thread.currentThread().setContextClassLoader(originalCl); + } + } + + @Override + public TabularData getConfigSources() + { + ClassLoader originalCl = Thread.currentThread().getContextClassLoader(); + try + { + Thread.currentThread().setContextClassLoader(appConfigClassLoader); + + String typeName = "ConfigSources"; + OpenType<?>[] types = new OpenType<?>[]{SimpleType.INTEGER, SimpleType.STRING}; + String[] keys = new String[]{"Ordinal", "ConfigSource"}; + + CompositeType ct = new CompositeType(typeName, typeName, keys, keys, types); + TabularType type = new TabularType(typeName, typeName, ct, keys); + TabularDataSupport configSourceInfo = new TabularDataSupport(type); + ConfigSource[] configSources = ConfigResolver.getConfigSources(); for (ConfigSource configSource : configSources) { - configSourceInfo.add(Integer.toString(configSource.getOrdinal()) + - " - " + configSource.getConfigName()); + configSourceInfo.put( + new CompositeDataSupport(ct, keys, + new Object[]{configSource.getOrdinal(), configSource.getConfigName()})); } return configSourceInfo; } + catch (OpenDataException e) + { + throw new RuntimeException(e); + } finally { // set back the original TCCL @@ -60,5 +186,67 @@ public class DeltaSpikeConfigInfo implements DeltaSpikeConfigInfoMBean } } + private List<ConfigEntry> calculateConfigEntries() + { + Map<String, String> allProperties = ConfigResolver.getAllProperties(); + List<ConfigEntry> configEntries = new ArrayList<ConfigEntry>(allProperties.size()); + ConfigSource[] configSources = ConfigResolver.getConfigSources(); + + for (Map.Entry<String, String> configEntry : allProperties.entrySet()) + { + String key = configEntry.getKey(); + String value = ConfigResolver.filterConfigValueForLog(key, + ConfigResolver.getProjectStageAwarePropertyValue(key)); + + String fromConfigSource = getFromConfigSource(configSources, key); + configEntries.add(new ConfigEntry(key, value, fromConfigSource)); + } + + return configEntries; + } + + private String getFromConfigSource(ConfigSource[] configSources, String key) + { + for (ConfigSource configSource : configSources) + { + if (configSource.getPropertyValue(key) != null) + { + return configSource.getConfigName(); + } + } + + return null; + } + + + + private class ConfigEntry + { + private final String key; + private final String value; + private final String fromConfigSource; + + public ConfigEntry(String key, String value, String fromConfigSource) + { + this.key = key; + this.value = value; + this.fromConfigSource = fromConfigSource; + } + + public String getKey() + { + return key; + } + + public String getValue() + { + return value; + } + + public String getFromConfigSource() + { + return fromConfigSource; + } + } } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/5c04cec3/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/DeltaSpikeConfigInfoMBean.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/DeltaSpikeConfigInfoMBean.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/DeltaSpikeConfigInfoMBean.java index 01335b8..d2d154f 100644 --- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/DeltaSpikeConfigInfoMBean.java +++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/config/DeltaSpikeConfigInfoMBean.java @@ -18,9 +18,16 @@ */ package org.apache.deltaspike.core.impl.config; -import java.util.List; +import javax.management.openmbean.TabularData; public interface DeltaSpikeConfigInfoMBean { - List<String> getConfigSources(); + String[] getConfigSourcesAsString(); + + TabularData getConfigSources(); + + String[] getConfigEntriesAsString(); + + TabularData getConfigEntries(); + } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/5c04cec3/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/config/SecretTestConfigFilter.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/config/SecretTestConfigFilter.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/config/SecretTestConfigFilter.java index da5c779..6d1e272 100644 --- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/config/SecretTestConfigFilter.java +++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/config/SecretTestConfigFilter.java @@ -42,6 +42,6 @@ public class SecretTestConfigFilter implements ConfigFilter { return "**********"; } - return null; + return value; } } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/5c04cec3/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/future/FutureableTest.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/future/FutureableTest.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/future/FutureableTest.java index b3a006a..bbf2542 100644 --- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/future/FutureableTest.java +++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/future/FutureableTest.java @@ -67,15 +67,15 @@ public class FutureableTest { @Test public void voidTest() { - CountDownLatch latch = new CountDownLatch(1); - service.thatSLong(1000, latch); - try - { - if (!latch.await(2000, TimeUnit.MILLISECONDS)) { - fail("Asynchronous call should have terminated"); - } - } - catch (final InterruptedException e) + CountDownLatch latch = new CountDownLatch(1); + service.thatSLong(1000, latch); + try + { + if (!latch.await(2000, TimeUnit.MILLISECONDS)) { + fail("Asynchronous call should have terminated"); + } + } + catch (final InterruptedException e) { Thread.interrupted(); fail(); http://git-wip-us.apache.org/repos/asf/deltaspike/blob/5c04cec3/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/SimpleRegistrationTest.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/SimpleRegistrationTest.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/SimpleRegistrationTest.java index 512d24c..c287192 100644 --- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/SimpleRegistrationTest.java +++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/SimpleRegistrationTest.java @@ -22,6 +22,7 @@ import org.junit.Test; import javax.inject.Inject; import javax.management.Attribute; +import javax.management.MBeanOperationInfo; import javax.management.MBeanParameterInfo; import javax.management.MBeanServer; import javax.management.Notification; @@ -71,8 +72,9 @@ public abstract class SimpleRegistrationTest { myMBean.broadcast(); assertEquals(1, notifications.size()); assertEquals(10L, notifications.iterator().next().getSequenceNumber()); - - MBeanParameterInfo parameterInfo = server.getMBeanInfo(on).getOperations()[0].getSignature()[0]; + + MBeanOperationInfo[] operations = server.getMBeanInfo(on).getOperations(); + MBeanParameterInfo parameterInfo = operations[0].getSignature()[0]; assertEquals("multiplier", parameterInfo.getName()); assertEquals("the multiplier", parameterInfo.getDescription());
