Update AbstractService to support isComplete 80/51180/8
authordeathbeam <tomas.slusny@pantheon.tech>
Mon, 30 Jan 2017 12:21:41 +0000 (13:21 +0100)
committerTomas Slusny <tomas.slusny@pantheon.tech>
Wed, 15 Feb 2017 15:13:41 +0000 (16:13 +0100)
Overload AbstractService#handleServiceCall to also have
parameter with isComplete function.

See also: bug 7141

Change-Id: I51ee1032ac7b443cf8b442ef66eca42380e938b0
Signed-off-by: deathbeam <tomas.slusny@pantheon.tech>
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractService.java

index 0da48399a21fabf4beebeb7d59782ee1cf964211..94804be16ca92b56f1aa5a9e3842ccb827a24004 100644 (file)
@@ -13,6 +13,8 @@ import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.math.BigInteger;
+import java.util.Objects;
+import java.util.function.Function;
 import javax.annotation.Nonnull;
 import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue;
 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
@@ -77,11 +79,17 @@ abstract class AbstractService<I, O> {
         return deviceContext;
     }
 
-    protected DeviceRegistry getDeviceRegistry() {return deviceContext;}
+    protected DeviceRegistry getDeviceRegistry() {
+        return deviceContext;
+    }
 
-    public DeviceInfo getDeviceInfo() {return deviceContext.getDeviceInfo();}
+    public DeviceInfo getDeviceInfo() {
+        return deviceContext.getDeviceInfo();
+    }
 
-    public TxFacade getTxFacade() {return deviceContext;}
+    public TxFacade getTxFacade() {
+        return deviceContext;
+    }
 
     public MessageSpy getMessageSpy() {
         return messageSpy;
@@ -92,6 +100,11 @@ abstract class AbstractService<I, O> {
     protected abstract FutureCallback<OfHeader> createCallback(RequestContext<O> context, Class<?> requestType);
 
     public ListenableFuture<RpcResult<O>> handleServiceCall(@Nonnull final I input) {
+        return handleServiceCall(input, null);
+    }
+
+    public ListenableFuture<RpcResult<O>> handleServiceCall(@Nonnull final I input,
+            @Nonnull final Function<OfHeader, Boolean> isComplete) {
         Preconditions.checkNotNull(input);
 
         final Class<?> requestType;
@@ -122,12 +135,17 @@ abstract class AbstractService<I, O> {
         try {
             request = buildRequest(xid, input);
             Verify.verify(xid.getValue().equals(request.getXid()), "Expected XID %s got %s", xid.getValue(), request.getXid());
-        } catch (Exception e) {
-            LOG.error("Failed to build request for {}, forfeiting request {}", input, xid.getValue(), e);
-            RequestContextUtil.closeRequestContextWithRpcError(requestContext, "failed to build request input: " + e.getMessage());
+        } catch (Exception ex) {
+            LOG.error("Failed to build request for {}, forfeiting request {}", input, xid.getValue(), ex);
+            RequestContextUtil.closeRequestContextWithRpcError(requestContext, "failed to build request input: " + ex.getMessage());
         } finally {
             final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider();
-            outboundQueue.commitEntry(xid.getValue(), request, createCallback(requestContext, requestType));
+
+            if (Objects.nonNull(isComplete)) {
+                outboundQueue.commitEntry(xid.getValue(), request, createCallback(requestContext, requestType), isComplete);
+            } else {
+                outboundQueue.commitEntry(xid.getValue(), request, createCallback(requestContext, requestType));
+            }
         }
 
         return requestContext.getFuture();
@@ -135,7 +153,7 @@ abstract class AbstractService<I, O> {
 
     protected static <T> ListenableFuture<RpcResult<T>> failedFuture() {
         final RpcResult<T> rpcResult = RpcResultBuilder.<T>failed()
-                .withError(RpcError.ErrorType.APPLICATION, "", "Request quota exceeded").build();
+            .withError(RpcError.ErrorType.APPLICATION, "", "Request quota exceeded").build();
         return Futures.immediateFuture(rpcResult);
     }
 }