From: Tom Pantelis Date: Wed, 22 Jun 2016 17:11:50 +0000 (-0400) Subject: Add "static-reference" blueprint extension X-Git-Tag: release/boron~99 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=354e9b9cf8686a42add3f81a979a26a963f5be64;ds=sidebyside Add "static-reference" blueprint extension Added a blueprint extension, "static-reference", that obtains an OSGi service and returns the actual instance. This differs from the standard "reference" element that returns a dynamic proxy whose underlying service instance can come and go. This is useful especially in cases where the service exists for the life of the karaf container and you don't need/want the overhead of the proxy. Change-Id: I4cbcc7e2b5a85b0a22e50e12f3946d29bfb36c7d Signed-off-by: Tom Pantelis --- diff --git a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/AbstractDependentComponentFactoryMetadata.java b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/AbstractDependentComponentFactoryMetadata.java index a84b8b68ea..8001c3e4d6 100644 --- a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/AbstractDependentComponentFactoryMetadata.java +++ b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/AbstractDependentComponentFactoryMetadata.java @@ -96,8 +96,12 @@ abstract class AbstractDependentComponentFactoryMetadata implements DependentCom } protected void retrieveService(String name, Class interfaceClass, Consumer onServiceRetrieved) { + retrieveService(name, interfaceClass.getName(), onServiceRetrieved); + } + + protected void retrieveService(String name, String interfaceName, Consumer onServiceRetrieved) { StaticServiceReferenceRecipe recipe = new StaticServiceReferenceRecipe(getId() + "-" + name, - container, interfaceClass.getName()); + container, interfaceName); setDependendencyDesc(recipe.getOsgiFilter()); serviceRecipes.add(recipe); diff --git a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/OpendaylightNamespaceHandler.java b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/OpendaylightNamespaceHandler.java index ab9e216d03..14ca14b69d 100644 --- a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/OpendaylightNamespaceHandler.java +++ b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/OpendaylightNamespaceHandler.java @@ -65,6 +65,7 @@ public class OpendaylightNamespaceHandler implements NamespaceHandler { private static final String ID_ATTR = "id"; private static final String RPC_SERVICE = "rpc-service"; private static final String SPECIFIC_SERVICE_REF_LIST = "specific-reference-list"; + private static final String STATIC_REFERENCE = "static-reference"; @SuppressWarnings("rawtypes") @Override @@ -99,6 +100,8 @@ public class OpendaylightNamespaceHandler implements NamespaceHandler { return parseClusteredAppConfig(element, context); } else if (nodeNameEquals(element, SPECIFIC_SERVICE_REF_LIST)) { return parseSpecificReferenceList(element, context); + } else if (nodeNameEquals(element, STATIC_REFERENCE)) { + return parseStaticReference(element, context); } throw new ComponentDefinitionException("Unsupported standalone element: " + element.getNodeName()); @@ -358,6 +361,15 @@ public class OpendaylightNamespaceHandler implements NamespaceHandler { return metadata; } + private Metadata parseStaticReference(Element element, ParserContext context) { + ComponentFactoryMetadata metadata = new StaticReferenceMetadata(getId(context, element), + element.getAttribute(INTERFACE)); + + LOG.debug("parseStaticReference returning {}", metadata); + + return metadata; + } + private Element parseXML(String name, String xml) { DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); builderFactory.setNamespaceAware(true); diff --git a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/StaticReferenceMetadata.java b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/StaticReferenceMetadata.java new file mode 100644 index 0000000000..693f518e15 --- /dev/null +++ b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/StaticReferenceMetadata.java @@ -0,0 +1,55 @@ +/* + * 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.controller.blueprint.ext; + +import org.osgi.service.blueprint.container.ComponentDefinitionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Factory metadata corresponding to the "static-reference" element that obtains an OSGi service and + * returns the actual instance. This differs from the standard "reference" element that returns a dynamic + * proxy whose underlying service instance can come and go. + * + * @author Thomas Pantelis + */ +class StaticReferenceMetadata extends AbstractDependentComponentFactoryMetadata { + private static final Logger LOG = LoggerFactory.getLogger(StaticReferenceMetadata.class); + + private final String interfaceName; + private volatile Object retrievedService; + + StaticReferenceMetadata(String id, String interfaceName) { + super(id); + this.interfaceName = interfaceName; + } + + @Override + protected void startTracking() { + retrieveService(interfaceName, interfaceName, service -> { + retrievedService = service; + setSatisfied(); + }); + } + + @Override + public Object create() throws ComponentDefinitionException { + super.onCreate(); + + LOG.debug("{}: create returning service {}", logName(), retrievedService); + + return retrievedService; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("StaticReferenceMetadata [interfaceName=").append(interfaceName).append("]"); + return builder.toString(); + } +} diff --git a/opendaylight/blueprint/src/main/resources/opendaylight-blueprint-ext-1.0.0.xsd b/opendaylight/blueprint/src/main/resources/opendaylight-blueprint-ext-1.0.0.xsd index 2a2189d615..b3a7646a37 100644 --- a/opendaylight/blueprint/src/main/resources/opendaylight-blueprint-ext-1.0.0.xsd +++ b/opendaylight/blueprint/src/main/resources/opendaylight-blueprint-ext-1.0.0.xsd @@ -48,4 +48,10 @@ + + + + + + \ No newline at end of file