From: Tony Tkacik Date: Sun, 26 Jan 2014 17:24:25 +0000 (+0100) Subject: Fix RPC forwarding related bugs in Binding Independent Connector X-Git-Tag: jenkins-controller-bulk-release-prepare-only-2-13^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=bf8cca4f590ce0a8bece21f0f1a81f6823ee3d65 Fix RPC forwarding related bugs in Binding Independent Connector - Fix for set of small bugs which prevented invocation of RPC via Restconf Change-Id: I090516187007c5b1411fd6a9aecf25724465228a Signed-off-by: Robert Gallas Signed-off-by: Tony Tkacik --- diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentConnector.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentConnector.java index d2295c49de..aaed12f740 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentConnector.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentConnector.java @@ -89,6 +89,8 @@ public class BindingIndependentConnector implements // Provider, // AutoCloseable { + + private final Logger LOG = LoggerFactory.getLogger(BindingIndependentConnector.class); @SuppressWarnings( "deprecation") @@ -589,7 +591,7 @@ public class BindingIndependentConnector implements // } } catch (Exception e) { - LOG.error("Could not forward Rpcs of type {}", service.getName()); + LOG.error("Could not forward Rpcs of type {}", service.getName(),e); } registrations = ImmutableSet.of(); } @@ -721,8 +723,10 @@ public class BindingIndependentConnector implements // } else { strategy = new NoInputNoOutputInvocationStrategy(rpc,targetMethod); } + } else if(inputClass.isPresent()){ + strategy = new NoOutputInvocationStrategy(rpc,targetMethod, inputClass.get()); } else { - strategy = null; + strategy = new NoInputNoOutputInvocationStrategy(rpc,targetMethod); } return strategy; } @@ -814,6 +818,46 @@ public class BindingIndependentConnector implements // return Futures.immediateFuture(null); } } + + private class NoOutputInvocationStrategy extends RpcInvocationStrategy { + + + @SuppressWarnings("rawtypes") + private WeakReference inputClass; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public NoOutputInvocationStrategy(QName rpc, Method targetMethod, + Class inputClass) { + super(rpc,targetMethod); + this.inputClass = new WeakReference(inputClass); + } + + + @Override + public RpcResult uncheckedInvoke(RpcService rpcService, CompositeNode domInput) throws Exception { + DataContainer bindingInput = mappingService.dataObjectFromDataDom(inputClass.get(), domInput); + Future> result = (Future>) targetMethod.invoke(rpcService, bindingInput); + if (result == null) { + return Rpcs.getRpcResult(false); + } + RpcResult bindingResult = result.get(); + return Rpcs.getRpcResult(true); + } + + @Override + public Future> forwardToDomBroker(DataObject input) { + if(biRouter != null) { + CompositeNode xml = mappingService.toDataDom(input); + CompositeNode wrappedXml = ImmutableCompositeNode.create(rpc,ImmutableList.>of(xml)); + RpcResult result = biRouter.invokeRpc(rpc, wrappedXml); + Object baResultValue = null; + RpcResult baResult = Rpcs.getRpcResult(result.isSuccessful(), null, result.getErrors()); + return Futures.>immediateFuture(baResult); + } + return Futures.>immediateFuture(Rpcs.getRpcResult(false)); + } + + } public boolean isRpcForwarding() { return rpcForwarding; @@ -824,7 +868,6 @@ public class BindingIndependentConnector implements // } public boolean isNotificationForwarding() { - // TODO Auto-generated method stub return notificationForwarding; } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerConfigActivator.xtend b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerConfigActivator.xtend index 53fa4d087d..1159d5650e 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerConfigActivator.xtend +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerConfigActivator.xtend @@ -21,6 +21,7 @@ import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier import org.osgi.framework.BundleContext import org.osgi.framework.ServiceRegistration import org.opendaylight.controller.sal.dom.broker.impl.SchemaContextProviders +import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry class BrokerConfigActivator implements AutoCloseable { @@ -29,12 +30,12 @@ class BrokerConfigActivator implements AutoCloseable { @Property private var DataBrokerImpl dataService; - private var ServiceRegistration schemaReg; private var ServiceRegistration dataReg; private var ServiceRegistration dataProviderReg; private var ServiceRegistration mountReg; private var ServiceRegistration mountProviderReg; private var SchemaService schemaService; + private var ServiceRegistration rpcProvisionRegistryReg; private var MountPointManagerImpl mountService; SchemaAwareDataStoreAdapter wrappedStore @@ -45,7 +46,6 @@ class BrokerConfigActivator implements AutoCloseable { val serviceRef = context.getServiceReference(SchemaService); schemaService = context.getService(serviceRef); - schemaReg = context.registerService(SchemaService, schemaService, emptyProperties); broker.setRouter(new SchemaAwareRpcBroker("/", SchemaContextProviders.fromSchemaService(schemaService))); @@ -70,14 +70,16 @@ class BrokerConfigActivator implements AutoCloseable { mountReg = context.registerService(MountService, mountService, emptyProperties); mountProviderReg = context.registerService(MountProvisionService, mountService, emptyProperties); + + rpcProvisionRegistryReg = context.registerService(RpcProvisionRegistry, broker.getRouter(), emptyProperties); } override def close() { - schemaReg?.unregister(); dataReg?.unregister(); dataProviderReg?.unregister(); mountReg?.unregister(); mountProviderReg?.unregister(); + rpcProvisionRegistryReg?.unregister(); } } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareRpcBroker.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareRpcBroker.java index de6cfa6276..f0f5ac3e33 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareRpcBroker.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareRpcBroker.java @@ -119,6 +119,7 @@ public class SchemaAwareRpcBroker implements RpcRouter, Identifiable { RpcDefinition definition = findRpcDefinition(rpcType); checkArgument(!isRoutedRpc(definition), "RPC Type must not be routed."); GlobalRpcRegistration reg = new GlobalRpcRegistration(rpcType, implementation, this); + implementations.putIfAbsent(rpcType, implementation); return reg; } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/ProxyFactory.xtend b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/ProxyFactory.xtend index 938808facd..3f77133c2e 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/ProxyFactory.xtend +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/ProxyFactory.xtend @@ -8,6 +8,7 @@ import org.opendaylight.controller.sal.core.api.notify.NotificationPublishServic import org.opendaylight.controller.sal.core.api.notify.NotificationService import org.opendaylight.controller.sal.core.api.model.SchemaService import org.opendaylight.controller.sal.core.api.mount.MountProvisionService +import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry class ProxyFactory { @@ -40,6 +41,10 @@ class ProxyFactory { new SchemaServiceProxy(ref as ServiceReference, service); } + private static def dispatch createProxyImpl(ServiceReference ref, RpcProvisionRegistry service) { + new RpcProvisionRegistryProxy(ref as ServiceReference, service); + } + private static def dispatch createProxyImpl(ServiceReference reference, BrokerService service) { throw new IllegalArgumentException("Not supported class"); } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/RpcProvisionRegistryProxy.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/RpcProvisionRegistryProxy.java new file mode 100644 index 0000000000..e375e14cf2 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/RpcProvisionRegistryProxy.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2013 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.sal.dom.broker.osgi; + +import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; +import org.opendaylight.controller.sal.core.api.Broker; +import org.opendaylight.controller.sal.core.api.RpcImplementation; +import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry; +import org.opendaylight.controller.sal.core.api.RpcRegistrationListener; +import org.opendaylight.controller.sal.core.api.RpcRoutingContext; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.osgi.framework.ServiceReference; + +public class RpcProvisionRegistryProxy extends AbstractBrokerServiceProxy + implements RpcProvisionRegistry { + + public RpcProvisionRegistryProxy(ServiceReference ref, RpcProvisionRegistry delegate) { + super(ref, delegate); + } + + @Override + public Broker.RpcRegistration addRpcImplementation(QName rpcType, RpcImplementation implementation) throws IllegalArgumentException { + return getDelegate().addRpcImplementation(rpcType, implementation); + } + + @Override + public ListenerRegistration addRpcRegistrationListener(RpcRegistrationListener listener) { + return getDelegate().addRpcRegistrationListener(listener); + } + + @Override + public Broker.RoutedRpcRegistration addRoutedRpcImplementation(QName rpcType, RpcImplementation implementation) { + return getDelegate().addRoutedRpcImplementation(rpcType, implementation); + } + + @Override + public > ListenerRegistration registerRouteChangeListener(L listener) { + return getDelegate().registerRouteChangeListener(listener); + } +}