-
- private <T> ListenableFuture<RpcResult<T>> processFlowModInputBuilders(final List<FlowModInputBuilder> ofFlowModInputs) {
-
- final List<ListenableFuture<RpcResult<T>>> partialFutures = new ArrayList<>();
-
- for (final FlowModInputBuilder flowModInputBuilder : ofFlowModInputs) {
- ListenableFuture<RpcResult<T>> partialFuture = handleServiceCall(
- new Function<RequestContext<T>, ListenableFuture<RpcResult<T>>>() {
- @Override
- public ListenableFuture<RpcResult<T>> apply(final RequestContext<T> requestContext) {
- return createResultForFlowMod(requestContext, flowModInputBuilder);
- }
- });
- partialFutures.add(partialFuture);
- }
-
- final ListenableFuture<List<RpcResult<T>>> allFutures = Futures.successfulAsList(partialFutures);
- final SettableFuture<RpcResult<T>> finalFuture = SettableFuture.create();
- Futures.addCallback(allFutures, new FutureCallback<List<RpcResult<T>>>() {
- @Override
- public void onSuccess(final List<RpcResult<T>> results) {
- RpcResultBuilder<T> rpcResultBuilder = RpcResultBuilder.success();
- finalFuture.set(rpcResultBuilder.build());
- }
-
- @Override
- public void onFailure(final Throwable t) {
- RpcResultBuilder<T> rpcResultBuilder = RpcResultBuilder.failed();
- finalFuture.set(rpcResultBuilder.build());
- }
- });
-
- return finalFuture;
- }
-
- protected <T> ListenableFuture<RpcResult<T>> createResultForFlowMod(final RequestContext<T> requestContext, final FlowModInputBuilder flowModInputBuilder) {
- final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider();
- final long xid = requestContext.getXid().getValue();
- flowModInputBuilder.setXid(xid);
- final FlowModInput flowModInput = flowModInputBuilder.build();
-
- outboundQueue.commitEntry(xid, flowModInput, new FutureCallback<OfHeader>() {
- @Override
- public void onSuccess(final OfHeader ofHeader) {
- getMessageSpy().spyMessage(FlowModInput.class, MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS);
-
- RpcResultBuilder<T> rpcResultBuilder = RpcResultBuilder.<T>success();
- requestContext.setResult(rpcResultBuilder.build());
-
- RequestContextUtil.closeRequstContext(requestContext);
- }
-
- @Override
- public void onFailure(final Throwable throwable) {
- RpcResultBuilder<T> rpcResultBuilder = RpcResultBuilder.<T>failed().withError(ErrorType.APPLICATION, throwable.getMessage(), throwable);
- requestContext.setResult(rpcResultBuilder.build());
-
- RequestContextUtil.closeRequstContext(requestContext);
- }
- });
- return requestContext.getFuture();
- }
-