Repository: incubator-tamaya-sandbox Updated Branches: refs/heads/java8 54ff0e6f0 -> 99ce49ed3
TAMAYA-297: Added OSGI Config trigger for Tamaya changes. 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/78554829 Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/tree/78554829 Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/diff/78554829 Branch: refs/heads/java8 Commit: 7855482984c81a11ecf40f2ee63a7c82c603e0c0 Parents: 54ff0e6 Author: anatole <anat...@apache.org> Authored: Tue Sep 19 21:00:32 2017 +0200 Committer: anatole <anat...@apache.org> Committed: Tue Sep 19 21:00:32 2017 +0200 ---------------------------------------------------------------------- osgi/common/bnd.bnd | 2 +- .../org/apache/tamaya/osgi/ConfigChanger.java | 20 ++- .../org/apache/tamaya/osgi/ConfigHistory.java | 39 ++++- .../org/apache/tamaya/osgi/InitialState.java | 89 ++++++++++++ .../apache/tamaya/osgi/TamayaConfigPlugin.java | 29 +++- osgi/updater/bnd.bnd | 34 +++++ osgi/updater/pom.xml | 145 +++++++++++++++++++ .../apache/tamaya/osgi/updater/Activator.java | 59 ++++++++ .../tamaya/osgi/updater/EventListener.java | 79 ++++++++++ 9 files changed, 481 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/78554829/osgi/common/bnd.bnd ---------------------------------------------------------------------- diff --git a/osgi/common/bnd.bnd b/osgi/common/bnd.bnd index 22c802c..51175cb 100644 --- a/osgi/common/bnd.bnd +++ b/osgi/common/bnd.bnd @@ -19,7 +19,7 @@ Bundle-License: Apache Licence version 2 Bundle-Vendor: Apache Software Foundation Bundle-ContactAddress: dev-tam...@incubator.apache.org Bundle-DocURL: http://tamaya.apache.org -Bundle-Activator: org.apache.tamaya.osgi.Activator +Bundle-Activator: org.apache.tamaya.osgi.updater.Activator Export-Package: \ org.apache.tamaya.osgi Import-Package: \ http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/78554829/osgi/common/src/main/java/org/apache/tamaya/osgi/ConfigChanger.java ---------------------------------------------------------------------- diff --git a/osgi/common/src/main/java/org/apache/tamaya/osgi/ConfigChanger.java b/osgi/common/src/main/java/org/apache/tamaya/osgi/ConfigChanger.java index 29c4720..1d48fad 100644 --- a/osgi/common/src/main/java/org/apache/tamaya/osgi/ConfigChanger.java +++ b/osgi/common/src/main/java/org/apache/tamaya/osgi/ConfigChanger.java @@ -55,12 +55,18 @@ final class ConfigChanger { public void configure(String pid, Bundle bundle, OperationMode defaultOpMode) { OperationMode opMode = Objects.requireNonNull(defaultOpMode); - String opVal = bundle.getHeaders().get("Tamaya-OperationMode"); - if(opVal!=null){ - opMode = OperationMode.valueOf(opVal.toUpperCase()); + if(bundle!=null) { + String opVal = bundle.getHeaders().get("Tamaya-OperationMode"); + if (opVal != null) { + opMode = OperationMode.valueOf(opVal.toUpperCase()); + } } LOG.finest("Evaluating Tamaya Config for PID: " + pid); - ConfigHistory.configuring(pid, "operationMode="+opMode); + if(bundle!=null) { + ConfigHistory.configuring(pid, "bundle=" + bundle.getSymbolicName() + ", bundle-id=" + bundle.getBundleId() + ", operationMode=" + opMode); + }else{ + ConfigHistory.configuring(pid, "trigger=Tamaya, operationMode=" + opMode); + } org.apache.tamaya.Configuration tamayaConfig = configMapper().getConfiguration(pid); if (tamayaConfig == null) { LOG.finest("No Tamaya configuration for PID: " + pid); @@ -68,11 +74,15 @@ final class ConfigChanger { } try { // TODO Check for Bundle.getLocation() usage here... - Configuration osgiConfig = cm.getConfiguration(pid, bundle.getLocation()); + Configuration osgiConfig = cm.getConfiguration(pid, bundle!=null?bundle.getLocation():null); if(osgiConfig!=null){ Dictionary<String, Object> dictionary = osgiConfig.getProperties(); if(dictionary==null){ dictionary = new Hashtable<>(); + }else{ + if(!InitialState.contains(pid)){ + InitialState.set(pid, dictionary); + } } modifyConfiguration(pid, tamayaConfig, dictionary, opMode); if(!dictionary.isEmpty()) { http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/78554829/osgi/common/src/main/java/org/apache/tamaya/osgi/ConfigHistory.java ---------------------------------------------------------------------- diff --git a/osgi/common/src/main/java/org/apache/tamaya/osgi/ConfigHistory.java b/osgi/common/src/main/java/org/apache/tamaya/osgi/ConfigHistory.java index 8fdd70a..42ecca6 100644 --- a/osgi/common/src/main/java/org/apache/tamaya/osgi/ConfigHistory.java +++ b/osgi/common/src/main/java/org/apache/tamaya/osgi/ConfigHistory.java @@ -18,10 +18,12 @@ */ package org.apache.tamaya.osgi; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Objects; +import java.beans.XMLDecoder; +import java.beans.XMLEncoder; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.*; /** * Class storing the history of changers done to the OSGI configuration by Tamaya. @@ -88,6 +90,14 @@ public final class ConfigHistory { return h; } + public static void setMaxHistory(int maxHistory){ + ConfigHistory.maxHistory = maxHistory; + } + + public static int getMaxHistory(){ + return maxHistory; + } + public static List<ConfigHistory> history(){ return history(null); } @@ -156,6 +166,27 @@ public final class ConfigHistory { return this; } + public static void save(TamayaConfigPlugin plugin){ + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + XMLEncoder encoder = new XMLEncoder(bos, "UTF-8", false, 4); + encoder.writeObject(history); + try { + bos.flush(); + plugin.setConfigValue("history", new String(bos.toByteArray())); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void restore(TamayaConfigPlugin plugin){ + String serialized = (String)plugin.getConfigValue("history"); + if(serialized!=null) { + ByteArrayInputStream bis = new ByteArrayInputStream(serialized.getBytes()); + XMLDecoder encoder = new XMLDecoder(bis); + ConfigHistory.history = (List<ConfigHistory>) encoder.readObject(); + } + } + @Override public String toString() { return "ConfigHistory{" + http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/78554829/osgi/common/src/main/java/org/apache/tamaya/osgi/InitialState.java ---------------------------------------------------------------------- diff --git a/osgi/common/src/main/java/org/apache/tamaya/osgi/InitialState.java b/osgi/common/src/main/java/org/apache/tamaya/osgi/InitialState.java new file mode 100644 index 0000000..faf50e5 --- /dev/null +++ b/osgi/common/src/main/java/org/apache/tamaya/osgi/InitialState.java @@ -0,0 +1,89 @@ +/* + * 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; + +import java.beans.XMLDecoder; +import java.beans.XMLEncoder; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Dictionary; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Created by atsticks on 19.09.17. + */ +public final class InitialState { + + private static Map<String, Dictionary<String,?>> initialConfigState = new ConcurrentHashMap<>(); + + private InitialState(){} + + public static void set(String pid, Dictionary<String,?> config){ + initialConfigState.put(pid, config); + } + + public static Dictionary<String,?> remove(String pid){ + return initialConfigState.remove(pid); + } + + public static void removeAll(){ + initialConfigState.clear(); + } + + public static Dictionary<String,?> get(String pid){ + return initialConfigState.get(pid); + } + + public static Map<String,Dictionary<String,?>> get(){ + return new HashMap<>(initialConfigState); + } + + public static Set<String> getPids(){ + return initialConfigState.keySet(); + } + + public static boolean contains(String pid){ + return initialConfigState.containsKey(pid); + } + + public static void save(TamayaConfigPlugin plugin){ + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + XMLEncoder encoder = new XMLEncoder(bos, "UTF-8", false, 4); + encoder.writeObject(initialConfigState); + try { + bos.flush(); + plugin.setConfigValue("backup", new String(bos.toByteArray())); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void restore(TamayaConfigPlugin plugin){ + String serialized = (String)plugin.getConfigValue("history"); + if(serialized!=null) { + ByteArrayInputStream bis = new ByteArrayInputStream(serialized.getBytes()); + XMLDecoder encoder = new XMLDecoder(bis); + InitialState.initialConfigState = (Map<String, Dictionary<String,?>>) encoder.readObject(); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/78554829/osgi/common/src/main/java/org/apache/tamaya/osgi/TamayaConfigPlugin.java ---------------------------------------------------------------------- diff --git a/osgi/common/src/main/java/org/apache/tamaya/osgi/TamayaConfigPlugin.java b/osgi/common/src/main/java/org/apache/tamaya/osgi/TamayaConfigPlugin.java index 1b844f0..ad964b1 100644 --- a/osgi/common/src/main/java/org/apache/tamaya/osgi/TamayaConfigPlugin.java +++ b/osgi/common/src/main/java/org/apache/tamaya/osgi/TamayaConfigPlugin.java @@ -23,7 +23,9 @@ import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; import java.io.IOException; -import java.util.*; +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; @@ -36,6 +38,9 @@ public class TamayaConfigPlugin implements BundleListener, ServiceListener{ /** the logger. */ private static final Logger LOG = Logger.getLogger(TamayaConfigPlugin.class.getName()); private static final String TAMAYA_DISABLED = "tamaya.disabled"; + public static final String TAMAYA_DISABLED_KEY = "Tamaya-Disabled"; + public static final String TAMAYA_ENABLED_KEY = "Tamaya-Enabled"; + public static final String TAMAYA_PID_KEY = "Tamaya-PID"; private boolean disabled = false; private OperationMode defaultOpMode = OperationMode.OVERRIDE; @@ -61,6 +66,8 @@ public class TamayaConfigPlugin implements BundleListener, ServiceListener{ */ TamayaConfigPlugin(BundleContext context) { configChanger = new ConfigChanger(context); + InitialState.restore(this); + ConfigHistory.restore(this); initDefaultEnabled(); initDefaultOpMode(); initConfigs(); @@ -113,19 +120,28 @@ public class TamayaConfigPlugin implements BundleListener, ServiceListener{ if(!isBundleEnabled(bundle)){ return; } - String pid = (String)event.getServiceReference().getProperty("service.pid"); + String pid = (String)event.getServiceReference().getProperty(Constants.SERVICE_PID); if(pid==null){ LOG.finest("No service pid for: " + event.getServiceReference()); return; } configChanger.configure(pid, event.getServiceReference().getBundle(), defaultOpMode); + InitialState.save(this); + ConfigHistory.save(this); + } + + public void updateConfig(String pid) { + LOG.fine("Updating config for pid...: " + pid); + configChanger.configure(pid, null, defaultOpMode); + InitialState.save(this); + ConfigHistory.save(this); } private void configureBundle(Bundle bundle) { if(!isBundleEnabled(bundle)){ return; } - String tamayaPid = bundle.getHeaders().get("Tamaya-PID"); + String tamayaPid = bundle.getHeaders().get(TAMAYA_PID_KEY); String pid = tamayaPid!=null?tamayaPid:bundle.getSymbolicName(); if(pid==null){ pid = bundle.getLocation(); @@ -135,13 +151,15 @@ public class TamayaConfigPlugin implements BundleListener, ServiceListener{ return; } configChanger.configure(pid, bundle, defaultOpMode); + InitialState.save(this); + ConfigHistory.save(this); } public boolean isBundleEnabled(Bundle bundle){ // Optional MANIFEST entries - String enabledTamaya = bundle.getHeaders().get("Tamaya-Enabled"); - String disabledTamaya = bundle.getHeaders().get("Tamaya-Disabled"); + String enabledTamaya = bundle.getHeaders().get(TAMAYA_ENABLED_KEY); + String disabledTamaya = bundle.getHeaders().get(TAMAYA_DISABLED_KEY); if(Boolean.parseBoolean(disabledTamaya)){ LOG.finest("Bundle is disabled for Tamaya: " + bundle.getSymbolicName()); @@ -226,4 +244,5 @@ public class TamayaConfigPlugin implements BundleListener, ServiceListener{ return null; } + } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/78554829/osgi/updater/bnd.bnd ---------------------------------------------------------------------- diff --git a/osgi/updater/bnd.bnd b/osgi/updater/bnd.bnd new file mode 100644 index 0000000..ef7d52d --- /dev/null +++ b/osgi/updater/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-Version: ${version}.${tstamp} +Bundle-Name: Apache Tamaya - OSGI Updater +Bundle-SymbolicName: org.apache.tamaya.osgi.updater +Bundle-Description: Apacha Tamaya Configuration - OSGI Updater +Bundle-Category: Implementation +Bundle-Copyright: (C) Apache Foundation +Bundle-License: Apache Licence version 2 +Bundle-Vendor: Apache Software Foundation +Bundle-ContactAddress: dev-tam...@incubator.apache.org +Bundle-DocURL: http://tamaya.apache.org +Bundle-Activator: org.apache.tamaya.osgi.updater.Activator +Export-Package: \ + org.apache.tamaya.osgi.updater +Import-Package: \ + org.apache.tamaya.osgi,\ + 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.events + http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/78554829/osgi/updater/pom.xml ---------------------------------------------------------------------- diff --git a/osgi/updater/pom.xml b/osgi/updater/pom.xml new file mode 100644 index 0000000..a1df83b --- /dev/null +++ b/osgi/updater/pom.xml @@ -0,0 +1,145 @@ +<?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-updater_alpha</artifactId> + <packaging>jar</packaging> + <name>Apache Tamaya :: OSGi :: Updater</name> + <description>Tamaya Based OSGI Updater to propagate Tamaya changes to OSGI.</description> + + <dependencies> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.compendium</artifactId> + <scope>provided</scope> + </dependency> + <!--<dependency>--> + <!--<groupId>org.osgi</groupId>--> + <!--<artifactId>org.osgi.util.tracker</artifactId>--> + <!--<scope>provided</scope>--> + <!--</dependency>--> + + <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-atinject_1.0_spec</artifactId> + </dependency> + <dependency> + <groupId>org.apache.tamaya</groupId> + <artifactId>tamaya-api</artifactId> + <version>${project.parent.version}</version> + </dependency> + <dependency> + <groupId>org.apache.tamaya</groupId> + <artifactId>tamaya-core</artifactId> + <version>${project.parent.version}</version> + </dependency> + <dependency> + <groupId>org.apache.tamaya.ext</groupId> + <artifactId>tamaya-functions</artifactId> + <version>${project.parent.version}</version> + </dependency> + <dependency> + <groupId>org.apache.tamaya.ext</groupId> + <artifactId>tamaya-spisupport</artifactId> + <version>${project.parent.version}</version> + </dependency> + <dependency> + <groupId>org.apache.tamaya.ext</groupId> + <artifactId>tamaya-events</artifactId> + <version>${project.parent.version}</version> + </dependency> + <dependency> + <groupId>org.apache.tamaya.ext</groupId> + <artifactId>tamaya-osgi_alpha</artifactId> + <version>${project.parent.version}</version> + </dependency> + + <!-- Testing --> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>java-hamcrest</artifactId> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + </dependency> + + <!-- OSGI Testbed --> + <dependency> + <groupId>org.ops4j.pax.exam</groupId> + <artifactId>pax-exam-container-forked</artifactId> + </dependency> + <dependency> + <groupId>org.ops4j.pax.exam</groupId> + <artifactId>pax-exam-junit4</artifactId> + </dependency> + <dependency> + <groupId>org.ops4j.pax.exam</groupId> + <artifactId>pax-exam-link-mvn</artifactId> + </dependency> + <dependency> + <groupId>org.ops4j.pax.url</groupId> + <artifactId>pax-url-aether</artifactId> + </dependency> + <dependency> + <groupId>org.apache.felix</groupId> + <artifactId>org.apache.felix.framework</artifactId> + </dependency> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-core</artifactId> + </dependency> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + </dependency> + <dependency> + <groupId>org.ops4j.pax.exam</groupId> + <artifactId>pax-exam</artifactId> + </dependency> + <dependency> + <groupId>org.ops4j.pax.exam</groupId> + <artifactId>pax-exam-junit4</artifactId> + </dependency> + <dependency> + <groupId>org.ops4j.pax.url</groupId> + <artifactId>pax-url-wrap</artifactId> + </dependency> + <dependency> + <groupId>org.ops4j.pax.url</groupId> + <artifactId>pax-url-reference</artifactId> + </dependency> + + </dependencies> + +</project> http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/78554829/osgi/updater/src/main/java/org/apache/tamaya/osgi/updater/Activator.java ---------------------------------------------------------------------- diff --git a/osgi/updater/src/main/java/org/apache/tamaya/osgi/updater/Activator.java b/osgi/updater/src/main/java/org/apache/tamaya/osgi/updater/Activator.java new file mode 100644 index 0000000..55bbd6d --- /dev/null +++ b/osgi/updater/src/main/java/org/apache/tamaya/osgi/updater/Activator.java @@ -0,0 +1,59 @@ +/* + * 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.updater; + +import org.apache.tamaya.events.ConfigEventManager; +import org.apache.tamaya.events.ConfigurationChange; +import org.osgi.framework.*; +import org.osgi.service.cm.ConfigurationAdmin; + +import java.util.logging.Logger; + +/** + * Activator that registers the Tamaya based Service Class for {@link ConfigurationAdmin}, + * using a default service priority of {@code 0}. This behaviour is configurable based on OSGI properties: + * <ul> + * <li><p><b>org.tamaya.integration.osgi.cm.ranking, type: int</b> allows to configure the OSGI service ranking for + * Tamaya based ConfigurationAdmin instance. The default ranking used is 10.</p></li> + * <li><p><b>org.tamaya.integration.osgi.cm.override, type: boolean</b> allows to configure if Tamaya should + * register its ConfigAdmin service. Default is true.</p></li> + * </ul> + */ +public class Activator implements BundleActivator { + + private static final Logger LOG = Logger.getLogger(Activator.class.getName()); + + private EventListener listener; + + @Override + public void start(BundleContext context) throws Exception { + listener = new EventListener(context); + ConfigEventManager.addListener(listener, ConfigurationChange.class); + LOG.info("Registered Tamaya config trigger for OSGI."); + } + + @Override + public void stop(BundleContext context) throws Exception { + if (listener != null) { + ConfigEventManager.removeListener(this.listener, ConfigurationChange.class); + LOG.info("Unregistered Tamaya config trigger for OSGI."); + } + } + +} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/78554829/osgi/updater/src/main/java/org/apache/tamaya/osgi/updater/EventListener.java ---------------------------------------------------------------------- diff --git a/osgi/updater/src/main/java/org/apache/tamaya/osgi/updater/EventListener.java b/osgi/updater/src/main/java/org/apache/tamaya/osgi/updater/EventListener.java new file mode 100644 index 0000000..f2e0e95 --- /dev/null +++ b/osgi/updater/src/main/java/org/apache/tamaya/osgi/updater/EventListener.java @@ -0,0 +1,79 @@ +/* + * 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.updater; + +import org.apache.tamaya.events.ConfigEvent; +import org.apache.tamaya.events.ConfigEventListener; +import org.apache.tamaya.events.ConfigurationChange; +import org.apache.tamaya.osgi.OperationMode; +import org.apache.tamaya.osgi.TamayaConfigPlugin; +import org.osgi.framework.*; +import org.osgi.service.cm.ConfigurationAdmin; + +import java.beans.PropertyChangeEvent; +import java.util.*; +import java.util.logging.Logger; + +/** + * Tamaya plugin that updates/extends the component configurations managed + * by {@link ConfigurationAdmin}, based on the configured {@link OperationMode}. + */ +final class EventListener implements ConfigEventListener{ + private static final Logger LOG = Logger.getLogger(EventListener.class.getName()); + private BundleContext context; + + public EventListener(BundleContext context){ + this.context = context; + } + + + @Override + public void onConfigEvent(ConfigEvent<?> event) { + LOG.finest("Tamya Config change triggered: " + event); + Set<String> changedPids = new HashSet<>(); + ConfigurationChange cc = (ConfigurationChange)event; + for(PropertyChangeEvent evt: cc.getChanges()){ + String key = evt.getPropertyName(); + String pid = getPid(key); + if(pid!=null){ + changedPids.add(pid); + } + } + if(changedPids.isEmpty()){ + LOG.finest("Tamya Config change not targeting OSGI."); + return; + } + LOG.finest("Tamya Config change for pids: " + changedPids); + // Reload the given pids + ServiceReference<TamayaConfigPlugin> pluginRef = context.getServiceReference(TamayaConfigPlugin.class); + TamayaConfigPlugin tamayaPlugin = context.getService(pluginRef); + for(String pid:changedPids) { + tamayaPlugin.updateConfig(pid); + } + } + + private String getPid(String key) { + int index0 = key.indexOf("["); + int index1 = key.indexOf("]"); + if(index0 >=0 && (index1 - index0) > 0){ + return key.substring(index0+1,index1); + } + return null; + } +}