From c55df06ea1182c1f73d09fe777fbc3c320d5e571 Mon Sep 17 00:00:00 2001 From: Mayank Agarwal Date: Mon, 14 Apr 2014 14:58:31 -0700 Subject: [PATCH] Bug-574 Added a 4th RPC Invocation strategy for the case where the RPC has an output, but no input Change-Id: I7d1a596f3bb1362044cc240a15bdb9bb7d094c55 Signed-off-by: Mayank Agarwal --- .../dom/BindingIndependentConnector.java | 164 ++++++++++++------ 1 file changed, 109 insertions(+), 55 deletions(-) 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 a398abc75a..b27c80d784 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 @@ -98,11 +98,8 @@ public class BindingIndependentConnector implements // Provider, // AutoCloseable { - - private final Logger LOG = LoggerFactory.getLogger(BindingIndependentConnector.class); - private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier ROOT_BI = org.opendaylight.yangtools.yang.data.api.InstanceIdentifier .builder().toInstance(); @@ -200,30 +197,30 @@ public class BindingIndependentConnector implements // private DataModificationTransaction createBindingToDomTransaction( final DataModification, DataObject> source) { DataModificationTransaction target = biDataService.beginTransaction(); - LOG.debug("Created DOM Transaction {} for {},", target.getIdentifier(),source.getIdentifier()); + LOG.debug("Created DOM Transaction {} for {},", target.getIdentifier(), source.getIdentifier()); for (InstanceIdentifier entry : source.getRemovedConfigurationData()) { org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biEntry = mappingService.toDataDom(entry); target.removeConfigurationData(biEntry); - LOG.debug("Delete of Binding Configuration Data {} is translated to {}",entry,biEntry); + LOG.debug("Delete of Binding Configuration Data {} is translated to {}", entry, biEntry); } for (InstanceIdentifier entry : source.getRemovedOperationalData()) { org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biEntry = mappingService.toDataDom(entry); target.removeOperationalData(biEntry); - LOG.debug("Delete of Binding Operational Data {} is translated to {}",entry,biEntry); + LOG.debug("Delete of Binding Operational Data {} is translated to {}", entry, biEntry); } for (Entry, DataObject> entry : source.getUpdatedConfigurationData() .entrySet()) { Entry biEntry = mappingService .toDataDom(entry); target.putConfigurationData(biEntry.getKey(), biEntry.getValue()); - LOG.debug("Update of Binding Configuration Data {} is translated to {}",entry,biEntry); + LOG.debug("Update of Binding Configuration Data {} is translated to {}", entry, biEntry); } for (Entry, DataObject> entry : source.getUpdatedOperationalData() .entrySet()) { Entry biEntry = mappingService .toDataDom(entry); target.putOperationalData(biEntry.getKey(), biEntry.getValue()); - LOG.debug("Update of Binding Operational Data {} is translated to {}",entry,biEntry); + LOG.debug("Update of Binding Operational Data {} is translated to {}", entry, biEntry); } return target; @@ -279,7 +276,8 @@ public class BindingIndependentConnector implements // return biDataService; } - protected void setDomDataService(final org.opendaylight.controller.sal.core.api.data.DataProviderService biDataService) { + protected void setDomDataService( + final org.opendaylight.controller.sal.core.api.data.DataProviderService biDataService) { this.biDataService = biDataService; } @@ -300,14 +298,14 @@ public class BindingIndependentConnector implements // } public void startDataForwarding() { - if(baDataService instanceof AbstractForwardedDataBroker) { + if (baDataService instanceof AbstractForwardedDataBroker) { dataForwarding = true; return; } final DataProviderService baData; if (baDataService instanceof BindingMountPointImpl) { - baData = ((BindingMountPointImpl)baDataService).getDataBrokerImpl(); + baData = ((BindingMountPointImpl) baDataService).getDataBrokerImpl(); LOG.debug("Extracted BA Data provider {} from mount point {}", baData, baDataService); } else { baData = baDataService; @@ -478,8 +476,8 @@ public class BindingIndependentConnector implements // } DataModificationTransaction domTransaction = createBindingToDomTransaction(bindingTransaction); BindingToDomTransaction wrapped = new BindingToDomTransaction(domTransaction, bindingTransaction); - LOG.trace("Forwarding Binding Transaction: {} as DOM Transaction: {} .", bindingTransaction.getIdentifier(), - domTransaction.getIdentifier()); + LOG.trace("Forwarding Binding Transaction: {} as DOM Transaction: {} .", + bindingTransaction.getIdentifier(), domTransaction.getIdentifier()); return wrapped; } } @@ -489,7 +487,8 @@ public class BindingIndependentConnector implements // DataCommitHandler { @Override - public void onRegister(final DataCommitHandlerRegistration, DataObject> registration) { + public void onRegister( + final DataCommitHandlerRegistration, DataObject> registration) { org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = mappingService.toDataDom(registration .getPath()); @@ -497,7 +496,8 @@ public class BindingIndependentConnector implements // } @Override - public void onUnregister(final DataCommitHandlerRegistration, DataObject> registration) { + public void onUnregister( + final DataCommitHandlerRegistration, DataObject> registration) { // NOOP for now // FIXME: do registration based on only active commit handlers. } @@ -531,8 +531,7 @@ public class BindingIndependentConnector implements // * */ private class DomToBindingRpcForwardingManager implements - RouteChangeListener>, - RouterInstantiationListener, + RouteChangeListener>, RouterInstantiationListener, GlobalRpcRegistrationListener { private final Map, DomToBindingRpcForwarder> forwarders = new WeakHashMap<>(); @@ -615,7 +614,7 @@ public class BindingIndependentConnector implements // } } catch (Exception e) { - LOG.error("Could not forward Rpcs of type {}", service.getName(),e); + LOG.error("Could not forward Rpcs of type {}", service.getName(), e); } registrations = ImmutableSet.of(); } @@ -626,7 +625,8 @@ public class BindingIndependentConnector implements // * @param service * @param context */ - public DomToBindingRpcForwarder(final Class service, final Class context) { + public DomToBindingRpcForwarder(final Class service, + final Class context) { this.rpcServiceType = new WeakReference>(service); this.supportedRpcs = mappingService.getRpcQNamesFor(service); Builder registrationsBuilder = ImmutableSet @@ -645,8 +645,8 @@ public class BindingIndependentConnector implements // registrations = registrationsBuilder.build(); } - public void registerPaths(final Class context, final Class service, - final Set> set) { + public void registerPaths(final Class context, + final Class service, final Set> set) { QName ctx = BindingReflections.findQName(context); for (org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path : FluentIterable.from(set).transform( toDOMInstanceIdentifier)) { @@ -656,7 +656,6 @@ public class BindingIndependentConnector implements // } } - @Override public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { if (EQUALS_METHOD.equals(method)) { @@ -700,7 +699,6 @@ public class BindingIndependentConnector implements // } } - @Override public ListenableFuture> invokeRpc(final QName rpc, final CompositeNode domInput) { checkArgument(rpc != null); @@ -748,12 +746,12 @@ public class BindingIndependentConnector implements // strategy = new DefaultInvocationStrategy(rpc, targetMethod, outputClass.get(), inputClass .get()); } else { - strategy = new NoInputNoOutputInvocationStrategy(rpc, targetMethod); + strategy = new NoInputInvocationStrategy(rpc, targetMethod, outputClass.get()); } - } else if(inputClass.isPresent()){ - strategy = new NoOutputInvocationStrategy(rpc,targetMethod, inputClass.get()); + } else if (inputClass.isPresent()) { + strategy = new NoOutputInvocationStrategy(rpc, targetMethod, inputClass.get()); } else { - strategy = new NoInputNoOutputInvocationStrategy(rpc,targetMethod); + strategy = new NoInputNoOutputInvocationStrategy(rpc, targetMethod); } return strategy; } @@ -777,7 +775,8 @@ public class BindingIndependentConnector implements // public abstract RpcResult uncheckedInvoke(RpcService rpcService, CompositeNode domInput) throws Exception; - public RpcResult invokeOn(final RpcService rpcService, final CompositeNode domInput) throws Exception { + public RpcResult invokeOn(final RpcService rpcService, final CompositeNode domInput) + throws Exception { return uncheckedInvoke(rpcService, domInput); } } @@ -800,7 +799,8 @@ public class BindingIndependentConnector implements // @SuppressWarnings("unchecked") @Override - public RpcResult uncheckedInvoke(final RpcService rpcService, final CompositeNode domInput) throws Exception { + public RpcResult uncheckedInvoke(final RpcService rpcService, final CompositeNode domInput) + throws Exception { DataContainer bindingInput = mappingService.dataObjectFromDataDom(inputClass.get(), domInput); Future> futureResult = (Future>) targetMethod.invoke(rpcService, bindingInput); if (futureResult == null) { @@ -809,31 +809,84 @@ public class BindingIndependentConnector implements // RpcResult bindingResult = futureResult.get(); final Object resultObj = bindingResult.getResult(); if (resultObj instanceof DataObject) { - final CompositeNode output = mappingService.toDataDom((DataObject)resultObj); - return Rpcs.getRpcResult(true, output, Collections.emptySet()); + final CompositeNode output = mappingService.toDataDom((DataObject) resultObj); + return Rpcs.getRpcResult(true, output, Collections. emptySet()); } return Rpcs.getRpcResult(true); } @Override public ListenableFuture> forwardToDomBroker(final DataObject input) { - if(biRpcRegistry == null) { + if (biRpcRegistry == null) { return Futures.> immediateFuture(Rpcs.getRpcResult(false)); } CompositeNode xml = mappingService.toDataDom(input); CompositeNode wrappedXml = ImmutableCompositeNode.create(rpc, ImmutableList.> of(xml)); - return Futures.transform(biRpcRegistry.invokeRpc(rpc, wrappedXml), new Function, RpcResult>() { - @Override - public RpcResult apply(RpcResult input) { - Object baResultValue = null; - if (input.getResult() != null) { - baResultValue = mappingService.dataObjectFromDataDom(outputClass.get(), input.getResult()); - } - return Rpcs.getRpcResult(input.isSuccessful(), baResultValue, input.getErrors()); - } - }); + return Futures.transform(biRpcRegistry.invokeRpc(rpc, wrappedXml), + new Function, RpcResult>() { + @Override + public RpcResult apply(final RpcResult input) { + Object baResultValue = null; + if (input.getResult() != null) { + baResultValue = mappingService.dataObjectFromDataDom(outputClass.get(), + input.getResult()); + } + return Rpcs.getRpcResult(input.isSuccessful(), baResultValue, input.getErrors()); + } + }); + } + } + + private class NoInputInvocationStrategy extends RpcInvocationStrategy { + + @SuppressWarnings("rawtypes") + private final WeakReference outputClass; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public NoInputInvocationStrategy(final QName rpc, final Method targetMethod, final Class outputClass) { + super(rpc, targetMethod); + this.outputClass = new WeakReference(outputClass); + } + + @SuppressWarnings("unchecked") + @Override + public RpcResult uncheckedInvoke(final RpcService rpcService, final CompositeNode domInput) + throws Exception { + Future> futureResult = (Future>) targetMethod.invoke(rpcService); + if (futureResult == null) { + return Rpcs.getRpcResult(false); + } + RpcResult bindingResult = futureResult.get(); + final Object resultObj = bindingResult.getResult(); + if (resultObj instanceof DataObject) { + final CompositeNode output = mappingService.toDataDom((DataObject) resultObj); + return Rpcs.getRpcResult(true, output, Collections. emptySet()); + } + return Rpcs.getRpcResult(true); + } + + @Override + public Future> forwardToDomBroker(final DataObject input) { + if (biRpcRegistry != null) { + CompositeNode xml = mappingService.toDataDom(input); + CompositeNode wrappedXml = ImmutableCompositeNode.create(rpc, ImmutableList.> of(xml)); + return Futures.transform(biRpcRegistry.invokeRpc(rpc, wrappedXml), + new Function, RpcResult>() { + @Override + public RpcResult apply(final RpcResult input) { + Object baResultValue = null; + if (input.getResult() != null) { + baResultValue = mappingService.dataObjectFromDataDom(outputClass.get(), + input.getResult()); + } + return Rpcs.getRpcResult(input.isSuccessful(), baResultValue, input.getErrors()); + } + }); + } else { + return Futures.> immediateFuture(Rpcs.getRpcResult(false)); + } } } @@ -844,7 +897,8 @@ public class BindingIndependentConnector implements // } @Override - public RpcResult uncheckedInvoke(final RpcService rpcService, final CompositeNode domInput) throws Exception { + public RpcResult uncheckedInvoke(final RpcService rpcService, final CompositeNode domInput) + throws Exception { @SuppressWarnings("unchecked") Future> result = (Future>) targetMethod.invoke(rpcService); RpcResult bindingResult = result.get(); @@ -859,20 +913,19 @@ public class BindingIndependentConnector implements // private class NoOutputInvocationStrategy extends RpcInvocationStrategy { - @SuppressWarnings("rawtypes") private final WeakReference inputClass; @SuppressWarnings({ "rawtypes", "unchecked" }) public NoOutputInvocationStrategy(final QName rpc, final Method targetMethod, final Class inputClass) { - super(rpc,targetMethod); + super(rpc, targetMethod); this.inputClass = new WeakReference(inputClass); } - @Override - public RpcResult uncheckedInvoke(final RpcService rpcService, final CompositeNode domInput) throws Exception { + public RpcResult uncheckedInvoke(final RpcService rpcService, final CompositeNode domInput) + throws Exception { DataContainer bindingInput = mappingService.dataObjectFromDataDom(inputClass.get(), domInput); Future> result = (Future>) targetMethod.invoke(rpcService, bindingInput); if (result == null) { @@ -884,19 +937,20 @@ public class BindingIndependentConnector implements // @Override public ListenableFuture> forwardToDomBroker(final DataObject input) { - if(biRpcRegistry == null) { + if (biRpcRegistry == null) { return Futures.> immediateFuture(Rpcs.getRpcResult(false)); } CompositeNode xml = mappingService.toDataDom(input); - CompositeNode wrappedXml = ImmutableCompositeNode.create(rpc,ImmutableList.>of(xml)); + CompositeNode wrappedXml = ImmutableCompositeNode.create(rpc, ImmutableList.> of(xml)); - return Futures.transform(biRpcRegistry.invokeRpc(rpc, wrappedXml), new Function, RpcResult>() { - @Override - public RpcResult apply(RpcResult input) { - return Rpcs.getRpcResult(input.isSuccessful(), null, input.getErrors()); - } - }); + return Futures.transform(biRpcRegistry.invokeRpc(rpc, wrappedXml), + new Function, RpcResult>() { + @Override + public RpcResult apply(final RpcResult input) { + return Rpcs. getRpcResult(input.isSuccessful(), null, input.getErrors()); + } + }); } } -- 2.36.6