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