Decompose RPC implementation classes
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / services / sal / UpdateMetersBatchImpl.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. 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 package org.opendaylight.openflowplugin.impl.services.sal;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.util.concurrent.Futures;
13 import com.google.common.util.concurrent.ListenableFuture;
14 import com.google.common.util.concurrent.MoreExecutors;
15 import java.util.stream.Collectors;
16 import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
17 import org.opendaylight.openflowplugin.impl.util.MeterUtil;
18 import org.opendaylight.openflowplugin.impl.util.PathUtil;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeter;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInputBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.OriginalMeterBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeterBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterRef;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.BatchMeterInputUpdateGrouping;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatch;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchOutput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMeters;
32 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
33 import org.opendaylight.yangtools.yang.common.RpcResult;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 public final class UpdateMetersBatchImpl implements UpdateMetersBatch {
38     private static final Logger LOG = LoggerFactory.getLogger(UpdateMetersBatchImpl.class);
39
40     private final UpdateMeter updateMeter;
41     private final SendBarrier sendBarrier;
42
43     public UpdateMetersBatchImpl(final UpdateMeter updateMeter, final SendBarrier sendBarrier) {
44         this.updateMeter = requireNonNull(updateMeter);
45         this.sendBarrier = requireNonNull(sendBarrier);
46     }
47
48     @Override
49     public ListenableFuture<RpcResult<UpdateMetersBatchOutput>> invoke(final UpdateMetersBatchInput input) {
50         final var batchUpdateMeters = input.nonnullBatchUpdateMeters();
51         if (LOG.isTraceEnabled()) {
52             LOG.trace("Updating meters @ {} : {}", PathUtil.extractNodeId(input.getNode()), batchUpdateMeters.size());
53         }
54
55         final var resultsLot = batchUpdateMeters.stream()
56             .map(batchMeter -> updateMeter.invoke(new UpdateMeterInputBuilder(input)
57                 .setOriginalMeter(new OriginalMeterBuilder(batchMeter.getOriginalBatchedMeter()).build())
58                 .setUpdatedMeter(new UpdatedMeterBuilder(batchMeter.getUpdatedBatchedMeter()).build())
59                 .setMeterRef(createMeterRef(input.getNode(), batchMeter))
60                 .setNode(input.getNode())
61                 .build()))
62             .collect(Collectors.toList());
63
64         final var meters = batchUpdateMeters.stream()
65                 .map(BatchMeterInputUpdateGrouping::getUpdatedBatchedMeter)
66                 .collect(Collectors.toList());
67
68         final var commonResult = Futures.transform(Futures.allAsList(resultsLot),
69             MeterUtil.createCumulativeFunction(meters, batchUpdateMeters.size()), MoreExecutors.directExecutor());
70
71         final var updateMetersBulkFuture = Futures.transform(commonResult, MeterUtil.METER_UPDATE_TRANSFORM,
72             MoreExecutors.directExecutor());
73
74         return input.getBarrierAfter()
75             ? BarrierUtil.chainBarrier(updateMetersBulkFuture, input.getNode(), sendBarrier,
76                 MeterUtil.METER_UPDATE_COMPOSING_TRANSFORM)
77             : updateMetersBulkFuture;
78     }
79
80     private static MeterRef createMeterRef(final NodeRef nodeRef, final BatchUpdateMeters batchMeter) {
81         return MeterUtil.buildMeterPath((InstanceIdentifier<Node>) nodeRef.getValue(),
82                 batchMeter.getUpdatedBatchedMeter().getMeterId());
83     }
84 }