Repository: incubator-tamaya-sandbox
Updated Branches:
  refs/heads/master 3bcac1b82 -> 3e5225120


TAMAYA-301 Implemented OSGI Configuration injection.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/commit/3e522512
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/tree/3e522512
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/diff/3e522512

Branch: refs/heads/master
Commit: 3e5225120fcfb28074c8744a66d2bbefe729b653
Parents: 3bcac1b
Author: Anatole Tresch <[email protected]>
Authored: Tue Oct 3 14:50:29 2017 +0200
Committer: Anatole Tresch <[email protected]>
Committed: Tue Oct 3 14:50:29 2017 +0200

----------------------------------------------------------------------
 .../OSGIConfigAdminPropertySource.java          |  91 +++++++++++++++
 .../injection/OSGIConfigurationInjector.java    |  58 ++++++++++
 .../osgi/injection/TamayaOSGIInjector.java      | 113 +++++++++++++++++++
 .../tamaya/osgi/injection/AbstractOSGITest.java |  99 ++++++++++++++++
 .../tamaya/osgi/injection/ActivatorTest.java    |  43 +++++++
 .../OSGIConfigAdminPropertySourceTest.java      |  65 +++++++++++
 .../OSGIConfigurationInjectorTest.java          |  97 ++++++++++++++++
 osgi/pom.xml                                    |   1 +
 8 files changed, 567 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/3e522512/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySource.java
----------------------------------------------------------------------
diff --git 
a/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySource.java
 
b/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySource.java
new file mode 100644
index 0000000..6689b31
--- /dev/null
+++ 
b/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySource.java
@@ -0,0 +1,91 @@
+package org.apache.tamaya.osgi.injection;
+
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertyValue;
+import org.apache.tamaya.spisupport.BasePropertySource;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import java.io.IOException;
+import java.util.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * This is a Tamaya PropertySource, which internally wraps the OSGI 
ConfigAdmin service, preconfigured
+ * for a PID and (optionally) location.
+ */
+public class OSGIConfigAdminPropertySource extends BasePropertySource{
+
+    private static final Logger LOG = 
Logger.getLogger(OSGIConfigAdminPropertySource.class.getName());
+    private ConfigurationAdmin configurationAdmin;
+    private String pid;
+    private String location;
+
+    public OSGIConfigAdminPropertySource(ConfigurationAdmin 
configurationAdmin, String pid){
+        this.configurationAdmin = Objects.requireNonNull(configurationAdmin);
+        this.pid = Objects.requireNonNull(pid);
+    }
+
+    public OSGIConfigAdminPropertySource(ConfigurationAdmin 
configurationAdmin, String pid, String location){
+        this.configurationAdmin = Objects.requireNonNull(configurationAdmin);
+        this.pid = Objects.requireNonNull(pid);
+        this.location = location;
+    }
+
+    /**
+     * Get the configured OSGI service PID.
+     * @return the pid, nnever null.
+     */
+    public String getPid() {
+        return pid;
+    }
+
+    /**
+     * Get the configured OSGI config location, may be null.
+     * @return the location, or null.
+     */
+    public String getLocation() {
+        return location;
+    }
+
+    @Override
+    public PropertyValue get(String key) {
+        try {
+            Configuration osgiConfig = 
configurationAdmin.getConfiguration(pid, location);
+            Dictionary<String,Object> props = osgiConfig.getProperties();
+            if(props!=null){
+                Object value = props.get(key);
+                if(value!=null) {
+                    return PropertyValue.of(key, String.valueOf(value), "OSGI 
ConfigAdmin: " + pid);
+                }
+            }
+        } catch (IOException e) {
+            LOG.log(Level.FINEST,  e, () -> "No config for PID: " + pid);
+        }
+        return null;
+    }
+
+    @Override
+    public Map<String, PropertyValue> getProperties() {
+        try {
+            Configuration osgiConfig = 
configurationAdmin.getConfiguration(pid);
+            Dictionary<String,Object> props = osgiConfig.getProperties();
+            if(props!=null){
+                Map<String, PropertyValue> result = new HashMap<>();
+                Enumeration<String> keys = props.keys();
+                while(keys.hasMoreElements()){
+                    String key = keys.nextElement();
+                    Object value = props.get(key);
+                    result.put(key, PropertyValue.of(key, 
String.valueOf(value), "OSGI ConfigAdmin: " + pid));
+                }
+                return result;
+            }
+        } catch (IOException e) {
+            LOG.log(Level.FINEST,  e, () -> "No config for PID: " + pid);
+        }
+        return Collections.emptyMap();
+    }
+}
+
+

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/3e522512/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjector.java
----------------------------------------------------------------------
diff --git 
a/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjector.java
 
b/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjector.java
new file mode 100644
index 0000000..ddec058
--- /dev/null
+++ 
b/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjector.java
@@ -0,0 +1,58 @@
+package org.apache.tamaya.osgi.injection;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.apache.tamaya.inject.ConfigurationInjection;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import java.util.Objects;
+import java.util.function.Supplier;
+
+/**
+ * Created by atsti on 03.10.2017.
+ */
+final class OSGIConfigurationInjector{
+
+    private ConfigurationAdmin cm;
+    private Configuration tamayaOSGIConfiguration;
+    private String pid;
+    private String location;
+
+
+    public OSGIConfigurationInjector(ConfigurationAdmin cm, String pid){
+        this(cm, pid, null);
+    }
+
+    public OSGIConfigurationInjector(ConfigurationAdmin cm, String pid, String 
location){
+        this.cm = Objects.requireNonNull(cm);
+        tamayaOSGIConfiguration = ConfigurationProvider.createConfiguration(
+                ConfigurationProvider.getConfigurationContextBuilder()
+                .addDefaultPropertyConverters()
+                .addDefaultPropertyFilters()
+                .addPropertySources(new OSGIConfigAdminPropertySource(cm, pid, 
location))
+                .build());
+    }
+
+    public <T> T configure(T instance){
+        return ConfigurationInjection.getConfigurationInjector()
+                .configure(instance, tamayaOSGIConfiguration);
+    }
+
+    public <T> Supplier<T> 
getConfiguredSupplier(java.util.function.Supplier<T> supplier){
+        return ConfigurationInjection.getConfigurationInjector()
+                .getConfiguredSupplier(supplier, tamayaOSGIConfiguration);
+    }
+
+    /**
+     * Creates a template implementing the annotated methods based on current 
configuration data.
+     *
+     * @param <T> the type of the template.
+     * @param templateType the type of the template to be created.
+     * @return the configured template.
+     */
+    public <T> T createTemplate(Class<T> templateType){
+        return ConfigurationInjection.getConfigurationInjector()
+                .createTemplate(templateType, tamayaOSGIConfiguration);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/3e522512/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/TamayaOSGIInjector.java
----------------------------------------------------------------------
diff --git 
a/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/TamayaOSGIInjector.java
 
b/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/TamayaOSGIInjector.java
new file mode 100644
index 0000000..4c04d41
--- /dev/null
+++ 
b/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/TamayaOSGIInjector.java
@@ -0,0 +1,113 @@
+/*
+ * 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.tamaya.osgi.injection;
+
+import org.apache.tamaya.osgi.TamayaConfigPlugin;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.util.tracker.ServiceTracker;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Logger;
+
+/**
+ * Class that monitors services and configures them if they have {@code 
Tamaya-Config = true} in the
+ * service settings.
+ */
+public class TamayaOSGIInjector {
+
+    public static final String TAMAYA_INJECTION_ENABLED_MANIFEST = 
"Tamaya-Config-Inject";
+    public static final String TAMAYA_INJECTION_ENABLED_PROP = 
"tamaya-config-inject";
+    private static final Logger log = 
Logger.getLogger(TamayaConfigPlugin.class.getName());
+    private BundleContext context;
+    private ConfigurationAdmin cm;
+    private ServiceTracker<Object, Object> tracker;
+    private static final Map<String, OSGIConfigurationInjector> INJECTORS = 
new ConcurrentHashMap<>();
+
+    public TamayaOSGIInjector(BundleContext context) {
+        this.context = Objects.requireNonNull(context);
+    }
+
+    public void start(){
+        tracker = new ServiceTracker<Object, Object>(context, 
Object.class.getName(), null) {
+            @Override
+            public Object addingService(ServiceReference reference) {
+                log.info("Checking service for configuration: " + reference);
+                Object service =  super.addingService(reference);
+                if(isInjectionEnabled(reference)) {
+                    String pid = 
(String)reference.getProperty(Constants.SERVICE_PID);
+                    if(pid==null){
+                        pid = reference.getBundle().getSymbolicName();
+                    }
+                    OSGIConfigurationInjector injector = getInjector(pid, 
reference.getBundle().getLocation());
+                    injector.configure(service);
+                }
+                return service;
+            }
+
+            @Override
+            public void modifiedService(ServiceReference<Object> reference, 
Object service) {
+                super.modifiedService(reference, service);
+                if(isInjectionEnabled(reference)) {
+                    String pid = 
(String)reference.getProperty(Constants.SERVICE_PID);
+                    if(pid==null){
+                        pid = reference.getBundle().getSymbolicName();
+                    }
+                    OSGIConfigurationInjector injector = getInjector(pid, 
reference.getBundle().getLocation());
+                    injector.configure(service);
+                }
+            }
+        };
+        tracker.open(true);
+    }
+
+    public void stop(){
+        if(tracker!=null){
+            tracker.close();
+            tracker = null;
+        }
+    }
+
+    private OSGIConfigurationInjector getInjector(String pid, String location){
+        String key = location==null?pid.trim():pid.trim()+"::"+location.trim();
+        OSGIConfigurationInjector injector = INJECTORS.get(key);
+        if(injector==null){
+            injector = new OSGIConfigurationInjector(cm, pid, location);
+            INJECTORS.put(key, injector);
+        }
+        return injector;
+    }
+
+    public static boolean isInjectionEnabled(ServiceReference reference){
+        String enabledVal = 
(String)reference.getProperty(TAMAYA_INJECTION_ENABLED_PROP);
+        if(enabledVal!=null){
+            return Boolean.parseBoolean(enabledVal);
+        }
+        enabledVal = 
reference.getBundle().getHeaders().get(TAMAYA_INJECTION_ENABLED_MANIFEST);
+        if(enabledVal!=null){
+            return Boolean.parseBoolean(enabledVal);
+        }
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/3e522512/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/AbstractOSGITest.java
----------------------------------------------------------------------
diff --git 
a/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/AbstractOSGITest.java
 
b/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/AbstractOSGITest.java
new file mode 100644
index 0000000..e3f73c3
--- /dev/null
+++ 
b/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/AbstractOSGITest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.tamaya.osgi.injection;
+
+import org.apache.tamaya.osgi.TamayaConfigPlugin;
+import org.junit.Before;
+import org.mockito.Mock;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.*;
+
+/**
+ * Created by atsticks on 27.09.17.
+ */
+public abstract class AbstractOSGITest {
+
+    private Map<String,Hashtable<String, Object>> properties = new 
ConcurrentHashMap<>();
+
+    @Mock
+    protected BundleContext bundleContext;
+
+    @Mock
+    protected ConfigurationAdmin cm;
+
+    @Mock
+    private ServiceReference<ConfigurationAdmin> cmRef;
+    @Mock
+    private ServiceReference<TamayaConfigPlugin> tamayaRef;
+
+    protected TamayaConfigPlugin tamayaConfigPlugin;
+
+    protected Dictionary<String,Object> getProperties(String pid){
+        return this.properties.get(pid);
+    }
+
+    @Before
+    public void setup()throws Exception{
+        doAnswer(invocation -> {
+            return initConfigurationMock((String)invocation.getArguments()[0]);
+        }).when(cm).getConfiguration(any());
+        doAnswer(invocation -> {
+            return initConfigurationMock((String)invocation.getArguments()[0]);
+        }).when(cm).getConfiguration(any(), any());
+        doReturn(new Bundle[0]).when(bundleContext).getBundles();
+        
doReturn(cmRef).when(bundleContext).getServiceReference(ConfigurationAdmin.class);
+        doReturn(cm).when(bundleContext).getService(cmRef);
+        
doReturn(tamayaRef).when(bundleContext).getServiceReference(TamayaConfigPlugin.class);
+        tamayaConfigPlugin = new TamayaConfigPlugin(bundleContext);
+        doReturn(tamayaConfigPlugin).when(bundleContext).getService(tamayaRef);
+    }
+
+    protected Configuration initConfigurationMock(final String pid)throws 
Exception{
+        Configuration config = mock(Configuration.class);
+        doAnswer(invocation -> {
+            Hashtable<String,Object> props = properties.get(pid);
+            props.clear();
+            props.putAll((Map<? extends String, ?>) 
invocation.getArguments()[0]);
+            return null;
+        }).when(config).update(any(Dictionary.class));
+        doAnswer(invocation -> {
+            Hashtable<String,Object> props = properties.get(pid);
+            if(props==null){
+                props = new Hashtable<>();
+                properties.put(pid, props);
+                for(Map.Entry en:System.getProperties().entrySet()){
+                    props.put(en.getKey().toString(), en.getValue());
+                }
+            }
+            return new Hashtable<>(props);
+        }).when(config).getProperties();
+        return config;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/3e522512/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/ActivatorTest.java
----------------------------------------------------------------------
diff --git 
a/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/ActivatorTest.java
 
b/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/ActivatorTest.java
new file mode 100644
index 0000000..9cd587f
--- /dev/null
+++ 
b/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/ActivatorTest.java
@@ -0,0 +1,43 @@
+/*
+ * 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.tamaya.osgi.injection;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.verify;
+
+/**
+ * Created by atsti on 03.10.2017.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ActivatorTest extends AbstractOSGITest{
+
+    @Test
+    public void startStop() throws Exception {
+        Activator activator = new Activator();
+        activator.start(this.bundleContext);
+        verify(bundleContext).registerService(eq(TamayaOSGIInjector.class), 
anyObject(), anyObject());
+        activator.stop(this.bundleContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/3e522512/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySourceTest.java
----------------------------------------------------------------------
diff --git 
a/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySourceTest.java
 
b/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySourceTest.java
new file mode 100644
index 0000000..f83ac56
--- /dev/null
+++ 
b/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySourceTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.tamaya.osgi.injection;
+
+import org.apache.tamaya.spi.PropertyValue;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Map;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by atsti on 03.10.2017.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class OSGIConfigAdminPropertySourceTest extends AbstractOSGITest{
+
+    OSGIConfigAdminPropertySource propertySource;
+
+    @Before
+    public void init(){
+        propertySource = new OSGIConfigAdminPropertySource(cm, "tamaya");
+    }
+
+    @Test
+    public void get() throws Exception {
+        PropertyValue val = propertySource.get("java.home");
+        assertNotNull(val);
+        assertEquals(val.getKey(), "java.home");
+        assertEquals(val.getValue(), System.getProperty("java.home"));
+        val = propertySource.get("foo.bar");
+        assertNull(val);
+    }
+
+    @Test
+    public void getProperties() throws Exception {
+        Map<String,PropertyValue> props = propertySource.getProperties();
+        assertNotNull(props);
+        PropertyValue val = props.get("java.home");
+        assertEquals(val.getKey(), "java.home");
+        assertEquals(val.getValue(), System.getProperty("java.home"));
+        val = props.get("foo.bar");
+        assertNull(val);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/3e522512/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjectorTest.java
----------------------------------------------------------------------
diff --git 
a/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjectorTest.java
 
b/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjectorTest.java
new file mode 100644
index 0000000..6735e7a
--- /dev/null
+++ 
b/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjectorTest.java
@@ -0,0 +1,97 @@
+/*
+ * 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.tamaya.osgi.injection;
+
+import org.apache.tamaya.inject.api.Config;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.function.Supplier;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by atsti on 03.10.2017.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class OSGIConfigurationInjectorTest extends AbstractOSGITest{
+
+
+    @Test
+    public void configure() throws Exception {
+        OSGIConfigurationInjector injector = new OSGIConfigurationInjector(cm, 
"OSGIConfigurationInjectorTest");
+        Example example = new Example();
+        Example result = injector.configure(example);
+        assertNotNull(result);
+        assertTrue(result==example);
+        checkExampleConfig(example);
+    }
+
+    @Test
+    public void getConfiguredSupplier() throws Exception {
+        OSGIConfigurationInjector injector = new OSGIConfigurationInjector(cm, 
"OSGIConfigurationInjectorTest");
+        Supplier<Example> supplier = 
injector.getConfiguredSupplier(Example::new);
+        assertNotNull(supplier);
+        Example example = supplier.get();
+        checkExampleConfig(example);
+    }
+
+    @Test
+    public void createTemplate() throws Exception {
+        OSGIConfigurationInjector injector = new OSGIConfigurationInjector(cm, 
"OSGIConfigurationInjectorTest");
+        TemplateExample template = 
injector.createTemplate(TemplateExample.class);
+        checkExampleConfig(template);
+    }
+
+    private void checkExampleConfig(Example example) {
+        assertNotNull(example);
+        assertEquals(example.javaHome, System.getProperty("java.home"));
+        assertEquals(example.javaVersion, System.getProperty("java.version"));
+        assertEquals(example.javaUsed, true);
+    }
+
+    private void checkExampleConfig(TemplateExample template) {
+        assertNotNull(template);
+        assertEquals(template.getJavaHome(), System.getProperty("java.home"));
+        assertEquals(template.javaVersion(), 
System.getProperty("java.version"));
+        assertEquals(template.isJavaUsed(), true);
+    }
+
+    private static final class Example {
+        @Config("java.home")
+        String javaHome;
+        @Config("java.version")
+        String javaVersion;
+        @Config(value = "java.used", defaultValue = "true")
+        boolean javaUsed;
+    }
+
+    private interface TemplateExample {
+
+        @Config("java.home")
+        String getJavaHome();
+
+        @Config("java.version")
+        String javaVersion();
+
+        @Config(value = "java.used", defaultValue = "true")
+        boolean isJavaUsed();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/3e522512/osgi/pom.xml
----------------------------------------------------------------------
diff --git a/osgi/pom.xml b/osgi/pom.xml
index 40ba101..18df6ee 100644
--- a/osgi/pom.xml
+++ b/osgi/pom.xml
@@ -101,6 +101,7 @@
         <module>karaf-shell</module>
         <module>karaf-features</module>
         <module>gogo-shell</module>
+        <module>injection</module>
     </modules>
 
 </project>

Reply via email to