2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.sample.toaster.provider;
10 import java.util.Collections;
11 import java.util.concurrent.Callable;
12 import java.util.concurrent.ExecutorService;
13 import java.util.concurrent.Executors;
14 import java.util.concurrent.Future;
15 import java.util.concurrent.atomic.AtomicLong;
17 import org.opendaylight.controller.config.yang.config.toaster_provider.impl.ToasterProviderRuntimeMXBean;
18 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
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;
34 import com.google.common.util.concurrent.Futures;
36 public class OpendaylightToaster implements ToasterData, ToasterService, ToasterProviderRuntimeMXBean {
38 private static final Logger log = LoggerFactory.getLogger(OpendaylightToaster.class);
40 private static final DisplayString toasterManufacturer = new DisplayString("Opendaylight");
41 private static final DisplayString toasterModelNumber = new DisplayString("Model 1 - Binding Aware");
42 private final ToasterStatus toasterStatus;
44 private NotificationProviderService notificationProvider;
45 private final ExecutorService executor;
47 private Future<RpcResult<Void>> currentTask;
49 public OpendaylightToaster() {
50 toasterStatus = ToasterStatus.Down;
51 executor = Executors.newFixedThreadPool(1);
55 public Toaster getToaster() {
56 ToasterBuilder tb = new ToasterBuilder();
58 .setToasterManufacturer(toasterManufacturer) //
59 .setToasterModelNumber(toasterModelNumber) //
60 .setToasterStatus(toasterStatus);
66 public Future<RpcResult<Void>> cancelToast() {
67 if (currentTask != null) {
74 public Future<RpcResult<Void>> makeToast(MakeToastInput input) {
75 // TODO Auto-generated method stub
76 log.trace("makeToast - Received input for toast");
78 if (currentTask != null) {
79 return inProgressError();
81 currentTask = executor.submit(new MakeToastTask(input));
85 private Future<RpcResult<Void>> inProgressError() {
86 RpcResult<Void> result = Rpcs.<Void> getRpcResult(false, null, Collections.<RpcError> emptySet());
87 return Futures.immediateFuture(result);
90 private void cancelToastImpl() {
91 currentTask.cancel(true);
92 ToastDoneBuilder toastDone = new ToastDoneBuilder();
93 toastDone.setToastStatus(ToastStatus.Cancelled);
94 notificationProvider.publish(toastDone.build());
97 public void setNotificationProvider(NotificationProviderService salService) {
98 this.notificationProvider = salService;
101 private void logToastInput(MakeToastInput input) {
102 String toastType = input.getToasterToastType().getName();
103 String toastDoneness = input.getToasterDoneness().toString();
104 log.trace("Toast: {} doneness: {}", toastType, toastDoneness);
107 private final AtomicLong toastsMade = new AtomicLong(0);
110 public Long getToastsMade() {
111 return toastsMade.get();
114 private class MakeToastTask implements Callable<RpcResult<Void>> {
116 final MakeToastInput toastRequest;
118 public MakeToastTask(MakeToastInput toast) {
119 toastRequest = toast;
123 public RpcResult<Void> call() throws Exception {
126 ToastDoneBuilder notifyBuilder = new ToastDoneBuilder();
127 notifyBuilder.setToastStatus(ToastStatus.Done);
128 notificationProvider.publish(notifyBuilder.build());
129 log.trace("Toast Done");
130 logToastInput(toastRequest);
133 toastsMade.incrementAndGet();
135 return Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());