Implement mappings from ConfigurationEvents (FELIX-86)
git-svn-id: https://svn.apache.org/repos/asf/incubator/felix/trunk@416925 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/org.apache.felix.eventadmin.bridge.configuration/pom.xml b/org.apache.felix.eventadmin.bridge.configuration/pom.xml
new file mode 100644
index 0000000..98ffc0b
--- /dev/null
+++ b/org.apache.felix.eventadmin.bridge.configuration/pom.xml
@@ -0,0 +1,46 @@
+<project>
+ <parent>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>felix</artifactId>
+ <version>0.8.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>osgi-bundle</packaging>
+ <name>Apache Felix EventAdmin Bridge Configuration</name>
+ <artifactId>org.apache.felix.eventadmin.bridge.configuration</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>${pom.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <version>${pom.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix.plugins</groupId>
+ <artifactId>maven-osgi-plugin</artifactId>
+ <version>${pom.version}</version>
+ <extensions>true</extensions>
+ <configuration>
+ <osgiManifest>
+ <bundleName>EventAdmin Bridge Configuration</bundleName>
+ <bundleVendor>Apache Software Foundation</bundleVendor>
+ <bundleDescription>
+ This bundle provides a bridge between Configuration and EventAdmin events.
+ </bundleDescription>
+ <bundleActivator>auto-detect</bundleActivator>
+ <bundleSymbolicName>${pom.artifactId}</bundleSymbolicName>
+ </osgiManifest>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/org.apache.felix.eventadmin.bridge.configuration/src/main/java/org/apache/felix/eventadmin/bridge/configuration/Activator.java b/org.apache.felix.eventadmin.bridge.configuration/src/main/java/org/apache/felix/eventadmin/bridge/configuration/Activator.java
new file mode 100644
index 0000000..a0055c9
--- /dev/null
+++ b/org.apache.felix.eventadmin.bridge.configuration/src/main/java/org/apache/felix/eventadmin/bridge/configuration/Activator.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.felix.eventadmin.bridge.configuration;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The BundleActivator that will register an ConfigurationEventListener service
+ * with the framework on start. Subsequently, ConfigurationEvents will be
+ * bridged to available EventAdmin services (as per spec).
+ *
+ * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
+ */
+public class Activator implements BundleActivator
+{
+ /**
+ * This registers an ConfigurationEventListener service with the framework
+ * that bridges ConfigurationEvents to the EventAdmin.
+ *
+ * @param context
+ * The context to use
+ *
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(final BundleContext context) throws Exception
+ {
+ new ConfigurationEventToEventAdminBridge(context);
+ }
+
+ /**
+ * Stop the bridging of ConfigurationEvents to the EventAdmin.
+ *
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(final BundleContext context) throws Exception
+ {
+ // Services are unregistered by the framework
+ }
+}
diff --git a/org.apache.felix.eventadmin.bridge.configuration/src/main/java/org/apache/felix/eventadmin/bridge/configuration/ConfigurationEventToEventAdminBridge.java b/org.apache.felix.eventadmin.bridge.configuration/src/main/java/org/apache/felix/eventadmin/bridge/configuration/ConfigurationEventToEventAdminBridge.java
new file mode 100644
index 0000000..591a170
--- /dev/null
+++ b/org.apache.felix.eventadmin.bridge.configuration/src/main/java/org/apache/felix/eventadmin/bridge/configuration/ConfigurationEventToEventAdminBridge.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.felix.eventadmin.bridge.configuration;
+
+import java.util.Arrays;
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationEvent;
+import org.osgi.service.cm.ConfigurationListener;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+
+/**
+ * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
+ */
+public class ConfigurationEventToEventAdminBridge implements
+ ConfigurationListener
+{
+ private final BundleContext m_context;
+
+ public ConfigurationEventToEventAdminBridge(final BundleContext context)
+ {
+ m_context = context;
+
+ m_context.registerService(ConfigurationListener.class.getName(), this,
+ null);
+ }
+
+ public void configurationEvent(final ConfigurationEvent event)
+ {
+ final ServiceReference ref = m_context
+ .getServiceReference(EventAdmin.class.getName());
+
+ if(null != ref)
+ {
+ final EventAdmin eventAdmin = (EventAdmin) m_context
+ .getService(ref);
+
+ if(null != eventAdmin)
+ {
+ final String topic;
+
+ switch(event.getType())
+ {
+ case ConfigurationEvent.CM_UPDATED:
+ topic = "org/osgi/service/cm/ConfigurationEvent/CM_UPDATED";
+ break;
+ case ConfigurationEvent.CM_DELETED:
+ topic = "org/osgi/service/cm/ConfigurationEvent/CM_DELETED";
+ break;
+ default:
+ m_context.ungetService(ref);
+ return;
+ }
+
+ eventAdmin.postEvent(new Event(topic, new Hashtable()
+ {
+ {
+ if(null != event.getFactoryPid())
+ {
+ put("cm.factoryPid", event.getFactoryPid());
+ }
+
+ put("cm.pid", event.getPid());
+
+ final ServiceReference ref = event.getReference();
+
+ if(null == ref)
+ {
+ throw new IllegalArgumentException(
+ "ConfigurationEvent.getReference() may not be null");
+ }
+
+ put(EventConstants.SERVICE, ref);
+
+ put(EventConstants.SERVICE_ID, ref
+ .getProperty(EventConstants.SERVICE_ID));
+
+ final Object objectClass = ref
+ .getProperty(Constants.OBJECTCLASS);
+
+ if(!(objectClass instanceof String[])
+ || !Arrays.asList((String[]) objectClass).contains(
+ ConfigurationAdmin.class.getName()))
+ {
+ throw new IllegalArgumentException(
+ "Bad objectclass: " + objectClass);
+ }
+
+ put(EventConstants.SERVICE_OBJECTCLASS, objectClass);
+
+ put(EventConstants.SERVICE_PID, ref
+ .getProperty(EventConstants.SERVICE_PID));
+ }
+ }));
+
+ m_context.ungetService(ref);
+ }
+ }
+ }
+}