Merge "Bug 6050 - TcpSrcCodec is not maskable"
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / statistics / services / direct / OpendaylightDirectStatisticsServiceImpl.java
1 /*
2  * Copyright (c) 2015 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
9 package org.opendaylight.openflowplugin.impl.statistics.services.direct;
10
11 import java.util.Optional;
12 import java.util.concurrent.Future;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsInput;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsOutput;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsInput;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsOutput;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsInput;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsOutput;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsInput;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsOutput;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsInput;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsOutput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.OpendaylightDirectStatisticsService;
24 import org.opendaylight.yangtools.yang.binding.DataObject;
25 import org.opendaylight.yangtools.yang.common.RpcError;
26 import org.opendaylight.yangtools.yang.common.RpcResult;
27 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
28
29 /**
30  * The Opendaylight direct statistics service.
31  * This service handles RPC requests, sends them to registered handlers and returns their replies.
32  */
33 public class OpendaylightDirectStatisticsServiceImpl implements OpendaylightDirectStatisticsService {
34     private final OpendaylightDirectStatisticsServiceProvider provider;
35
36     /**
37      * Instantiates a new Opendaylight direct statistics service.
38      *
39      * @param provider the openflow direct statistics service provider
40      */
41     public OpendaylightDirectStatisticsServiceImpl(final OpendaylightDirectStatisticsServiceProvider provider) {
42         this.provider = provider;
43     }
44
45     @Override
46     public Future<RpcResult<GetGroupStatisticsOutput>> getGroupStatistics(GetGroupStatisticsInput input) {
47         final Optional<GroupDirectStatisticsService> service = provider.lookup(GroupDirectStatisticsService.class);
48
49         if (!service.isPresent()) {
50             return missingImplementation(GroupDirectStatisticsService.class);
51         }
52
53         return service.get().handleAndReply(input);
54     }
55
56     @Override
57     public Future<RpcResult<GetQueueStatisticsOutput>> getQueueStatistics(GetQueueStatisticsInput input) {
58         final Optional<QueueDirectStatisticsService> service = provider.lookup(QueueDirectStatisticsService.class);
59
60         if (!service.isPresent()) {
61             return missingImplementation(QueueDirectStatisticsService.class);
62         }
63
64         return service.get().handleAndReply(input);
65     }
66
67     @Override
68     public Future<RpcResult<GetFlowStatisticsOutput>> getFlowStatistics(GetFlowStatisticsInput input) {
69         final Optional<FlowDirectStatisticsService> service = provider.lookup(FlowDirectStatisticsService.class);
70
71         if (!service.isPresent()) {
72             return missingImplementation(FlowDirectStatisticsService.class);
73         }
74
75         return service.get().handleAndReply(input);
76     }
77
78     @Override
79     public Future<RpcResult<GetMeterStatisticsOutput>> getMeterStatistics(GetMeterStatisticsInput input) {
80         final Optional<MeterDirectStatisticsService> service = provider.lookup(MeterDirectStatisticsService.class);
81
82         if (!service.isPresent()) {
83             return missingImplementation(MeterDirectStatisticsService.class);
84         }
85
86         return service.get().handleAndReply(input);
87     }
88
89     @Override
90     public Future<RpcResult<GetNodeConnectorStatisticsOutput>> getNodeConnectorStatistics(GetNodeConnectorStatisticsInput input) {
91         final Optional<NodeConnectorDirectStatisticsService> service = provider.lookup(NodeConnectorDirectStatisticsService.class);
92
93         if (!service.isPresent()) {
94             return missingImplementation(NodeConnectorDirectStatisticsService.class);
95         }
96
97         return service.get().handleAndReply(input);
98     }
99
100     private <T extends DataObject> Future<RpcResult<T>> missingImplementation(Class service) {
101         return RpcResultBuilder.<T>failed().withError(
102                 RpcError.ErrorType.APPLICATION,
103                 String.format("No implementation found for direct statistics service %s.", service.getCanonicalName()))
104                 .buildFuture();
105     }
106 }