Added sample provider and consumer for MD SAL
[controller.git] / opendaylight / sal / yang-prototype / sal / samples / toaster-provider / src / main / java / org / opendaylight / controller / sample / toaster / provider / OpendaylightToaster.java
diff --git a/opendaylight/sal/yang-prototype/sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java b/opendaylight/sal/yang-prototype/sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java
new file mode 100644 (file)
index 0000000..404734b
--- /dev/null
@@ -0,0 +1,118 @@
+package org.opendaylight.controller.sample.toaster.provider;
+
+import java.util.Collections;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
+import org.opendaylight.controller.sal.common.util.Futures;
+import org.opendaylight.controller.sal.common.util.Rpcs;
+import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev20091120.DisplayString;
+import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev20091120.MakeToastInput;
+import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev20091120.ToastDone.ToastStatus;
+import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev20091120.ToastDoneBuilder;
+import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev20091120.Toaster;
+import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev20091120.Toaster.ToasterStatus;
+import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev20091120.ToasterBuilder;
+import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev20091120.ToasterData;
+import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev20091120.ToasterService;
+import org.opendaylight.yangtools.yang.common.RpcError;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OpendaylightToaster implements ToasterData, ToasterService {
+
+    private static final Logger log = LoggerFactory.getLogger(OpendaylightToaster.class);
+
+    private static final DisplayString toasterManufacturer = new DisplayString("Opendaylight");
+    private static final DisplayString toasterModelNumber = new DisplayString("Model 1 - Binding Aware");
+    private ToasterStatus toasterStatus;
+
+    private NotificationProviderService notificationProvider;
+    private final ExecutorService executor;
+
+    private Future<RpcResult<Void>> currentTask;
+
+    public OpendaylightToaster() {
+        toasterStatus = ToasterStatus.Down;
+        executor = Executors.newFixedThreadPool(1);
+    }
+
+    @Override
+    public Toaster getToaster() {
+        ToasterBuilder tb = new ToasterBuilder();
+        tb //
+        .setToasterManufacturer(toasterManufacturer) //
+                .setToasterModelNumber(toasterModelNumber) //
+                .setToasterStatus(toasterStatus);
+
+        return tb.build();
+    }
+
+    @Override
+    public Future<RpcResult<Void>> cancelToast() {
+        if (currentTask != null) {
+            cancelToastImpl();
+        }
+        return null;
+    }
+
+    @Override
+    public Future<RpcResult<Void>> makeToast(MakeToastInput input) {
+        // TODO Auto-generated method stub
+        log.info("makeToast - Received input for toast");
+        logToastInput(input);
+        if (currentTask != null) {
+            return inProgressError();
+        }
+        currentTask = executor.submit(new MakeToastTask(input));
+        return currentTask;
+    }
+
+    private Future<RpcResult<Void>> inProgressError() {
+        RpcResult<Void> result = Rpcs.<Void> getRpcResult(false, null, Collections.<RpcError> emptySet());
+        return Futures.immediateFuture(result);
+    }
+
+    private void cancelToastImpl() {
+        currentTask.cancel(true);
+        ToastDoneBuilder toastDone = new ToastDoneBuilder();
+        toastDone.setToastStatus(ToastStatus.Cancelled);
+        notificationProvider.notify(toastDone.build());
+    }
+
+    public void setNotificationProvider(NotificationProviderService salService) {
+        this.notificationProvider = salService;
+    }
+
+    private void logToastInput(MakeToastInput input) {
+        String toastType = input.getToasterToastType().getName();
+        String toastDoneness = input.getToasterDoneness().toString();
+        log.info("Toast: {} doneness: {}", toastType, toastDoneness);
+    }
+
+    private class MakeToastTask implements Callable<RpcResult<Void>> {
+
+        final MakeToastInput toastRequest;
+
+        public MakeToastTask(MakeToastInput toast) {
+            toastRequest = toast;
+        }
+
+        @Override
+        public RpcResult<Void> call() throws Exception {
+            Thread.sleep(1000);
+
+            ToastDoneBuilder notifyBuilder = new ToastDoneBuilder();
+            notifyBuilder.setToastStatus(ToastStatus.Done);
+            notificationProvider.notify(notifyBuilder.build());
+            log.info("Toast Done");
+            logToastInput(toastRequest);
+            return Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());
+        }
+    }
+}