diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/archaius/ArchaiusAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/archaius/ArchaiusAutoConfiguration.java index b243c27e..da7c1ec7 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/archaius/ArchaiusAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/archaius/ArchaiusAutoConfiguration.java @@ -1,8 +1,14 @@ package org.springframework.cloud.netflix.archaius; -import com.netflix.config.ConcurrentCompositeConfiguration; -import com.netflix.config.ConfigurationManager; -import com.netflix.config.DynamicURLConfiguration; +import static com.netflix.config.ConfigurationBasedDeploymentContext.DEPLOYMENT_APPLICATION_ID_PROPERTY; +import static com.netflix.config.ConfigurationManager.APPLICATION_PROPERTIES; +import static com.netflix.config.ConfigurationManager.DISABLE_DEFAULT_ENV_CONFIG; +import static com.netflix.config.ConfigurationManager.DISABLE_DEFAULT_SYS_CONFIG; +import static com.netflix.config.ConfigurationManager.ENV_CONFIG_NAME; +import static com.netflix.config.ConfigurationManager.SYS_CONFIG_NAME; +import static com.netflix.config.ConfigurationManager.URL_CONFIG_NAME; + +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.configuration.EnvironmentConfiguration; import org.apache.commons.configuration.SystemConfiguration; @@ -13,10 +19,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.ConfigurableEnvironment; -import java.util.concurrent.atomic.AtomicBoolean; - -import static com.netflix.config.ConfigurationBasedDeploymentContext.DEPLOYMENT_APPLICATION_ID_PROPERTY; -import static com.netflix.config.ConfigurationManager.*; +import com.netflix.config.ConcurrentCompositeConfiguration; +import com.netflix.config.ConfigurationManager; +import com.netflix.config.DynamicURLConfiguration; /** * @author Spencer Gibb @@ -28,14 +33,19 @@ public class ArchaiusAutoConfiguration { private static final AtomicBoolean initialized = new AtomicBoolean(false); @Autowired - ConfigurableEnvironment env; + private ConfigurableEnvironment env; @Bean - ConfigurableEnvironmentConfiguration configurableEnvironmentConfiguration() { + public ConfigurableEnvironmentConfiguration configurableEnvironmentConfiguration() { ConfigurableEnvironmentConfiguration envConfig = new ConfigurableEnvironmentConfiguration(env); configureArchaius(envConfig); return envConfig; } + + @Bean + protected ArchaiusEndpoint archaiusEndpoint() { + return new ArchaiusEndpoint(); + } @SuppressWarnings("deprecation") protected void configureArchaius(ConfigurableEnvironmentConfiguration envConfig) { @@ -60,11 +70,11 @@ public class ArchaiusAutoConfiguration { config.addConfiguration(envConfig, ConfigurableEnvironmentConfiguration.class.getSimpleName()); //below come from ConfigurationManager.createDefaultConfigInstance() + DynamicURLConfiguration defaultURLConfig = new DynamicURLConfiguration(); try { - DynamicURLConfiguration defaultURLConfig = new DynamicURLConfiguration(); config.addConfiguration(defaultURLConfig, URL_CONFIG_NAME); } catch (Throwable e) { - e.printStackTrace(); //TODO: log error + logger.error("Cannot create config from " + defaultURLConfig, e); } //TODO: sys/env above urls? diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/archaius/ArchaiusEndpoint.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/archaius/ArchaiusEndpoint.java new file mode 100644 index 00000000..8b4f763f --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/archaius/ArchaiusEndpoint.java @@ -0,0 +1,73 @@ +/* + * Copyright 2013-2014 the original author or authors. + * + * Licensed 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.springframework.cloud.netflix.archaius; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.apache.commons.configuration.AbstractConfiguration; +import org.apache.commons.configuration.Configuration; +import org.apache.commons.configuration.EnvironmentConfiguration; +import org.apache.commons.configuration.SystemConfiguration; +import org.springframework.boot.actuate.endpoint.AbstractEndpoint; + +import com.netflix.config.ConcurrentCompositeConfiguration; +import com.netflix.config.ConfigurationManager; + +/** + * @author Dave Syer + * + */ +public class ArchaiusEndpoint extends AbstractEndpoint> { + + public ArchaiusEndpoint() { + super("archaius"); + } + + @Override + public Map invoke() { + Map map = new LinkedHashMap(); + AbstractConfiguration config = ConfigurationManager.getConfigInstance(); + if (config instanceof ConcurrentCompositeConfiguration) { + ConcurrentCompositeConfiguration composite = (ConcurrentCompositeConfiguration) config; + for (Configuration item : composite.getConfigurations()) { + append(map, item); + } + } + else { + append(map, config); + } + return map; + } + + private void append(Map map, Configuration config) { + if (config instanceof ConfigurableEnvironmentConfiguration) { + return; + } + if (config instanceof SystemConfiguration) { + return; + } + if (config instanceof EnvironmentConfiguration) { + return; + } + for (Iterator iter = config.getKeys(); iter.hasNext();) { + String key = iter.next(); + map.put(key, config.getProperty(key)); + } + } + +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/archaius/ArchaiusEndpointTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/archaius/ArchaiusEndpointTests.java new file mode 100644 index 00000000..79c2cf2c --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/archaius/ArchaiusEndpointTests.java @@ -0,0 +1,55 @@ +/* + * Copyright 2013-2014 the original author or authors. + * + * Licensed 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.springframework.cloud.netflix.archaius; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Map; + +import org.junit.Test; +import org.springframework.core.env.StandardEnvironment; + +import com.netflix.config.ConcurrentCompositeConfiguration; +import com.netflix.config.ConfigurationManager; + +/** + * @author Dave Syer + * + */ +public class ArchaiusEndpointTests { + + private ArchaiusEndpoint endpoint = new ArchaiusEndpoint(); + + @Test + public void detectsPropertiesWhenSet() { + ConfigurationManager.getConfigInstance().setProperty("foo", "bar"); + assertTrue(endpoint.invoke().containsKey("foo")); + } + + @Test + public void doesNotIncludeSpringEnvironment() { + ConcurrentCompositeConfiguration composite = new ConcurrentCompositeConfiguration(ConfigurationManager.getConfigInstance()); + ConfigurableEnvironmentConfiguration config = new ConfigurableEnvironmentConfiguration(new StandardEnvironment()); + assertTrue(config.containsKey("user.dir")); + composite.addConfiguration(config); + ConfigurationManager.getConfigInstance().setProperty("foo", "bar"); + Map map = endpoint.invoke(); + assertTrue(map.containsKey("foo")); + assertFalse(map.containsKey("user.dir")); + } + +}