You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2016/08/10 22:28:04 UTC

svn commit: r1755887 - /felix/trunk/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5305_DirectInjectionShouldSeeServiceUpdates.java

Author: pderop
Date: Wed Aug 10 22:28:04 2016
New Revision: 1755887

URL: http://svn.apache.org/viewvc?rev=1755887&view=rev
Log:
FELIX-5305: Added testcase, based on the sample code provided by Jan Willem (thanks !).

Added:
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5305_DirectInjectionShouldSeeServiceUpdates.java

Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5305_DirectInjectionShouldSeeServiceUpdates.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5305_DirectInjectionShouldSeeServiceUpdates.java?rev=1755887&view=auto
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5305_DirectInjectionShouldSeeServiceUpdates.java (added)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5305_DirectInjectionShouldSeeServiceUpdates.java Wed Aug 10 22:28:04 2016
@@ -0,0 +1,175 @@
+/*
+ * 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.felix.dm.itest.api;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.itest.util.Ensure;
+import org.apache.felix.dm.itest.util.TestBase;
+import org.junit.Assert;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+public class FELIX5305_DirectInjectionShouldSeeServiceUpdates extends TestBase {
+
+    final static String PID = "my.service.pid";
+    final static Ensure m_ensure = new Ensure();
+
+    public void testFieldInjectionWithFactoryConfigServices() throws InterruptedException {
+        DependencyManager m = getDM();
+
+        ConfigurationCreator configurator = new ConfigurationCreator(PID);
+        Component compConfigurator = m.createComponent()
+            .setImplementation(configurator)
+            .add(m.createServiceDependency().setService(ConfigurationAdmin.class).setRequired(true));
+        m.add(compConfigurator);
+
+        m_ensure.waitForStep(1, 3000);        
+        
+        MyServices myServices = new MyServices();
+        m.add(m.createComponent()
+            .setImplementation(myServices)
+            .setInterface(MyServices.class.getName(), null)
+            .add(m.createServiceDependency().setService(Service.class, "(provider=*)").setRequired(true)));
+
+        m.add(m.createFactoryConfigurationAdapterService(PID, "update", false /* propagate */)
+            .setInterface(Service.class.getName(), null)
+            .setImplementation(ServiceImpl.class));
+
+        configurator.update("provider", "message1");          
+        Thread.sleep(500);
+        Assert.assertEquals("message1", myServices.getMessages().get("provider"));
+        
+        configurator.update("provider", "message2");          
+        Thread.sleep(500);
+        Assert.assertEquals("message2", myServices.getMessages().get("provider"));
+    }
+
+    public interface Service {
+        String getMessage();
+    }
+
+    public static class ServiceImpl implements Service {
+        // Managed by Felix DM...
+        private volatile Component m_comp;
+        // Locally managed...
+        private volatile String m_msg;
+
+        @Override
+        public String getMessage() {
+            return m_msg;
+        }
+
+        /**
+         * Called by Felix DM.
+         */
+        protected final void start(Component comp) throws Exception {
+            System.out.printf("ServiceImpl@%d started (msg = %s)%n", hashCode(), m_msg);
+        }
+
+        /**
+         * Called by Felix DM.
+         */
+        protected final void stop(Component comp) throws Exception {
+            System.out.printf("ServiceImpl@%d stopped (msg = %s)%n", hashCode(), m_msg);
+        }
+
+        /**
+         * Called by Felix DM.
+         */
+        protected final void update(Dictionary<String, ?> config) throws Exception {
+            String provider;
+            if (config != null) {
+                m_msg = (String) config.get("msg");
+                provider = (String) config.get("provider");
+            } else {
+                m_msg = "<none set>";
+                provider = "<unknown>";
+            }
+
+            System.out.printf("ServiceImpl@%d config updated (msg = %s; provider = %s)%n", hashCode(), m_msg, provider);
+            
+            Dictionary<Object, Object> props = m_comp.getServiceProperties();
+            if (props == null) {
+                props = new Hashtable<>();
+            }
+
+            props.put("provider", provider);
+            m_comp.setServiceProperties(props);
+        }
+    }
+
+    public static class MyServices {
+        // Injected by Felix DM...
+        private volatile Map<Service, Dictionary<String, ?>> m_services;
+
+        public Map<String, String> getMessages() {
+            Map<Service, Dictionary<String, ?>> services = m_services;
+
+            Map<String, String> result = new HashMap<>(services.size());
+            for (Service srv : services.keySet()) {
+                String provider = (String) services.get(srv).get("provider");
+                result.put(provider, srv.getMessage());
+            }
+            return result;
+        }        
+    }
+
+    public static class ConfigurationCreator {
+        private volatile ConfigurationAdmin m_ca;
+        private org.osgi.service.cm.Configuration m_conf;
+        private String m_factoryPid;
+
+        public ConfigurationCreator(String factoryPid) {
+            m_factoryPid = factoryPid;
+        }
+
+        public void start() {
+            m_ensure.step(1);
+        }
+
+        public void update(String provider, String msg) {
+            try {
+                if (m_conf == null) {
+                    m_conf = m_ca.createFactoryConfiguration(m_factoryPid, null);
+                }
+                Hashtable<String, String> props = new Hashtable<>();
+                props.put("msg", msg);
+                props.put("provider", provider);
+                m_conf.update(props);
+            } catch (IOException e) {
+                Assert.fail("Could not update configuration: " + e.getMessage());
+            }
+        }
+
+        public void stop() {
+            try {
+                System.out.println("Destroying conf");
+                m_conf.delete();
+            } catch (IOException e) {
+                Assert.fail("Could not remove configuration: " + e.toString());
+            }
+        }
+    }
+}