Merge "Enhance debug capabilities"
[controller.git] / opendaylight / md-sal / samples / toaster-provider / src / main / java / org / opendaylight / controller / sample / toaster / provider / OpendaylightToaster.java
1 package org.opendaylight.controller.sample.toaster.provider;
2
3 import java.util.Collections;
4
5 import java.util.concurrent.Callable;
6 import java.util.concurrent.ExecutorService;
7 import java.util.concurrent.Executors;
8 import java.util.concurrent.Future;
9
10 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
11 import org.opendaylight.controller.sal.common.util.Futures;
12 import org.opendaylight.controller.sal.common.util.Rpcs;
13 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.DisplayString;
14 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.MakeToastInput;
15 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToastDone.ToastStatus;
16 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToastDoneBuilder;
17 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.Toaster;
18 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.Toaster.ToasterStatus;
19 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterBuilder;
20 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterData;
21 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterService;
22 import org.opendaylight.yangtools.yang.common.RpcError;
23 import org.opendaylight.yangtools.yang.common.RpcResult;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 public class OpendaylightToaster implements ToasterData, ToasterService {
28
29     private static final Logger log = LoggerFactory.getLogger(OpendaylightToaster.class);
30
31     private static final DisplayString toasterManufacturer = new DisplayString("Opendaylight");
32     private static final DisplayString toasterModelNumber = new DisplayString("Model 1 - Binding Aware");
33     private ToasterStatus toasterStatus;
34
35     private NotificationProviderService notificationProvider;
36     private final ExecutorService executor;
37
38     private Future<RpcResult<Void>> currentTask;
39
40     public OpendaylightToaster() {
41         toasterStatus = ToasterStatus.Down;
42         executor = Executors.newFixedThreadPool(1);
43     }
44
45     @Override
46     public Toaster getToaster() {
47         ToasterBuilder tb = new ToasterBuilder();
48         tb //
49         .setToasterManufacturer(toasterManufacturer) //
50                 .setToasterModelNumber(toasterModelNumber) //
51                 .setToasterStatus(toasterStatus);
52
53         return tb.build();
54     }
55
56     @Override
57     public Future<RpcResult<Void>> cancelToast() {
58         if (currentTask != null) {
59             cancelToastImpl();
60         }
61         return null;
62     }
63
64     @Override
65     public Future<RpcResult<Void>> makeToast(MakeToastInput input) {
66         // TODO Auto-generated method stub
67         log.info("makeToast - Received input for toast");
68         logToastInput(input);
69         if (currentTask != null) {
70             return inProgressError();
71         }
72         currentTask = executor.submit(new MakeToastTask(input));
73         return currentTask;
74     }
75
76     private Future<RpcResult<Void>> inProgressError() {
77         RpcResult<Void> result = Rpcs.<Void> getRpcResult(false, null, Collections.<RpcError> emptySet());
78         return Futures.immediateFuture(result);
79     }
80
81     private void cancelToastImpl() {
82         currentTask.cancel(true);
83         ToastDoneBuilder toastDone = new ToastDoneBuilder();
84         toastDone.setToastStatus(ToastStatus.Cancelled);
85         notificationProvider.notify(toastDone.build());
86     }
87
88     public void setNotificationProvider(NotificationProviderService salService) {
89         this.notificationProvider = salService;
90     }
91
92     private void logToastInput(MakeToastInput input) {
93         String toastType = input.getToasterToastType().getName();
94         String toastDoneness = input.getToasterDoneness().toString();
95         log.info("Toast: {} doneness: {}", toastType, toastDoneness);
96     }
97
98     private class MakeToastTask implements Callable<RpcResult<Void>> {
99
100         final MakeToastInput toastRequest;
101
102         public MakeToastTask(MakeToastInput toast) {
103             toastRequest = toast;
104         }
105
106         @Override
107         public RpcResult<Void> call() throws Exception {
108             Thread.sleep(1000);
109
110             ToastDoneBuilder notifyBuilder = new ToastDoneBuilder();
111             notifyBuilder.setToastStatus(ToastStatus.Done);
112             notificationProvider.notify(notifyBuilder.build());
113             log.info("Toast Done");
114             logToastInput(toastRequest);
115             currentTask = null;
116             return Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());
117         }
118     }
119 }