Merge "OPNFLWPLUG-929 : Remove deprecated guava library"
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / services / sal / SalBundleServiceImpl.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.openflowplugin.impl.services.sal;
10
11 import com.google.common.base.Preconditions;
12 import com.google.common.util.concurrent.FutureCallback;
13 import com.google.common.util.concurrent.Futures;
14 import com.google.common.util.concurrent.JdkFutureAdapters;
15 import com.google.common.util.concurrent.ListenableFuture;
16 import com.google.common.util.concurrent.MoreExecutors;
17 import com.google.common.util.concurrent.SettableFuture;
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.concurrent.Future;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SalExperimenterMessageService;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterInputBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessagesInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundleInput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.SalBundleService;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.messages.Message;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleAddMessageSalBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleControlSalBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.bundle.add.message.sal.SalAddMessageDataBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.bundle.control.sal.SalControlDataBuilder;
31 import org.opendaylight.yangtools.yang.common.RpcError;
32 import org.opendaylight.yangtools.yang.common.RpcResult;
33 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
34
35 /**
36  * Simple bundle extension service.
37  */
38 public class SalBundleServiceImpl implements SalBundleService {
39
40     private final SalExperimenterMessageService experimenterMessageService;
41
42     public SalBundleServiceImpl(final SalExperimenterMessageService experimenterMessageService) {
43         this.experimenterMessageService = Preconditions
44                 .checkNotNull(experimenterMessageService, "SalExperimenterMessageService can not be null!");
45     }
46
47     @Override
48     public Future<RpcResult<Void>> controlBundle(ControlBundleInput input) {
49         final SendExperimenterInputBuilder experimenterInputBuilder = new SendExperimenterInputBuilder();
50         experimenterInputBuilder.setNode(input.getNode());
51         experimenterInputBuilder.setExperimenterMessageOfChoice(
52                 new BundleControlSalBuilder().setSalControlData(new SalControlDataBuilder(input).build()).build());
53         return experimenterMessageService.sendExperimenter(experimenterInputBuilder.build());
54     }
55
56     @Override
57     public Future<RpcResult<Void>> addBundleMessages(AddBundleMessagesInput input) {
58         final List<ListenableFuture<RpcResult<Void>>> partialResults = new ArrayList<>();
59         final SendExperimenterInputBuilder experimenterInputBuilder = new SendExperimenterInputBuilder();
60         final BundleAddMessageSalBuilder bundleAddMessageBuilder = new BundleAddMessageSalBuilder();
61         final SalAddMessageDataBuilder dataBuilder = new SalAddMessageDataBuilder();
62         experimenterInputBuilder.setNode(input.getNode());
63         dataBuilder.setNode(input.getNode());
64         dataBuilder.setBundleId(input.getBundleId());
65         dataBuilder.setFlags(input.getFlags());
66         dataBuilder.setBundleProperty(input.getBundleProperty());
67         for (Message message : input.getMessages().getMessage()) {
68             dataBuilder.setBundleInnerMessage(message.getBundleInnerMessage());
69             experimenterInputBuilder.setExperimenterMessageOfChoice(
70                     bundleAddMessageBuilder.setSalAddMessageData(dataBuilder.build()).build());
71             ListenableFuture<RpcResult<Void>> res = JdkFutureAdapters
72                     .listenInPoolThread(experimenterMessageService.sendExperimenter(experimenterInputBuilder.build()));
73             partialResults.add(res);
74         }
75         return processResults(partialResults);
76     }
77
78     private static Future<RpcResult<Void>> processResults(
79             final List<ListenableFuture<RpcResult<Void>>> partialResults) {
80         final SettableFuture<RpcResult<Void>> result = SettableFuture.create();
81         Futures.addCallback(Futures.successfulAsList(partialResults), new FutureCallback<List<RpcResult<Void>>>() {
82             @Override
83             public void onSuccess(List<RpcResult<Void>> results) {
84                 final ArrayList<RpcError> errors = new ArrayList<>();
85                 final RpcResultBuilder<Void> rpcResultBuilder;
86                 for (RpcResult<Void> res : results) {
87                     if (res == null) {
88                         errors.add(RpcResultBuilder.newError(RpcError.ErrorType.APPLICATION, "BundleExtensionService",
89                                                              "RpcResult is null."));
90                     } else if (!res.isSuccessful()) {
91                         errors.addAll(res.getErrors());
92                     }
93                 }
94                 if (errors.isEmpty()) {
95                     rpcResultBuilder = RpcResultBuilder.success();
96                 } else {
97                     rpcResultBuilder = RpcResultBuilder.<Void>failed().withRpcErrors(errors);
98                 }
99                 result.set(rpcResultBuilder.build());
100             }
101
102             @Override
103             public void onFailure(Throwable throwable) {
104                 RpcResultBuilder<Void> rpcResultBuilder = RpcResultBuilder.failed();
105                 result.set(rpcResultBuilder.build());
106             }
107         }, MoreExecutors.directExecutor());
108         return result;
109     }
110 }