d8faf06d5f501c650f7977d2aeaeade0ec715a89
[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 com.google.common.util.concurrent.ListenableFuture;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsInput;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsOutput;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsInput;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsOutput;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsInput;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsOutput;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsInput;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsOutput;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsInput;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsOutput;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.OpendaylightDirectStatisticsService;
23 import org.opendaylight.yangtools.yang.binding.DataObject;
24 import org.opendaylight.yangtools.yang.common.RpcError;
25 import org.opendaylight.yangtools.yang.common.RpcResult;
26 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
27
28 /**
29  * The Opendaylight direct statistics service.
30  * This service handles RPC requests, sends them to registered handlers and returns their replies.
31  */
32 public class OpendaylightDirectStatisticsServiceImpl implements OpendaylightDirectStatisticsService {
33     private final OpendaylightDirectStatisticsServiceProvider provider;
34
35     /**
36      * Instantiates a new Opendaylight direct statistics service.
37      *
38      * @param provider the openflow direct statistics service provider
39      */
40     public OpendaylightDirectStatisticsServiceImpl(final OpendaylightDirectStatisticsServiceProvider provider) {
41         this.provider = provider;
42     }
43
44     @Override
45     @SuppressWarnings("unchecked")
46     public ListenableFuture<RpcResult<GetGroupStatisticsOutput>> getGroupStatistics(GetGroupStatisticsInput input) {
47         return provider.lookup(AbstractGroupDirectStatisticsService.class)
48                 .map(service -> service.handleAndReply(input))
49                 .orElse(missingImplementation(AbstractGroupDirectStatisticsService.class));
50     }
51
52     @Override
53     @SuppressWarnings("unchecked")
54     public ListenableFuture<RpcResult<GetQueueStatisticsOutput>> getQueueStatistics(GetQueueStatisticsInput input) {
55         return provider.lookup(AbstractQueueDirectStatisticsService.class)
56                 .map(service -> service.handleAndReply(input))
57                 .orElse(missingImplementation(AbstractQueueDirectStatisticsService.class));
58     }
59
60     @Override
61     @SuppressWarnings("unchecked")
62     public ListenableFuture<RpcResult<GetFlowStatisticsOutput>> getFlowStatistics(GetFlowStatisticsInput input) {
63         return provider.lookup(AbstractFlowDirectStatisticsService.class)
64                 .map(service -> service.handleAndReply(input))
65                 .orElse(missingImplementation(AbstractFlowDirectStatisticsService.class));
66     }
67
68     @Override
69     @SuppressWarnings("unchecked")
70     public ListenableFuture<RpcResult<GetMeterStatisticsOutput>> getMeterStatistics(GetMeterStatisticsInput input) {
71         return provider.lookup(AbstractMeterDirectStatisticsService.class)
72                 .map(service -> service.handleAndReply(input))
73                 .orElse(missingImplementation(AbstractMeterDirectStatisticsService.class));
74     }
75
76     @Override
77     @SuppressWarnings("unchecked")
78     public ListenableFuture<RpcResult<GetNodeConnectorStatisticsOutput>>
79             getNodeConnectorStatistics(GetNodeConnectorStatisticsInput input) {
80         return provider.lookup(AbstractPortDirectStatisticsService.class)
81                 .map(service -> service.handleAndReply(input))
82                 .orElse(missingImplementation(AbstractPortDirectStatisticsService.class));
83     }
84
85     private static <T extends DataObject> ListenableFuture<RpcResult<T>> missingImplementation(Class service) {
86         return RpcResultBuilder.<T>failed().withError(
87                 RpcError.ErrorType.APPLICATION,
88                 String.format("No implementation found for direct statistics service %s.", service.getCanonicalName()))
89                 .buildFuture();
90     }
91 }