You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by an...@apache.org on 2017/10/16 23:03:20 UTC
[4/7] incubator-tamaya-extensions git commit: TAMAYA-300 Added tests
to improve mutation coverage. Movewd OSGI and MP to extensions.
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/common/src/test/java/org/apache/tamaya/osgi/commands/ConfigCommandsTest.java
----------------------------------------------------------------------
diff --git a/modules/osgi/common/src/test/java/org/apache/tamaya/osgi/commands/ConfigCommandsTest.java b/modules/osgi/common/src/test/java/org/apache/tamaya/osgi/commands/ConfigCommandsTest.java
new file mode 100644
index 0000000..a2c273b
--- /dev/null
+++ b/modules/osgi/common/src/test/java/org/apache/tamaya/osgi/commands/ConfigCommandsTest.java
@@ -0,0 +1,204 @@
+/*
+ * 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.commands;
+
+import org.apache.tamaya.osgi.AbstractOSGITest;
+import org.apache.tamaya.osgi.Policy;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by atsti on 30.09.2017.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ConfigCommandsTest extends AbstractOSGITest{
+ @Test
+ public void getInfo() throws Exception {
+ String result = ConfigCommands.getInfo(tamayaConfigPlugin);
+ assertNotNull(result);
+ System.out.println(result);
+ assertTrue(result.contains("Property Sources"));
+ assertTrue(result.contains("Property Converter"));
+ assertTrue(result.contains("Property Filter"));
+ assertTrue(result.contains("ConfigurationContext"));
+ assertTrue(result.contains("Configuration"));
+ }
+
+ @Test
+ public void readTamayaConfig() throws Exception {
+ String result = ConfigCommands.readTamayaConfig("java", null);
+ assertNotNull(result);
+ System.out.println(result);
+ assertTrue(result.contains(".version"));
+ assertTrue(result.contains("Section"));
+ assertTrue(result.contains("java"));
+ result = ConfigCommands.readTamayaConfig("java", "version");
+ assertNotNull(result);
+ assertFalse(result.contains(".version"));
+ assertTrue(result.contains("Section"));
+ assertTrue(result.contains("java"));
+ assertTrue(result.contains("Filter"));
+ assertTrue(result.contains("version"));
+ assertFalse(result.contains("java.vendor"));
+ System.out.println("readTamayaConfig: " + result);
+ }
+
+ @Test
+ public void readTamayaConfig4PID() throws Exception {
+ String result = ConfigCommands.readTamayaConfig4PID("test", null);
+ assertNotNull(result);
+ System.out.println(result);
+ assertTrue(result.contains("Configuration"));
+ assertTrue(result.contains("test"));
+ }
+
+ @Test
+ public void applyTamayaConfiguration() throws Exception {
+ String result = ConfigCommands.applyTamayaConfiguration(tamayaConfigPlugin, "applyTamayaConfiguration", Policy.OVERRIDE.toString(), true);
+ assertNotNull(result);
+ System.out.println(result);
+ assertTrue(result.contains("OSGI Configuration for PID"));
+ assertTrue(result.contains("applyTamayaConfiguration"));
+ assertTrue(result.contains("OVERRIDE"));
+ assertTrue(result.contains("Applied"));
+ assertTrue(result.contains("false"));
+ }
+
+ @Test
+ public void readOSGIConfiguration() throws Exception {
+ String result = ConfigCommands.readOSGIConfiguration(tamayaConfigPlugin, "readOSGIConfiguration", "java");
+ assertNotNull(result);
+ System.out.println(result);
+ assertTrue(result.contains("OSGI Configuration for PID"));
+ assertTrue(result.contains("readOSGIConfiguration"));
+ assertTrue(result.contains("java.home"));
+ }
+
+ @Test
+ public void getDefaultOpPolicy() throws Exception {
+ Policy mode = tamayaConfigPlugin.getDefaultPolicy();
+ String result = ConfigCommands.getDefaultOpPolicy(tamayaConfigPlugin);
+ assertNotNull(result);
+ assertTrue(result.contains(mode.toString()));
+ }
+
+ @Test
+ public void setDefaultOpPolicy() throws Exception {
+ String result = ConfigCommands.setDefaultOpPolicy(tamayaConfigPlugin, Policy.EXTEND.toString());
+ assertNotNull(result);
+ assertTrue(result.contains("EXTEND"));
+ assertEquals(tamayaConfigPlugin.getDefaultPolicy(), Policy.EXTEND);
+ result = ConfigCommands.setDefaultOpPolicy(tamayaConfigPlugin, Policy.UPDATE_ONLY.toString());
+ assertNotNull(result);
+ assertTrue(result.contains("UPDATE_ONLY"));
+ assertEquals(tamayaConfigPlugin.getDefaultPolicy(), Policy.UPDATE_ONLY);
+ }
+
+ @Test
+ public void getProperty() throws Exception {
+ String result = ConfigCommands.getProperty("system-properties", "java.version", false);
+ assertNotNull(result);
+ System.out.println(result);
+ assertEquals(result, System.getProperty("java.version"));
+ result = ConfigCommands.getProperty("system-properties", "java.version", true);
+ assertNotNull(result);
+ }
+
+ @Test
+ public void getPropertySource() throws Exception {
+ String result = ConfigCommands.getPropertySource("system-properties");
+ assertNotNull(result);
+ System.out.println(result);
+ assertTrue(result.contains("Property Source"));
+ assertTrue(result.contains("ID"));
+ assertTrue(result.contains("system-properties"));
+ assertTrue(result.contains("Ordinal"));
+ assertTrue(result.contains("java.version"));
+ }
+
+ @Test
+ public void getPropertySourceOverview() throws Exception {
+ String result = ConfigCommands.getPropertySourceOverview();
+ assertNotNull(result);
+ System.out.println(result);
+ assertTrue(result.contains("Ordinal"));
+ assertTrue(result.contains("Class"));
+ assertTrue(result.contains("Ordinal"));
+ assertTrue(result.contains("ID"));
+ assertTrue(result.contains("Ordinal"));
+ assertTrue(result.contains("system-properties"));
+ assertTrue(result.contains("environment-properties"));
+ assertTrue(result.contains("CLI"));
+ }
+
+ @Test
+ public void setDefaultEnabled() throws Exception {
+ String result = ConfigCommands.setDefaultEnabled(tamayaConfigPlugin, true);
+ assertNotNull(result);
+ System.out.println(result);
+ assertTrue(result.contains(TamayaConfigService.TAMAYA_ENABLED_PROP+"=true"));
+ assertTrue(tamayaConfigPlugin.isTamayaEnabledByDefault());
+ result = ConfigCommands.setDefaultEnabled(tamayaConfigPlugin, false);
+ assertNotNull(result);
+ assertTrue(result.contains(TamayaConfigService.TAMAYA_ENABLED_PROP+"=false"));
+ assertFalse(tamayaConfigPlugin.isTamayaEnabledByDefault());
+ }
+
+ @Test
+ public void getDefaultEnabled() throws Exception {
+ tamayaConfigPlugin.setTamayaEnabledByDefault(true);
+ String result = ConfigCommands.getDefaultEnabled(tamayaConfigPlugin);
+ System.out.println(result);
+ tamayaConfigPlugin.setTamayaEnabledByDefault(false);
+ result = ConfigCommands.getDefaultEnabled(tamayaConfigPlugin);
+ assertNotNull(result);
+ assertTrue(result.equals("false"));
+ }
+
+ @Test
+ public void setAutoUpdateEnabled() throws Exception {
+ String result = ConfigCommands.setAutoUpdateEnabled(tamayaConfigPlugin, true);
+ assertNotNull(result);
+ System.out.println(result);
+ assertTrue(result.contains("true"));
+ assertTrue(result.contains(TamayaConfigService.TAMAYA_AUTO_UPDATE_ENABLED_PROP));
+ assertTrue(tamayaConfigPlugin.isAutoUpdateEnabled());
+ result = ConfigCommands.setAutoUpdateEnabled(tamayaConfigPlugin, false);
+ assertNotNull(result);
+ assertTrue(result.contains("false"));
+ assertTrue(result.contains(TamayaConfigService.TAMAYA_AUTO_UPDATE_ENABLED_PROP));
+ assertFalse(tamayaConfigPlugin.isAutoUpdateEnabled());
+ }
+
+ @Test
+ public void getAutoUpdateEnabled() throws Exception {
+ tamayaConfigPlugin.setAutoUpdateEnabled(true);
+ String result = ConfigCommands.getAutoUpdateEnabled(tamayaConfigPlugin);
+ System.out.println(result);
+ assertTrue(result.contains("true"));
+ tamayaConfigPlugin.setAutoUpdateEnabled(false);
+ result = ConfigCommands.getAutoUpdateEnabled(tamayaConfigPlugin);
+ assertNotNull(result);
+ assertTrue(result.contains("false"));
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/common/src/test/java/org/apache/tamaya/osgi/commands/HistoryCommandsTest.java
----------------------------------------------------------------------
diff --git a/modules/osgi/common/src/test/java/org/apache/tamaya/osgi/commands/HistoryCommandsTest.java b/modules/osgi/common/src/test/java/org/apache/tamaya/osgi/commands/HistoryCommandsTest.java
new file mode 100644
index 0000000..ad32857
--- /dev/null
+++ b/modules/osgi/common/src/test/java/org/apache/tamaya/osgi/commands/HistoryCommandsTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.commands;
+
+import org.apache.tamaya.osgi.AbstractOSGITest;
+import org.apache.tamaya.osgi.ConfigHistory;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by atsti on 30.09.2017.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class HistoryCommandsTest extends AbstractOSGITest {
+
+ @Test
+ public void clearHistory() throws Exception {
+ ConfigHistory.configured("clearHistory1", "test");
+ ConfigHistory.configured("clearHistory2", "test");
+ assertTrue(ConfigHistory.getHistory("clearHistory1").size()==1);
+ assertTrue(ConfigHistory.getHistory("clearHistory2").size()==1);
+ assertTrue(ConfigHistory.getHistory("clearHistory3").size()==0);
+ String result = HistoryCommands.clearHistory(tamayaConfigPlugin, "clearHistory1");
+ assertTrue(result.contains("PID"));
+ assertTrue(result.contains("clearHistory1"));
+ assertTrue(ConfigHistory.getHistory("clearHistory1").size()==0);
+ assertTrue(ConfigHistory.getHistory("clearHistory2").size()==1);
+ assertTrue(ConfigHistory.getHistory("clearHistory3").size()==0);
+ ConfigHistory.configured("clearHistory1", "test");
+ result = HistoryCommands.clearHistory(tamayaConfigPlugin, "*");
+ assertTrue(result.contains("PID"));
+ assertTrue(result.contains("*"));
+ assertTrue(ConfigHistory.getHistory("clearHistory1").size()==0);
+ assertTrue(ConfigHistory.getHistory("clearHistory2").size()==0);
+ assertTrue(ConfigHistory.getHistory("clearHistory3").size()==0);
+
+ }
+
+ @Test
+ public void getHistory() throws Exception {
+ ConfigHistory.configured("getHistory", "test");
+ ConfigHistory.configuring("getHistory", "test");
+ ConfigHistory.propertySet("getHistory", "k1", "v1", null);
+ ConfigHistory.propertySet("getHistory", "k2", null, "v2");
+ String result = HistoryCommands.getHistory(tamayaConfigPlugin, "getHistory");
+ assertNotNull(result);
+ assertTrue(result.contains("k1"));
+ assertTrue(result.contains("v1"));
+ assertTrue(result.contains("test"));
+ result = HistoryCommands.getHistory(tamayaConfigPlugin, "getHistory", ConfigHistory.TaskType.BEGIN.toString());
+ assertNotNull(result);
+ assertTrue(result.contains("getHistory"));
+ assertTrue(result.contains("test"));
+ assertFalse(result.contains("k1"));
+ assertFalse(result.contains("v2"));
+ }
+
+ @Test
+ public void getSetMaxHistorySize() throws Exception {
+ String result = HistoryCommands.getMaxHistorySize(tamayaConfigPlugin);
+ assertEquals(result, String.valueOf(tamayaConfigPlugin.getMaxHistorySize()));
+ result = HistoryCommands.setMaxHistorySize(tamayaConfigPlugin, 111);
+ assertEquals(result, "tamaya-max-getHistory-size=111");
+ result = HistoryCommands.getMaxHistorySize(tamayaConfigPlugin);
+ assertEquals(result, "111");
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/common/src/test/resources/META-INF/javaconfiguration.properties
----------------------------------------------------------------------
diff --git a/modules/osgi/common/src/test/resources/META-INF/javaconfiguration.properties b/modules/osgi/common/src/test/resources/META-INF/javaconfiguration.properties
new file mode 100644
index 0000000..d0b0cb8
--- /dev/null
+++ b/modules/osgi/common/src/test/resources/META-INF/javaconfiguration.properties
@@ -0,0 +1,22 @@
+# 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.
+#
+[tamaya]my.testProperty1=success1
+[tamaya]my.testProperty2=success2
+[tamaya]my.testProperty3=success3
+[tamaya]my.testProperty4=success4
+[tamaya]java.version=Java2000
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/common/src/test/resources/org.ops4j.pax.logging.cfg
----------------------------------------------------------------------
diff --git a/modules/osgi/common/src/test/resources/org.ops4j.pax.logging.cfg b/modules/osgi/common/src/test/resources/org.ops4j.pax.logging.cfg
new file mode 100644
index 0000000..6683438
--- /dev/null
+++ b/modules/osgi/common/src/test/resources/org.ops4j.pax.logging.cfg
@@ -0,0 +1,48 @@
+# 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.
+#
+#updated by pax-exam
+#Sun Nov 27 20:55:11 CET 2016
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.sift.appender.append=true
+log4j.appender.out.maxFileSize=1MB
+log4j.appender.audit.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
+log4j.appender.sift.appender.file=${karaf.data}/log/$\\{bundle.name\\}.log
+log4j.appender.sift.appender.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.append=true
+log4j.appender.sift.appender=org.apache.log4j.FileAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out=org.apache.log4j.RollingFileAppender
+log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
+log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer
+log4j.appender.out.file=${karaf.data}/log/karaf.log
+log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender
+log4j.appender.audit.append=true
+log4j.appender.audit.maxBackupIndex=10
+log4j.appender.audit.layout=org.apache.log4j.PatternLayout
+log4j.appender.sift.key=bundle.name
+log4j.appender.audit.maxFileSize=1MB
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.additivity.org.apache.karaf.jaas.modules.audit=false
+log4j.logger.org.apache.karaf.jaas.modules.audit=INFO, audit
+log4j.appender.audit.file=${karaf.data}/security/audit.log
+log4j.appender.sift.default=karaf
+log4j.appender.sift.appender.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %m%n
+log4j.appender.out.maxBackupIndex=10
+log4j.appender.audit=org.apache.log4j.RollingFileAppender
+log4j.rootLogger=WARN, out, stdout, osgi\:*
+log4j.appender.out.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/AbstractOSGITest.java
----------------------------------------------------------------------
diff --git a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/AbstractOSGITest.java b/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/AbstractOSGITest.java
index d33e7e0..a4bab0f 100644
--- a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/AbstractOSGITest.java
+++ b/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/AbstractOSGITest.java
@@ -28,9 +28,14 @@ import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Map;
+import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import static org.mockito.Matchers.any;
@@ -61,6 +66,20 @@ public abstract class AbstractOSGITest {
return this.properties.get(pid);
}
+ String runTest(Callable<?> r) throws Exception {
+ PrintStream backup = System.out;
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ PrintStream pw = new PrintStream(bos);
+ System.setOut(pw);
+ try{
+ r.call();
+ return new String(bos.toByteArray());
+ }finally{
+ System.setOut(backup);
+ pw.flush();
+ }
+ }
+
@Before
public void setup()throws Exception{
doAnswer(invocation -> {
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/BackupCommandsTest.java
----------------------------------------------------------------------
diff --git a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/BackupCommandsTest.java b/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/BackupCommandsTest.java
index 8478cb1..0d5afd9 100644
--- a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/BackupCommandsTest.java
+++ b/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/BackupCommandsTest.java
@@ -24,8 +24,15 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
+import java.util.Hashtable;
+import java.util.UUID;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
/**
@@ -44,21 +51,57 @@ public class BackupCommandsTest extends AbstractOSGITest{
@Test
public void testBackup_Create() throws Exception {
- commands.tm_backup_create("testBackup_Create1",false);
- verify(tamayaConfigPlugin).createBackup("testBackup_Create1");
- commands.tm_backup_create("testBackup_Create2",true);
- verify(tamayaConfigPlugin).createBackup("testBackup_Create2");
+ String pid = UUID.randomUUID().toString();
+ doReturn(true).when(tamayaConfigPlugin).createBackup(pid);
+ String out = runTest(()-> {
+ commands.tm_backup_create(pid,false);
+ return null;
+ });
+ assertTrue(out.startsWith("Backup created, PID = " + pid));
+ assertTrue(out.contains("Key"));
+ assertTrue(out.contains("Value"));
+ assertTrue(out.contains("-------------------------------------------------------------"));
+ assertTrue(out.contains("java.home"));
+ assertTrue(out.contains(System.getProperty("java.home")));
+ verify(tamayaConfigPlugin).createBackup(pid);
+ String pid2 = UUID.randomUUID().toString();
+ doReturn(true).when(tamayaConfigPlugin).createBackup(pid2);
+ doReturn(true).when(tamayaConfigPlugin).containsBackup(pid2);
+ out = runTest(()-> {
+ commands.tm_backup_create(pid2,true);
+ return null;
+ });
+ assertTrue(out.startsWith("Backup created, PID = " + pid2));
+ assertTrue(out.contains("java.home"));
+ assertTrue(out.contains(System.getProperty("java.home")));
+ verify(tamayaConfigPlugin).createBackup(pid2);
}
@Test
public void testBackup_Delete() throws Exception {
- commands.tm_backup_delete("testBackup_Delete");
+ String out = runTest(()-> {
+ commands.tm_backup_delete("testBackup_Delete");
+ return null;
+ });
+ assertEquals("Backup deleted: testBackup_Delete".trim(), out.trim());
verify(tamayaConfigPlugin).deleteBackup("testBackup_Delete");
}
@Test
public void testBackup_Get() throws Exception {
- commands.tm_backup_get("testBackup_Get");
+ String out = runTest(()-> {
+ commands.tm_backup_get("testBackup_Get");
+ return null;
+ });
+ assertEquals("No backup found: testBackup_Get".trim(), out.trim());
+ verify(tamayaConfigPlugin).getBackup("testBackup_Get");
+ reset(tamayaConfigPlugin);
+ doReturn(new Hashtable<>()).when(tamayaConfigPlugin).getBackup("testBackup_Get");
+ out = runTest(()-> {
+ commands.tm_backup_get("testBackup_Get");
+ return null;
+ });
+ assertTrue(out.startsWith("PID: testBackup_Get\n"));
verify(tamayaConfigPlugin).getBackup("testBackup_Get");
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/ConfigCommandsTest.java
----------------------------------------------------------------------
diff --git a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/ConfigCommandsTest.java b/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/ConfigCommandsTest.java
index 5926029..dde7b42 100644
--- a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/ConfigCommandsTest.java
+++ b/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/ConfigCommandsTest.java
@@ -28,9 +28,12 @@ import org.mockito.runners.MockitoJUnitRunner;
import java.util.Dictionary;
import java.util.Hashtable;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
/**
@@ -49,22 +52,62 @@ public class ConfigCommandsTest extends AbstractOSGITest{
@Test
public void testPropertySources() throws Exception {
- commands.tm_propertysources();
+ String out = runTest(() -> {
+ commands.tm_propertysources();
+ return null;
+ });
+ assertTrue(out.startsWith("Property Sources"));
+ assertTrue(out.contains( "----------------"));
+ assertTrue(out.contains("ID"));
+ assertTrue(out.contains("Ordinal"));
+ assertTrue(out.contains("Class"));
+ assertTrue(out.contains("Size"));
+ assertTrue(out.contains("environment-properties"));
+ assertTrue(out.contains("system-properties"));
+
}
@Test
public void testProperty_Default() throws Exception {
- commands.tm_property("system-properties", "java.version", false);
+ String out = runTest(() -> {
+ commands.tm_property("system-properties", "java.version", false);
+ return null;
+ });
+ assertEquals(System.getProperty("java.version").trim(), out.trim());
}
@Test
public void testProperty_Extended() throws Exception {
- commands.tm_property("system-properties", "java.version", true);
+ String out = runTest(() -> {
+ commands.tm_property("system-properties", "java.version", true);
+ return null;
+ });
+ assertTrue(out.contains(System.getProperty("java.version")));
+ assertTrue(out.contains("Property Source"));
+ assertTrue(out.contains("Value"));
+ assertTrue(out.contains("system-properties"));
}
@Test
public void testPropertsource() throws Exception {
- commands.tm_propertysource("system-properties");
+ String out = runTest(() -> {
+ commands.tm_propertysource("system-properties");
+ return null;
+ });
+ assertTrue(out.startsWith("Property Source"));
+ assertTrue(out.contains("ID"));
+ assertTrue(out.contains("system-properties"));
+ assertTrue(out.contains("Ordinal"));
+ assertTrue(out.contains("1000"));
+ assertTrue(out.contains("Class"));
+ assertTrue(out.contains("SystemPropertySource"));
+ assertTrue(out.contains("Properties"));
+ assertTrue(out.contains("Key"));
+ assertTrue(out.contains("Value"));
+ assertTrue(out.contains("Source"));
+ assertTrue(out.contains("Meta"));
+ assertTrue(out.contains("java.version"));
+ assertTrue(out.contains(System.getProperty("java.version")));
}
@Test
@@ -72,8 +115,34 @@ public class ConfigCommandsTest extends AbstractOSGITest{
Dictionary<String,Object> testConfig = new Hashtable<>();
testConfig.put("test","testVal");
doReturn(testConfig).when(tamayaConfigPlugin).getOSGIConfiguration(any(),any());
- commands.tm_config(null,"testConfig");
- commands.tm_config("java","testConfig");
+ String out = runTest(() -> {
+ commands.tm_config(null, "testConfig");
+ return null;
+ });
+ assertTrue(out.contains("Tamaya Configuration"));
+ assertTrue(out.contains("Section"));
+ assertTrue(out.contains("[testConfig]"));
+ assertTrue(out.contains("Configuration"));
+ out = runTest(() -> {
+ commands.tm_config("java", "testConfig");
+ return null;
+ });
+ assertTrue(out.contains("Tamaya Configuration"));
+ assertTrue(out.contains("Section"));
+ assertTrue(out.contains("[testConfig]"));
+ assertTrue(out.contains("Filter"));
+ assertTrue(out.contains("java"));
+ assertTrue(out.contains("Configuration"));
+ out = runTest(() -> {
+ commands.tm_config("java", "");
+ return null;
+ });
+ assertTrue(out.contains("Tamaya Configuration"));
+ assertTrue(out.contains("Section"));
+ assertTrue(out.contains("java"));
+ assertTrue(out.contains("Configuration"));
+ assertTrue(out.contains(".version"));
+ assertTrue(out.contains(System.getProperty("java.version")));
}
@Test
@@ -81,9 +150,35 @@ public class ConfigCommandsTest extends AbstractOSGITest{
Dictionary<String,Object> testConfig = new Hashtable<>();
testConfig.put("test","testVal");
doReturn(testConfig).when(tamayaConfigPlugin).updateConfig(any(),any(), anyBoolean(), anyBoolean());
- commands.tm_apply_config("testApplyConfig", Policy.EXTEND, true);
+ String out = runTest(() -> {
+ commands.tm_apply_config("testApplyConfig", Policy.EXTEND, true);
+ return null;
+ });
+ assertTrue(out.contains("Applied Configuration"));
+ assertTrue(out.contains("PID"));
+ assertTrue(out.contains("testApplyConfig"));
+ assertTrue(out.contains("Policy"));
+ assertTrue(out.contains("EXTEND"));
+ assertTrue(out.contains("Dryrun"));
+ assertTrue(out.contains("true"));
+ assertTrue(out.contains("OSGI Configuration for PID"));
+ assertTrue(out.contains("test"));
+ assertTrue(out.contains("testVal"));
verify(tamayaConfigPlugin).updateConfig("testApplyConfig", Policy.EXTEND, true, true);
- commands.tm_apply_config("testApplyConfig", Policy.OVERRIDE, false);
+ out = runTest(() -> {
+ commands.tm_apply_config("testApplyConfig", Policy.OVERRIDE, false);
+ return null;
+ });
+ assertTrue(out.contains("Applied Configuration"));
+ assertTrue(out.contains("PID"));
+ assertTrue(out.contains("testApplyConfig"));
+ assertTrue(out.contains("Policy"));
+ assertTrue(out.contains("OVERRIDE"));
+ assertTrue(out.contains("Dryrun"));
+ assertTrue(out.contains("false"));
+ assertTrue(out.contains("OSGI Configuration for PID"));
+ assertTrue(out.contains("test"));
+ assertTrue(out.contains("testVal"));
verify(tamayaConfigPlugin).updateConfig("testApplyConfig", Policy.OVERRIDE, true, false);
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/HistoryCommandsTest.java
----------------------------------------------------------------------
diff --git a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/HistoryCommandsTest.java b/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/HistoryCommandsTest.java
index 1d129a0..8dac595 100644
--- a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/HistoryCommandsTest.java
+++ b/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/HistoryCommandsTest.java
@@ -18,12 +18,14 @@
*/
package org.apache.tamaya.gogo.shell;
+import org.apache.tamaya.osgi.ConfigHistory;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
/**
@@ -53,9 +55,12 @@ public class HistoryCommandsTest extends AbstractOSGITest{
}
@Test
- public void testHisatory_Get() throws Exception {
- commands.tm_history_get("testHisatory_Get", "");
- verify(tamayaConfigPlugin).getHistory("testHisatory_Get");
+ public void testHistory_Get() throws Exception {
+ commands.tm_history_get("testHistory_Get", "");
+ verify(tamayaConfigPlugin).getHistory("testHistory_Get");
+ reset(tamayaConfigPlugin);
+ commands.tm_history_get("testHistory_Get", "BEGIN,END");
+ verify(tamayaConfigPlugin).getHistory("testHistory_Get");
}
@Test
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/SettingsCommandsTest.java
----------------------------------------------------------------------
diff --git a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/SettingsCommandsTest.java b/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/SettingsCommandsTest.java
index fa4e3aa..bc165e9 100644
--- a/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/SettingsCommandsTest.java
+++ b/modules/osgi/gogo-shell/src/test/java/org/apache/tamaya/gogo/shell/SettingsCommandsTest.java
@@ -18,6 +18,7 @@
*/
package org.apache.tamaya.gogo.shell;
+import org.apache.tamaya.osgi.Policy;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -75,4 +76,17 @@ public class SettingsCommandsTest extends AbstractOSGITest{
verify(tamayaConfigPlugin).setAutoUpdateEnabled(false);
}
+ @Test
+ public void testPolicy() throws Exception {
+ commands.tm_policy();
+ verify(tamayaConfigPlugin).getDefaultPolicy();
+ }
+
+ @Test
+ public void testPolicySet() throws Exception {
+ commands.tm_policy_set(Policy.EXTEND);
+ verify(tamayaConfigPlugin).setDefaultPolicy(Policy.EXTEND);
+ commands.tm_policy_set(Policy.OVERRIDE);
+ verify(tamayaConfigPlugin).setDefaultPolicy(Policy.OVERRIDE);
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/injection/bnd.bnd
----------------------------------------------------------------------
diff --git a/modules/osgi/injection/bnd.bnd b/modules/osgi/injection/bnd.bnd
new file mode 100644
index 0000000..69e9637
--- /dev/null
+++ b/modules/osgi/injection/bnd.bnd
@@ -0,0 +1,34 @@
+-buildpath: \
+ osgi.annotation; version=6.0.0,\
+ osgi.core; version=6.0,\
+ osgi.cmpn; version=6.0
+
+-testpath: \
+ ${junit}
+
+javac.source: 1.8
+javac.target: 1.8
+
+Bundle-Activator: org.apache.tamaya.osgi.injection.Activator
+Bundle-Version: ${version}.${tstamp}
+Bundle-Name: Apache Tamaya - OSGI Configuration Injection
+Bundle-SymbolicName: org.apache.tamaya.osgi.injection
+Bundle-Description: Apacha Tamaya Configuration - OSGI Service Configuration Injection
+Bundle-Category: Implementation
+Bundle-Copyright: (C) Apache Foundation
+Bundle-License: Apache Licence version 2
+Bundle-Vendor: Apache Software Foundation
+Bundle-ContactAddress: dev-tamaya@incubator.apache.org
+Bundle-DocURL: http://tamaya.apache.org
+Import-Package: \
+ org.osgi.service.cm,\
+ org.osgi.framework,\
+ org.osgi.util.tracker,\
+ org.apache.tamaya,\
+ org.apache.tamaya.spi,\
+ org.apache.tamaya.functions,\
+ org.apache.tamaya.spisupport,\
+ org.apache.tamaya.osgi,\
+ org.apache.tamaya.inject.api,\
+ org.apache.tamaya.inject.spi,\
+ org.apache.tamaya.inject
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/injection/pom.xml
----------------------------------------------------------------------
diff --git a/modules/osgi/injection/pom.xml b/modules/osgi/injection/pom.xml
new file mode 100644
index 0000000..692e98f
--- /dev/null
+++ b/modules/osgi/injection/pom.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <!--
+
+ 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.
+ -->
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tamaya.ext</groupId>
+ <artifactId>tamaya-osgi-all</artifactId>
+ <version>0.4-incubating-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>tamaya-osgi-injection</artifactId>
+ <packaging>jar</packaging>
+ <name>Apache Tamaya :: OSGI :: Config Injection</name>
+ <description>Tamaya OSGI Configuration Injector</description>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.tamaya.ext</groupId>
+ <artifactId>tamaya-injection</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tamaya.ext</groupId>
+ <artifactId>tamaya-osgi</artifactId>
+ <version>${project.parent.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ </dependency>
+
+ <!-- Testing -->
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>java-hamcrest</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ </dependency>
+ </dependencies>
+
+</project>
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/Activator.java
----------------------------------------------------------------------
diff --git a/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/Activator.java b/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/Activator.java
new file mode 100644
index 0000000..b344415
--- /dev/null
+++ b/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/Activator.java
@@ -0,0 +1,95 @@
+/*
+ * 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.osgi.framework.*;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Objects;
+import java.util.function.Supplier;
+import java.util.logging.Logger;
+
+/**
+ * Activator that registers the Tamaya commands for the Felix Gogo console used
+ * in Apache Felix and Equinox.
+ */
+public class Activator implements BundleActivator {
+
+ private static final Logger LOG = Logger.getLogger(Activator.class.getName());
+
+ private TamayaOSGIInjector injector;
+ private ServiceRegistration<ConfigInjectionService> serviceReg;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ LOG.finest("Registering Tamaya OSGI Config injector...");
+ injector = new TamayaOSGIInjector(context);
+ Dictionary<String, Object> props = new Hashtable<>();
+ serviceReg = context.registerService(
+ ConfigInjectionService.class,
+ new TamayaConfigInjectionService(injector), props);
+ injector.start();
+ LOG.finest("Registered Tamaya OSGI Config injector.");
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ LOG.finest("Unregistering Tamaya Config injector...");
+ if (serviceReg != null) {
+ injector.stop();
+ serviceReg.unregister();
+ }
+ }
+
+ private final class TamayaConfigInjectionService implements ConfigInjectionService{
+
+ private TamayaOSGIInjector injector;
+
+ TamayaConfigInjectionService(TamayaOSGIInjector injector){
+ this.injector = Objects.requireNonNull(injector);
+ }
+
+ @Override
+ public boolean isInjectionEnabled(ServiceReference reference) {
+ return injector.isInjectionEnabled(reference);
+ }
+
+ @Override
+ public boolean isInjectionEnabled(Bundle bundle) {
+ return injector.isInjectionEnabled(bundle);
+ }
+
+ @Override
+ public <T> T configure(String pid, String location, T instance) {
+ return injector.configure(pid, location, instance);
+ }
+
+ @Override
+ public <T> Supplier<T> getConfiguredSupplier(String pid, String location, Supplier<T> supplier) {
+ return injector.getConfiguredSupplier(pid, location, supplier);
+ }
+
+ @Override
+ public <T> T createTemplate(String pid, String location, Class<T> templateType) {
+ return injector.createTemplate(pid, location, templateType);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/ConfigInjectionService.java
----------------------------------------------------------------------
diff --git a/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/ConfigInjectionService.java b/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/ConfigInjectionService.java
new file mode 100644
index 0000000..dce25e6
--- /dev/null
+++ b/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/ConfigInjectionService.java
@@ -0,0 +1,115 @@
+/*
+ * 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.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+
+import java.util.function.Supplier;
+
+/**
+ * OSGI service interface registered by the Tamaya configuration injector plugin.
+ */
+public interface ConfigInjectionService {
+ /** The manifest entry to enable Tamaya injection. */
+ String TAMAYA_INJECTION_ENABLED_MANIFEST = "Tamaya-Config-Inject";
+ /** The OSGI config entry to enable Tamaya injection. */
+ String TAMAYA_INJECTION_ENABLED_PROP = "tamaya-config-inject";
+
+ /**
+ * Checks if injection is enabled on the given service.
+ * @param reference the service reference, not null.
+ * @return true, if enjection is enabled.
+ */
+ boolean isInjectionEnabled(ServiceReference reference);
+
+ /**
+ * Checks if injection is enabled on the given service.
+ * @param bundle the bundle, not null.
+ * @return true, if enjection is enabled.
+ */
+ boolean isInjectionEnabled(Bundle bundle);
+
+ /**
+ * Configures the passed instance.
+ * @param instance the instance, not null.
+ * @param <T> the input and return type.
+ * @param pid the target PID, not null.
+ * @param location the optional location
+ * @return the configured instance.
+ */
+ <T> T configure(String pid, String location, T instance);
+
+ /**
+ * Creates a suzpplier, which supplies events as created by the basic supplier, which are
+ * automatically configured, when supplying.
+ * @param supplier the base supplier, not null.
+ * @param pid the target PID, not null.
+ * @param location the optional location
+ * @param <T> the type
+ * @return a configuring supplier.
+ */
+ <T> Supplier<T> getConfiguredSupplier(String pid, String location, java.util.function.Supplier<T> supplier);
+
+ /**
+ * 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.
+ * @param pid the target PID, not null.
+ * @param location the optional location
+ * @return the configured template.
+ */
+ <T> T createTemplate(String pid, String location, Class<T> templateType);
+
+ /**
+ * Configures the passed instance.
+ * @param instance the instance, not null.
+ * @param <T> the input and return type.
+ * @param bundle the target bundle, not null.
+ * @return the configured instance.
+ */
+ default <T> T configure(Bundle bundle, T instance){
+ return configure(bundle.getSymbolicName(), bundle.getLocation(), instance);
+ }
+
+ /**
+ * Creates a suzpplier, which supplies events as created by the basic supplier, which are
+ * automatically configured, when supplying.
+ * @param supplier the base supplier, not null.
+ * @param bundle the target bundle, not null.
+ * @param <T> the type
+ * @return a configuring supplier.
+ */
+ default <T> Supplier<T> getConfiguredSupplier(Bundle bundle, java.util.function.Supplier<T> supplier){
+ return getConfiguredSupplier(bundle.getSymbolicName(), bundle.getLocation(), supplier);
+ }
+
+ /**
+ * 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.
+ * @param bundle the target bundle, not null.
+ * @return the configured template.
+ */
+ default <T> T createTemplate(Bundle bundle, Class<T> templateType){
+ return createTemplate(bundle.getSymbolicName(), bundle.getLocation(), templateType);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySource.java
----------------------------------------------------------------------
diff --git a/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySource.java b/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySource.java
new file mode 100644
index 0000000..529468e
--- /dev/null
+++ b/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySource.java
@@ -0,0 +1,108 @@
+/*
+ * 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.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-extensions/blob/a1cd433a/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjector.java
----------------------------------------------------------------------
diff --git a/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjector.java b/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjector.java
new file mode 100644
index 0000000..4ac520d
--- /dev/null
+++ b/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjector.java
@@ -0,0 +1,118 @@
+/*
+ * 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.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.apache.tamaya.inject.ConfigurationInjection;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import java.util.Objects;
+import java.util.function.Supplier;
+
+/**
+ * This class wraps an OSGI Configuration based on PID and location and provides injection services for
+ * configuration.
+ */
+final class OSGIConfigurationInjector{
+ /** The OSGI ConfigManager. */
+ private ConfigurationAdmin cm;
+ /** The corresponding Tamaya configuration. */
+ private Configuration tamayaOSGIConfiguration;
+ /** The target PID. */
+ private String pid;
+ /** The target location. */
+ private String location;
+
+ /**
+ * Creates a new instance.
+ * @param cm the OSGI ConfigManager, not null.
+ * @param pid the target PID.
+ */
+ public OSGIConfigurationInjector(ConfigurationAdmin cm, String pid){
+ this(cm, pid, null);
+ }
+
+ /**
+ * Creates a new instance.
+ * @param cm the OSGI ConfigManager, not null.
+ * @param pid the target PID.
+ * @param location the optional location.
+ */
+ 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());
+ }
+
+ /**
+ * Get the target PID.
+ * @return the target PID, not null.
+ */
+ public String getPid() {
+ return pid;
+ }
+
+ /**
+ * Get the location.
+ * @return the location.
+ */
+ public String getLocation() {
+ return location;
+ }
+
+ /**
+ * Configures the passed instance.
+ * @param instance the instance, not null.
+ * @param <T> the input and return type.
+ * @return the configured instance.
+ */
+ public <T> T configure(T instance){
+ return ConfigurationInjection.getConfigurationInjector()
+ .configure(instance, tamayaOSGIConfiguration);
+ }
+
+ /**
+ * Creates a suzpplier, which supplies events as created by the basic supplier, which are
+ * automatically configured, when supplying.
+ * @param supplier the base supplier, not null.
+ * @param <T> the type
+ * @return a configuring supplier.
+ */
+ 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-extensions/blob/a1cd433a/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/TamayaOSGIInjector.java
----------------------------------------------------------------------
diff --git a/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/TamayaOSGIInjector.java b/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/TamayaOSGIInjector.java
new file mode 100644
index 0000000..2b245d3
--- /dev/null
+++ b/modules/osgi/injection/src/main/java/org/apache/tamaya/osgi/injection/TamayaOSGIInjector.java
@@ -0,0 +1,162 @@
+/*
+ * 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.function.Supplier;
+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{
+ /** The logger. */
+ private static final Logger log = Logger.getLogger(TamayaConfigPlugin.class.getName());
+ /** The bundle context. */
+ private BundleContext context;
+ /** OSGI Config manager. */
+ private ConfigurationAdmin cm;
+ /** The service tracker. */
+ private ServiceTracker<Object, Object> tracker;
+ /** The cached injectors. */
+ private static final Map<String, OSGIConfigurationInjector> INJECTORS = new ConcurrentHashMap<>();
+
+ /**
+ * Creates a new injector.
+ * @param context thge bundle contex, not null.
+ */
+ public TamayaOSGIInjector(BundleContext context) {
+ this.context = Objects.requireNonNull(context);
+ }
+
+ /**
+ * Starts the injector by registering the servidce tracker for all type of services. Injection is performed on
+ * service creation and modification.
+ */
+ 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);
+ }
+
+ /**
+ * Stops the service tracker listening.
+ */
+ public void stop(){
+ if(tracker!=null){
+ tracker.close();
+ tracker = null;
+ }
+ }
+
+ /**
+ * Get or create an injector for injecting OSGI configuration using Tamaya's injection API.
+ * @param pid the PID, not nbull.
+ * @param location the optional location.
+ * @return a injector, never 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;
+ }
+
+ /**
+ * Checks if injection is enabled on the given service.
+ * @param reference the service reference, not null.
+ * @return true, if injection is enabled.
+ */
+ static boolean isInjectionEnabled(ServiceReference reference){
+ String enabledVal = (String)reference.getProperty(ConfigInjectionService.TAMAYA_INJECTION_ENABLED_PROP);
+ if(enabledVal!=null){
+ return Boolean.parseBoolean(enabledVal);
+ }
+ if(enabledVal!=null){
+ return Boolean.parseBoolean(enabledVal);
+ }
+ return isInjectionEnabled(reference.getBundle());
+ }
+
+ /**
+ * Checks if injection is enabled on the given bundle.
+ * @param bundle the bundle, not null.
+ * @return true, if injection is enabled.
+ */
+ static boolean isInjectionEnabled(Bundle bundle){
+ String enabledVal = (String)bundle.getHeaders().get(ConfigInjectionService.TAMAYA_INJECTION_ENABLED_MANIFEST);
+ if(enabledVal!=null){
+ return Boolean.parseBoolean(enabledVal);
+ }
+ return false;
+ }
+
+ <T> T configure(String pid, String location, T instance) {
+ return getInjector(pid, location).configure(instance);
+ }
+
+ <T> Supplier<T> getConfiguredSupplier(String pid, String location, Supplier<T> supplier) {
+ return getInjector(pid, location).getConfiguredSupplier(supplier);
+ }
+
+ <T> T createTemplate(String pid, String location, Class<T> templateType) {
+ return getInjector(pid, location).createTemplate(templateType);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/AbstractOSGITest.java
----------------------------------------------------------------------
diff --git a/modules/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/AbstractOSGITest.java b/modules/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/AbstractOSGITest.java
new file mode 100644
index 0000000..e3f73c3
--- /dev/null
+++ b/modules/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-extensions/blob/a1cd433a/modules/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/ActivatorTest.java
----------------------------------------------------------------------
diff --git a/modules/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/ActivatorTest.java b/modules/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/ActivatorTest.java
new file mode 100644
index 0000000..9cd587f
--- /dev/null
+++ b/modules/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-extensions/blob/a1cd433a/modules/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySourceTest.java
----------------------------------------------------------------------
diff --git a/modules/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySourceTest.java b/modules/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigAdminPropertySourceTest.java
new file mode 100644
index 0000000..f83ac56
--- /dev/null
+++ b/modules/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-extensions/blob/a1cd433a/modules/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjectorTest.java
----------------------------------------------------------------------
diff --git a/modules/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjectorTest.java b/modules/osgi/injection/src/test/java/org/apache/tamaya/osgi/injection/OSGIConfigurationInjectorTest.java
new file mode 100644
index 0000000..6735e7a
--- /dev/null
+++ b/modules/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-extensions/blob/a1cd433a/modules/osgi/karaf-features/pom.xml
----------------------------------------------------------------------
diff --git a/modules/osgi/karaf-features/pom.xml b/modules/osgi/karaf-features/pom.xml
new file mode 100644
index 0000000..8d8c2d4
--- /dev/null
+++ b/modules/osgi/karaf-features/pom.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tamaya.ext</groupId>
+ <artifactId>tamaya-osgi-all</artifactId>
+ <version>0.4-incubating-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>tamaya-karaf-features</artifactId>
+ <packaging>feature</packaging>
+ <name>Apache Tamaya :: OSGI :: Karaf :: Features</name>
+ <description>Tamaya Karaf Feature Descriptor.</description>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.karaf.tooling</groupId>
+ <artifactId>karaf-maven-plugin</artifactId>
+ <configuration>
+ <startLevel>80</startLevel>
+ <aggregateFeatures>true</aggregateFeatures>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/karaf-features/src/main/features/features.xml
----------------------------------------------------------------------
diff --git a/modules/osgi/karaf-features/src/main/features/features.xml b/modules/osgi/karaf-features/src/main/features/features.xml
new file mode 100644
index 0000000..20c5ee3
--- /dev/null
+++ b/modules/osgi/karaf-features/src/main/features/features.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.3.0" name="org-apache-tamaya-all">
+ <features name="org-apache-tamaya-config" version="0.4-incubating">
+ <features name="org-apache-tamaya-configadmin" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-osgi_alpha/0.4-incubating/jar</bundle>
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-functions/0.4-incubating/jar</bundle>
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-spisupport/0.4-incubating/jar</bundle>
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-osgi-karaf_alpha/0.4-incubating/jar</bundle>
+ <features name="org-apache-tamaya-minimal" version="0.4-incubating">
+ <feature name="org-apache-tamaya-api" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya/tamaya-api/0.4-incubating/jar</bundle>
+ <bundle>mvn:org.apache.geronimo.specs/geronimo-annotation_1.2_spec/1.0-alpha-1/jar</bundle>
+ </feature>
+ <feature name="org-apache-tamaya-core" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya/tamaya-core/0.4-incubating/jar</bundle>
+ </feature>
+ </features>
+ </features>
+ <features name="org-apache-tamaya-config-injection" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-osgi-injection_alpha/0.4-incubating/jar</bundle>
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-injection-api/0.4-incubating/jar</bundle>
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-injection-se/0.4-incubating/jar</bundle>
+ </features>
+ <feature name="org-apache-tamaya-config-updater" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-events/0.4-incubating/jar</bundle>
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-osgi-updater_alpha/0.4-incubating/jar</bundle>
+ </feature>
+ </features>
+ <features name="org-apache-tamaya-formats" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-formats/0.4-incubating/jar</bundle>
+ </features>
+ <features name="org-apache-tamaya-formats-json" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-formats-json/0.4-incubating/jar</bundle>
+ </features>
+ <features name="org-apache-tamaya-formats-yaml" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-formats-yaml/0.4-incubating/jar</bundle>
+ </features>
+ <features name="org-apache-tamaya-filter" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-filter/0.4-incubating/jar</bundle>
+ </features>
+ <features name="org-apache-tamaya-resources" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-resources/0.4-incubating/jar</bundle>
+ </features>
+ <features name="org-apache-tamaya-resolver" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-resolver/0.4-incubating/jar</bundle>
+ </features>
+ <features name="org-apache-tamaya-mutable-config" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-mutable-config/0.4-incubating/jar</bundle>
+ </features>
+ <features name="org-apache-tamaya-spring" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-spring/0.4-incubating/jar</bundle>
+ </features>
+ <features name="org-apache-tamaya-optional" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-optional/0.4-incubating/jar</bundle>
+ </features>
+ <features name="org-apache-tamaya-jndi" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-jndi/0.4-incubating/jar</bundle>
+ </features>
+ <features name="org-apache-tamaya-features" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-features/0.4-incubating/jar</bundle>
+ </features>
+ <features name="org-apache-tamaya-events" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-events/0.4-incubating/jar</bundle>
+ </features>
+ <features name="org-apache-tamaya-uom" version="0.4-incubating">
+ <bundle>mvn:org.apache.tamaya.ext/tamaya-uom/0.4-incubating/jar</bundle>
+ </features>
+</features>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/a1cd433a/modules/osgi/karaf-shell/bnd.bnd
----------------------------------------------------------------------
diff --git a/modules/osgi/karaf-shell/bnd.bnd b/modules/osgi/karaf-shell/bnd.bnd
new file mode 100644
index 0000000..3bed7ca
--- /dev/null
+++ b/modules/osgi/karaf-shell/bnd.bnd
@@ -0,0 +1,38 @@
+-buildpath: \
+ osgi.annotation; version=6.0.0,\
+ osgi.core; version=6.0,\
+ osgi.cmpn; version=6.0
+
+-testpath: \
+ ${junit}
+
+javac.source: 1.8
+javac.target: 1.8
+
+Bundle-Version: ${version}.${tstamp}
+Bundle-Name: Apache Tamaya - Karaf Shell Commands
+Bundle-SymbolicName: org.apache.tamaya.osgi.karaf.shell
+Bundle-Description: Apacha Tamaya Configuration - Karaf Shell Extensions
+Bundle-Category: Implementation
+Bundle-Copyright: (C) Apache Foundation
+Bundle-License: Apache Licence version 2
+Bundle-Vendor: Apache Software Foundation
+Bundle-ContactAddress: dev-tamaya@incubator.apache.org
+Bundle-DocURL: http://tamaya.apache.org
+Export-Package: \
+ org.apache.tamaya.karaf.shell
+Import-Package: \
+ org.osgi.service.cm,\
+ org.osgi.framework,\
+ org.apache.tamaya,\
+ org.apache.tamaya.spi,\
+ org.apache.tamaya.functions,\
+ org.apache.tamaya.spisupport,\
+ org.apache.tamaya.osgi,\
+ org.apache.tamaya.osgi.commands,\
+ org.apache.felix.service.command,\
+ org.apache.karaf.shell.api.console,\
+ org.apache.karaf.shell.api.action,\
+ org.apache.karaf.shell.api.action.lifecycle,\
+ org.apache.karaf.shell.support.completers
+Karaf-Commands: org.apache.tamaya.karaf.shell
\ No newline at end of file