Convert rsvp bundles to blueprint 74/40274/5
authorTom Pantelis <tpanteli@brocade.com>
Tue, 14 Jun 2016 00:07:53 +0000 (20:07 -0400)
committerTom Pantelis <tpanteli@brocade.com>
Thu, 23 Jun 2016 00:17:55 +0000 (20:17 -0400)
Added blueprint XML file, rsvp-spi.xml, to the spi bundle that Utilizes the
new blueprint extension, "specific-reference-list" (added by
https://git.opendaylight.org/gerrit/#/c/40267/), to obtain the
specific list of RSVPExtensionProviderActivator OSGi service instances. The
specific expected services are announced via
META-INF/services/org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator
resources in the provider bundles which the "specific-reference-list"
extension scan so it knows which services to look for. Once all expected
services are obtained, the RSVPExtensionProviderActivator instance List bean
is created and injected into the SimpleRSVPExtensionProviderContextActivator
bean instance which calls start on each.

The only RSVPExtensionProviderActivator instance wired in 27-rsvp.xml is
the RSVPActivator in rsvp-impl. This instance is now created via the
blueprint XML, rsvp-impl.xml, and the config yang and associated Module class
was removed. rsvp-impl also now correctly provides its
META-INF/services/org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator
resource.

The SimpleRSVPExtensionProviderContextModule was deprecated but still
remains for now to provide the RSVPExtensionProviderContext instance
created via blueprint to the config system so it can be injected into
other users. Once the other user(s) are converted to blueprint then the
config yang, Module classes, and 27-rsvp.xml can be removed.

Change-Id: I5f031322e8a7d947c1ad7e74963cf9f986b992b1
Signed-off-by: Tom Pantelis <tpanteli@brocade.com>
15 files changed:
bgp/linkstate/src/test/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModuleTest.java
rsvp/controller-config/src/main/resources/initial/27-rsvp.xml
rsvp/impl/pom.xml
rsvp/impl/src/main/java/org/opendaylight/controller/config/yang/rsvp/impl/RSVPParserModule.java [deleted file]
rsvp/impl/src/main/java/org/opendaylight/controller/config/yang/rsvp/impl/RSVPParserModuleFactory.java [deleted file]
rsvp/impl/src/main/resources/META-INF/services/org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator [moved from rsvp/impl/src/main/resources/META-INF.services/org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator with 100% similarity]
rsvp/impl/src/main/resources/org/opendaylight/blueprint/rsvp-impl.xml [new file with mode: 0644]
rsvp/impl/src/main/yang/odl-rsvp-parser-impl-cfg.yang [deleted file]
rsvp/impl/src/test/java/org/opendaylight/controller/config/yang/rsvp/parser/impl/RSVPParserModuleTest.java [deleted file]
rsvp/spi/src/main/java/org/opendaylight/controller/config/yang/rsvp/spi/SimpleRSVPExtensionProviderContextModule.java
rsvp/spi/src/main/java/org/opendaylight/controller/config/yang/rsvp/spi/SimpleRSVPExtensionProviderContextModuleFactory.java
rsvp/spi/src/main/java/org/opendaylight/protocol/rsvp/parser/spi/pojo/SimpleRSVPExtensionProviderContextActivator.java [new file with mode: 0644]
rsvp/spi/src/main/resources/org/opendaylight/blueprint/rsvp-spi.xml [new file with mode: 0644]
rsvp/spi/src/main/yang/odl-rsvp-parser-spi-cfg.yang
rsvp/spi/src/test/java/org/opendaylight/controller/config/yang/rsvp/spi/SimpleRSVPExtensionProviderContextModuleTest.java [deleted file]

index 5bed487b1025b2928b6f17da57ea4f7c7de72dff..8274108e549c651b8430a051299e1f28645a6719 100644 (file)
@@ -9,12 +9,21 @@
 package org.opendaylight.controller.config.yang.bgp.linkstate;
 
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.contains;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
 import javax.management.InstanceAlreadyExistsException;
 import javax.management.ObjectName;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 import org.opendaylight.controller.config.api.jmx.CommitStatus;
 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
@@ -25,6 +34,11 @@ import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModu
 import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleTest;
 import org.opendaylight.controller.config.yang.rsvp.spi.SimpleRSVPExtensionProviderContextModuleFactory;
 import org.opendaylight.controller.config.yang.rsvp.spi.SimpleRSVPExtensionProviderContextModuleMXBean;
+import org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderContext;
+import org.opendaylight.protocol.rsvp.parser.spi.pojo.SimpleRSVPExtensionProviderContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
 
 public class LinkstateModuleTest extends AbstractConfigTest {
 
@@ -34,10 +48,34 @@ public class LinkstateModuleTest extends AbstractConfigTest {
     private ObjectName rspvInstance;
 
     @Before
-    public void setUp() {
+    public void setUp() throws Exception {
         super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, new
             LinkstateModuleFactory(), new SimpleBGPExtensionProviderContextModuleFactory(), new
             RIBExtensionsImplModuleFactory(), new SimpleRSVPExtensionProviderContextModuleFactory()));
+
+        doAnswer(new Answer<Filter>() {
+            @Override
+            public Filter answer(final InvocationOnMock invocation) {
+                final String str = invocation.getArgumentAt(0, String.class);
+                final Filter mockFilter = mock(Filter.class);
+                doReturn(str).when(mockFilter).toString();
+                return mockFilter;
+            }
+        }).when(mockedContext).createFilter(anyString());
+
+        Mockito.doNothing().when(this.mockedContext).addServiceListener(any(ServiceListener.class), Mockito.anyString());
+        Mockito.doNothing().when(this.mockedContext).removeServiceListener(any(ServiceListener.class));
+
+        setupMockService(RSVPExtensionProviderContext.class, new SimpleRSVPExtensionProviderContext());
+    }
+
+    private void setupMockService(final Class<?> serviceInterface, final Object instance) throws Exception {
+        final ServiceReference<?> mockServiceRef = mock(ServiceReference.class);
+        doReturn(new ServiceReference[]{mockServiceRef}).when(mockedContext).
+                getServiceReferences(anyString(), contains(serviceInterface.getName()));
+        doReturn(new ServiceReference[]{mockServiceRef}).when(mockedContext).
+                getServiceReferences(serviceInterface.getName(), null);
+        doReturn(instance).when(mockedContext).getService(mockServiceRef);
     }
 
     @Test
index abbaf311c04a68cb7f6d17a0e80dc5129f7537ef..51b80f362085814187d77071c023445ae73e61b4 100644 (file)
@@ -10,7 +10,6 @@
 <snapshot>
     <required-capabilities>
         <capability>urn:opendaylight:params:xml:ns:yang:controller:rsvp:spi?module=odl-rsvp-parser-spi-cfg&amp;revision=2015-08-26</capability>
-        <capability>urn:opendaylight:params:xml:ns:yang:controller:rsvp:impl?module=odl-rsvp-parser-impl-cfg&amp;revision=2015-08-26</capability>
     </required-capabilities>
     <configuration>
         <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
                 <module>
                     <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:rsvp:spi">prefix:rsvp-extensions-impl</type>
                     <name>global-rsvp-extensions</name>
-                    <rsvp-extension>
-                        <type xmlns:rsvp-spi="urn:opendaylight:params:xml:ns:yang:controller:rsvp:spi">rsvp-spi:rsvp-extension</type>
-                        <name>rsvp-parser</name>
-                    </rsvp-extension>
-                </module>
-                <module>
-                    <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:rsvp:impl">prefix:rsvp-parser</type>
-                    <name>rsvp-parser</name>
                 </module>
             </modules>
             <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
                         <provider>/modules/module[type='rsvp-extensions-impl'][name='global-rsvp-extensions']</provider>
                     </instance>
                 </service>
-                <service>
-                    <type xmlns:rsvp-spi="urn:opendaylight:params:xml:ns:yang:controller:rsvp:spi">rsvp-spi:rsvp-extension</type>
-                    <instance>
-                        <name>rsvp-parser</name>
-                        <provider>/modules/module[type='rsvp-parser'][name='rsvp-parser']</provider>
-                    </instance>
-                </service>
             </services>
         </data>
     </configuration>
index 5f2f66e9c691ba3dd5b8d2b56da4df3a5d690171..b560fe6e40842198255d084963526058e71cfb9c 100644 (file)
 
     <build>
         <plugins>
-            <plugin>
-                <groupId>org.opendaylight.yangtools</groupId>
-                <artifactId>yang-maven-plugin</artifactId>
-            </plugin>
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
diff --git a/rsvp/impl/src/main/java/org/opendaylight/controller/config/yang/rsvp/impl/RSVPParserModule.java b/rsvp/impl/src/main/java/org/opendaylight/controller/config/yang/rsvp/impl/RSVPParserModule.java
deleted file mode 100644 (file)
index 84ef510..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.controller.config.yang.rsvp.impl;
-
-import org.opendaylight.protocol.rsvp.parser.impl.RSVPActivator;
-
-public class RSVPParserModule extends org.opendaylight.controller.config.yang.rsvp.impl.AbstractRSVPParserModule {
-    public RSVPParserModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
-        super(identifier, dependencyResolver);
-    }
-
-    public RSVPParserModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.controller.config.yang.rsvp.impl.RSVPParserModule oldModule, java.lang.AutoCloseable oldInstance) {
-        super(identifier, dependencyResolver, oldModule, oldInstance);
-    }
-
-    @Override
-    public void customValidation() {
-        // add custom validation form module attributes here.
-    }
-
-    @Override
-    public java.lang.AutoCloseable createInstance() {
-        return new RSVPActivator();
-    }
-
-}
diff --git a/rsvp/impl/src/main/java/org/opendaylight/controller/config/yang/rsvp/impl/RSVPParserModuleFactory.java b/rsvp/impl/src/main/java/org/opendaylight/controller/config/yang/rsvp/impl/RSVPParserModuleFactory.java
deleted file mode 100644 (file)
index 4f1419c..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.controller.config.yang.rsvp.impl;
-public class RSVPParserModuleFactory extends org.opendaylight.controller.config.yang.rsvp.impl.AbstractRSVPParserModuleFactory {
-
-}
diff --git a/rsvp/impl/src/main/resources/org/opendaylight/blueprint/rsvp-impl.xml b/rsvp/impl/src/main/resources/org/opendaylight/blueprint/rsvp-impl.xml
new file mode 100644 (file)
index 0000000..16e1684
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
+
+  <bean id="RSVPActivator" class="org.opendaylight.protocol.rsvp.parser.impl.RSVPActivator"/>
+
+  <service ref="RSVPActivator" interface="org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator"
+          odl:type="org.opendaylight.protocol.rsvp.parser.impl.RSVPActivator"/>
+</blueprint>
\ No newline at end of file
diff --git a/rsvp/impl/src/main/yang/odl-rsvp-parser-impl-cfg.yang b/rsvp/impl/src/main/yang/odl-rsvp-parser-impl-cfg.yang
deleted file mode 100644 (file)
index 77e97eb..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-// vi: set smarttab et sw=4 tabstop=4:
-module odl-rsvp-parser-impl-cfg {
-    yang-version 1;
-    namespace "urn:opendaylight:params:xml:ns:yang:controller:rsvp:impl";
-    prefix "rsvp-impl";
-
-    import config { prefix config; revision-date 2013-04-05; }
-    import odl-rsvp-parser-spi-cfg { prefix spi; revision-date 2015-08-26; }
-
-    organization "Cisco Systems, Inc.";
-
-    contact "Claudio D. Gasparini <cgaspari@cisco.com>";
-
-    description
-        "This module contains the base YANG definitions for
-         RSPV listener service.
-
-        Copyright (c)2015 Cisco Systems, Inc. All rights reserved.;
-
-        This program and the accompanying materials are made available
-        under the terms of the Eclipse Public License v1.0 which
-        accompanies this distribution, and is available at
-        http://www.eclipse.org/legal/epl-v10.html";
-
-    revision "2015-08-26" {
-         description
-             "Initial revision";
-    }
-
-    identity rsvp-parser {
-        base config:module-type;
-        config:provided-service spi:rsvp-extension;
-        config:java-name-prefix RSVPParser;
-    }
-
-    augment "/config:modules/config:module/config:configuration" {
-        case rsvp-parser {
-            when "/config:modules/config:module/config:type = 'rsvp-parser'";
-        }
-    }
-}
\ No newline at end of file
diff --git a/rsvp/impl/src/test/java/org/opendaylight/controller/config/yang/rsvp/parser/impl/RSVPParserModuleTest.java b/rsvp/impl/src/test/java/org/opendaylight/controller/config/yang/rsvp/parser/impl/RSVPParserModuleTest.java
deleted file mode 100644 (file)
index 2351ccd..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.controller.config.yang.rsvp.parser.impl;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.controller.config.api.jmx.CommitStatus;
-import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
-import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
-import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
-import org.opendaylight.controller.config.yang.rsvp.impl.RSVPParserModuleFactory;
-import org.opendaylight.controller.config.yang.rsvp.spi.SimpleRSVPExtensionProviderContextModuleFactory;
-
-public class RSVPParserModuleTest extends AbstractConfigTest {
-    private static final String FACTORY_NAME = RSVPParserModuleFactory.NAME;
-    private static final String INSTANCE_NAME = "rsvp-parser-impl";
-
-    @Before
-    public void setUp() throws Exception {
-        super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.mockedContext, new
-            RSVPParserModuleFactory(), new SimpleRSVPExtensionProviderContextModuleFactory()));
-    }
-
-    @Test
-    public void testCreateBean() throws Exception {
-        final CommitStatus status = createInstance();
-        assertBeanCount(1, FACTORY_NAME);
-        assertStatus(status, 1, 0, 0);
-    }
-
-    @Test
-    public void testReusingOldInstance() throws Exception {
-        createInstance();
-        final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-        assertBeanCount(1, FACTORY_NAME);
-        final CommitStatus status = transaction.commit();
-        assertBeanCount(1, FACTORY_NAME);
-        assertStatus(status, 0, 0, 1);
-    }
-
-    private CommitStatus createInstance() throws Exception {
-        final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-        transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
-        return transaction.commit();
-    }
-}
\ No newline at end of file
index 523e9cc594c5373ee197378b91952279f9086de8..e91b445813e71c51417e6051e2e98336befa7ed7 100644 (file)
@@ -7,10 +7,20 @@
  */
 package org.opendaylight.controller.config.yang.rsvp.spi;
 
-import org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator;
-import org.opendaylight.protocol.rsvp.parser.spi.pojo.SimpleRSVPExtensionProviderContext;
+import com.google.common.reflect.AbstractInvocationHandler;
+import com.google.common.reflect.Reflection;
+import java.lang.reflect.Method;
+import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker;
+import org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderContext;
+import org.osgi.framework.BundleContext;
 
+/**
+ * @deprecated Replaced by blueprint wiring
+ */
+@Deprecated
 public class SimpleRSVPExtensionProviderContextModule extends org.opendaylight.controller.config.yang.rsvp.spi.AbstractSimpleRSVPExtensionProviderContextModule {
+    private BundleContext bundleContext;
+
     public SimpleRSVPExtensionProviderContextModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
         super(identifier, dependencyResolver);
     }
@@ -26,20 +36,27 @@ public class SimpleRSVPExtensionProviderContextModule extends org.opendaylight.c
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        final class SimpleRSVPExtensionProviderContextAutoCloseable extends SimpleRSVPExtensionProviderContext implements AutoCloseable {
+        final WaitingServiceTracker<RSVPExtensionProviderContext> tracker =
+                WaitingServiceTracker.create(RSVPExtensionProviderContext.class, bundleContext);
+        final RSVPExtensionProviderContext service = tracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+
+        return Reflection.newProxy(AutoCloseableRSVPExtensionProviderContext.class, new AbstractInvocationHandler() {
             @Override
-            public void close() {
-                for (final RSVPExtensionProviderActivator e : getRsvpExtensionDependency()) {
-                    e.stop();
+            protected Object handleInvocation(Object proxy, Method method, Object[] args) throws Throwable {
+                if (method.getName().equals("close")) {
+                    tracker.close();
+                    return null;
+                } else {
+                    return method.invoke(service, args);
                 }
             }
-        }
+        });
+    }
 
-        final SimpleRSVPExtensionProviderContextAutoCloseable ret = new SimpleRSVPExtensionProviderContextAutoCloseable();
-        for (final RSVPExtensionProviderActivator e : getRsvpExtensionDependency()) {
-            e.start(ret);
-        }
-        return ret;
+    void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
     }
 
+    private static interface AutoCloseableRSVPExtensionProviderContext extends RSVPExtensionProviderContext, AutoCloseable {
+    }
 }
index 0fe85af5fedb23814366aeedadc5223fa7aaa58c..ada0d7943eee5a4238284d1ebdef2c60eb9e13c6 100644 (file)
@@ -6,6 +6,29 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 package org.opendaylight.controller.config.yang.rsvp.spi;
-public class SimpleRSVPExtensionProviderContextModuleFactory extends org.opendaylight.controller.config.yang.rsvp.spi.AbstractSimpleRSVPExtensionProviderContextModuleFactory {
 
+import org.opendaylight.controller.config.api.DependencyResolver;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @deprecated Replaced by blueprint wiring
+ */
+@Deprecated
+public class SimpleRSVPExtensionProviderContextModuleFactory extends AbstractSimpleRSVPExtensionProviderContextModuleFactory {
+    @Override
+    public SimpleRSVPExtensionProviderContextModule instantiateModule(String instanceName, DependencyResolver dependencyResolver,
+            SimpleRSVPExtensionProviderContextModule oldModule, AutoCloseable oldInstance, BundleContext bundleContext) {
+        SimpleRSVPExtensionProviderContextModule module = super.instantiateModule(instanceName, dependencyResolver, oldModule,
+                oldInstance, bundleContext);
+        module.setBundleContext(bundleContext);
+        return module;
+    }
+
+    @Override
+    public SimpleRSVPExtensionProviderContextModule instantiateModule(String instanceName, DependencyResolver dependencyResolver,
+            BundleContext bundleContext) {
+        SimpleRSVPExtensionProviderContextModule module = super.instantiateModule(instanceName, dependencyResolver, bundleContext);
+        module.setBundleContext(bundleContext);
+        return module;
+    }
 }
diff --git a/rsvp/spi/src/main/java/org/opendaylight/protocol/rsvp/parser/spi/pojo/SimpleRSVPExtensionProviderContextActivator.java b/rsvp/spi/src/main/java/org/opendaylight/protocol/rsvp/parser/spi/pojo/SimpleRSVPExtensionProviderContextActivator.java
new file mode 100644 (file)
index 0000000..f0fcc87
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2016 Brocade Communications Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.protocol.rsvp.parser.spi.pojo;
+
+import com.google.common.base.Preconditions;
+import java.util.List;
+import org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator;
+import org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Starts and stops RSVPExtensionProviderActivator instances for a RSVPExtensionProviderContext.
+ *
+ * @author Thomas Pantelis
+ */
+public class SimpleRSVPExtensionProviderContextActivator implements AutoCloseable {
+    private static final Logger LOG = LoggerFactory.getLogger(SimpleRSVPExtensionProviderContextActivator.class);
+
+    private final RSVPExtensionProviderContext providerContext;
+    private final List<RSVPExtensionProviderActivator> extensionActivators;
+
+    public SimpleRSVPExtensionProviderContextActivator(final RSVPExtensionProviderContext providerContext,
+            final List<RSVPExtensionProviderActivator> extensionActivators) {
+        this.providerContext = Preconditions.checkNotNull(providerContext);
+        this.extensionActivators = Preconditions.checkNotNull(extensionActivators);
+    }
+
+    public void start() {
+        LOG.debug("Starting {} RSVPExtensionProviderActivator instances", extensionActivators.size());
+
+        for(final RSVPExtensionProviderActivator e : extensionActivators) {
+            e.start(providerContext);
+        }
+    }
+
+    @Override
+    public void close() {
+        LOG.debug("Stopping {} RSVPExtensionProviderActivator instances", extensionActivators.size());
+
+        for(final RSVPExtensionProviderActivator e : extensionActivators) {
+            e.stop();
+        }
+    }
+}
diff --git a/rsvp/spi/src/main/resources/org/opendaylight/blueprint/rsvp-spi.xml b/rsvp/spi/src/main/resources/org/opendaylight/blueprint/rsvp-spi.xml
new file mode 100644 (file)
index 0000000..e4c91d7
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
+
+  <!-- Obtains the specific list of RSVPExtensionProviderActivator OSGi services announced via
+       META-INF/services/org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator resources.
+  -->
+  <odl:specific-reference-list id="extensionActivators" interface="org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator"/>
+
+  <bean id="extensionProviderContext" class="org.opendaylight.protocol.rsvp.parser.spi.pojo.SimpleRSVPExtensionProviderContext"/>
+
+  <bean id="extensionProviderContextActivator" class="org.opendaylight.protocol.rsvp.parser.spi.pojo.SimpleRSVPExtensionProviderContextActivator"
+      init-method="start" destroy-method="close">
+    <argument ref="extensionProviderContext"/>
+    <argument ref="extensionActivators"/>
+  </bean>
+
+  <service ref="extensionProviderContext">
+    <interfaces>
+      <value>org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderContext</value>
+      <value>org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionConsumerContext</value>
+    </interfaces>
+  </service>
+</blueprint>
\ No newline at end of file
index 5957360135766285ed614adbddaee2b73757a215..c7c30c7ba441f51e0a6026770a8b0dec585c3e82 100644 (file)
@@ -44,14 +44,6 @@ module odl-rsvp-parser-spi-cfg {
         config:java-class "org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderContext";
     }
 
-    identity rsvp-extension {
-        description
-            "Service representing a RSVP parser extension.";
-
-        base "config:service-type";
-        config:java-class "org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionProviderActivator";
-    }
-
     identity rsvp-extensions-impl {
         base config:module-type;
         config:provided-service rsvp-extensions;
@@ -61,15 +53,6 @@ module odl-rsvp-parser-spi-cfg {
     augment "/config:modules/config:module/config:configuration" {
         case rsvp-extensions-impl {
             when "/config:modules/config:module/config:type = 'rsvp-extensions-impl'";
-
-            list rsvp-extension {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity rsvp-extension;
-                    }
-                }
-            }
         }
     }
 }
\ No newline at end of file
diff --git a/rsvp/spi/src/test/java/org/opendaylight/controller/config/yang/rsvp/spi/SimpleRSVPExtensionProviderContextModuleTest.java b/rsvp/spi/src/test/java/org/opendaylight/controller/config/yang/rsvp/spi/SimpleRSVPExtensionProviderContextModuleTest.java
deleted file mode 100644 (file)
index 995dd7d..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.controller.config.yang.rsvp.spi;
-
-import java.util.List;
-import javax.management.ObjectName;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.controller.config.api.jmx.CommitStatus;
-import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
-import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
-import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
-
-public class SimpleRSVPExtensionProviderContextModuleTest extends AbstractConfigTest {
-    private static final String FACTORY_NAME = SimpleRSVPExtensionProviderContextModuleFactory.NAME;
-    private static final String INSTANCE_NAME = "bgp-rsvp-extensions-impl";
-
-    public static ObjectName SimpleRSVPExtensionProviderContextModuleInstance(final ConfigTransactionJMXClient transaction, final List<ObjectName> extensions) throws Exception {
-        final ObjectName objectName = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
-        final SimpleRSVPExtensionProviderContextModuleMXBean mxBean = transaction.newMXBeanProxy(objectName, SimpleRSVPExtensionProviderContextModuleMXBean.class);
-        mxBean.setRsvpExtension(extensions);
-        return objectName;
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.mockedContext, new SimpleRSVPExtensionProviderContextModuleFactory()));
-    }
-
-    @Test
-    public void testCreateBean() throws Exception {
-        final CommitStatus status = createInstance();
-        assertBeanCount(1, FACTORY_NAME);
-        assertStatus(status, 1, 0, 0);
-    }
-
-    @Test
-    public void testReusingOldInstance() throws Exception {
-        createInstance();
-        final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-        assertBeanCount(1, FACTORY_NAME);
-        final CommitStatus status = transaction.commit();
-        assertBeanCount(1, FACTORY_NAME);
-        assertStatus(status, 0, 0, 1);
-    }
-
-    private CommitStatus createInstance() throws Exception {
-        final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-        transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
-        return transaction.commit();
-    }
-}
\ No newline at end of file