This is an automated email from the ASF dual-hosted git repository. jbonofre pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/karaf.git
The following commit(s) were added to refs/heads/master by this push: new d618e43 Alternatively read features.core configuration from ConfigAdmin (#1215) d618e43 is described below commit d618e4325f416454cc442603e8b50ea01785209f Author: Henning Treu <henning.t...@instana.com> AuthorDate: Sun Oct 11 07:27:19 2020 +0200 Alternatively read features.core configuration from ConfigAdmin (#1215) --- .../karaf/features/internal/osgi/Activator.java | 26 +++++- .../features/internal/osgi/ActivatorTest.java | 101 +++++++++++++++++++++ 2 files changed, 123 insertions(+), 4 deletions(-) diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java index 28226e6..9a69301 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java @@ -68,6 +68,7 @@ import org.osgi.framework.Constants; import org.osgi.framework.ServiceReference; import org.osgi.framework.hooks.bundle.CollisionHook; import org.osgi.framework.hooks.resolver.ResolverHookFactory; +import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; import org.osgi.service.cm.ManagedService; import org.osgi.service.repository.Repository; @@ -90,7 +91,8 @@ import org.slf4j.LoggerFactory; ) public class Activator extends BaseActivator { - public static final String FEATURES_SERVICE_CONFIG_FILE = "org.apache.karaf.features.cfg"; + static final String FEATURES_SERVICE_CONFIG = "org.apache.karaf.features"; + public static final String FEATURES_SERVICE_CONFIG_FILE = FEATURES_SERVICE_CONFIG + ".cfg"; public static final String FEATURES_SERVICE_PROCESSING_FILE = "org.apache.karaf.features.xml"; public static final String FEATURES_SERVICE_PROCESSING_VERSIONS_FILE = "versions.properties"; @@ -121,10 +123,26 @@ public class Activator extends BaseActivator { logger.warn("Error reading configuration file " + configFile.toString(), e); } } - Dictionary<String, String> props = new Hashtable<>(); - for (Map.Entry<String, String> entry : configuration.entrySet()) { - props.put(entry.getKey(), entry.getValue()); + + Dictionary<String, Object> props = new Hashtable<>(); + + if (!configuration.isEmpty()) { + for (Map.Entry<String, String> entry : configuration.entrySet()) { + props.put(entry.getKey(), entry.getValue()); + } + } else { + // work around https://issues.apache.org/jira/browse/KARAF-6866 + // org.apache.karaf.features.cfg might have been read empty + // but ConfigurationAdmin also has all values available: + ConfigurationAdmin configurationAdmin = getTrackedService(ConfigurationAdmin.class); + if (configurationAdmin != null) { + Configuration featuresServiceConfig = configurationAdmin.getConfiguration(FEATURES_SERVICE_CONFIG); + if (featuresServiceConfig != null) { + props = featuresServiceConfig.getProperties(); + } + } } + updated(props); } diff --git a/features/core/src/test/java/org/apache/karaf/features/internal/osgi/ActivatorTest.java b/features/core/src/test/java/org/apache/karaf/features/internal/osgi/ActivatorTest.java new file mode 100644 index 0000000..fbc559f --- /dev/null +++ b/features/core/src/test/java/org/apache/karaf/features/internal/osgi/ActivatorTest.java @@ -0,0 +1,101 @@ +/* + * 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.karaf.features.internal.osgi; + +import static org.easymock.EasyMock.anyString; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.niceMock; +import static org.easymock.EasyMock.replay; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +import java.util.Dictionary; +import java.util.Hashtable; + +import org.junit.Before; +import org.junit.Test; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.service.cm.Configuration; +import org.osgi.service.cm.ConfigurationAdmin; + +public class ActivatorTest { + + private Activator activator; + private ConfigurationAdmin configurationAdmin; + private BundleContext bundleContext; + + @Before + public void setup() throws Exception { + activator = new TestActivator(); + + configurationAdmin = niceMock(ConfigurationAdmin.class); + Configuration featuresConfig = niceMock(Configuration.class); + Dictionary<String, Object> properties = buildTestProperties(); + expect(featuresConfig.getProperties()).andReturn(properties); + expect(configurationAdmin.getConfiguration(Activator.FEATURES_SERVICE_CONFIG)).andReturn(featuresConfig); + + bundleContext = niceMock(BundleContext.class); + Bundle bundle = niceMock(Bundle.class); + expect(bundle.getResource(anyString())).andReturn(null); + expect(bundleContext.getBundle()).andReturn(bundle); + + replay(bundleContext, bundle, configurationAdmin, featuresConfig); + } + + private Dictionary<String, Object> buildTestProperties() { + Dictionary<String, Object> properties = new Hashtable<>(); + properties.put("key1", "value1"); + properties.put("key2", "value2"); + + return properties; + } + + @Test + public void testStart() throws Exception { + activator.start(bundleContext); + + Dictionary<String, ?> configuration = ((TestActivator) activator).getConfiguration(); + assertThat(configuration.get("key1"), is("value1")); + assertThat(configuration.get("key2"), is("value2")); + } + + /** + * Overwrite #getTrackedService which could otherwise not be mocked. + * Overwrite #doStart to avoid full start up of the Activator. + * Overwrite #getConfiguration to allow test validation. + */ + public class TestActivator extends Activator { + @Override + protected <T> T getTrackedService(Class<T> clazz) { + if (clazz.isAssignableFrom(ConfigurationAdmin.class)) { + return (T) configurationAdmin; + } + return null; + } + + @Override + protected void doStart() throws Exception { + // nop + } + + @Override + public Dictionary<String, ?> getConfiguration() { + return super.getConfiguration(); + } + } +}