/**
* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.openflowplugin.openflow.md.core;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.opendaylight.openflowplugin.openflow.md.core.sal.OFRpcTask;
import org.opendaylight.openflowplugin.api.openflow.statistics.MessageSpy;
import org.opendaylight.yangtools.yang.binding.DataContainer;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
/**
*
*/
public class RpcListeningExecutorService implements ListeningExecutorService {
private MessageSpy<DataContainer> messageSpy;
private ListeningExecutorService executorServiceDelegate;
private DataContainer notSupportedTask = new NoDataContainerTask();
/**
* @param executorService executor service
*/
public RpcListeningExecutorService(ListeningExecutorService executorService) {
this.executorServiceDelegate = executorService;
}
/**
* @param messageSpy the messageSpy to set
*/
public void setMessageSpy(MessageSpy<DataContainer> messageSpy) {
this.messageSpy = messageSpy;
}
@Override
public void shutdown() {
executorServiceDelegate.shutdown();
}
@Override
public <T> ListenableFuture<T> submit(Callable<T> task) {
ListenableFuture<T> resultFuture = executorServiceDelegate.submit(task);
boolean covered = false;
if (task instanceof OFRpcTask<?, ?>) {
if (((OFRpcTask<?, ?>) task).getInput() instanceof DataContainer) {
messageSpy.spyMessage((DataContainer) ((OFRpcTask<?, ?>) task).getInput(),
MessageSpy.STATISTIC_GROUP.TO_SWITCH_ENQUEUED_SUCCESS);
covered = true;
}
}
if (! covered) {
messageSpy.spyMessage(notSupportedTask, MessageSpy.STATISTIC_GROUP.TO_SWITCH_ENQUEUED_FAILED);
}
return resultFuture;
}
@Override
public ListenableFuture<?> submit(Runnable task) {
throw new IllegalAccessError("not supported");
}
@Override
public <T> ListenableFuture<T> submit(Runnable task, T result) {
throw new IllegalAccessError("not supported");
}
@Override
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException {
return executorServiceDelegate.invokeAll(tasks);
}
@Override
public <T> List<Future<T>> invokeAll(
Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
throws InterruptedException {
return executorServiceDelegate.invokeAll(tasks, timeout, unit);
}
@Override
public void execute(Runnable command) {
throw new IllegalAccessError("not supported");
}
@Override
public List<Runnable> shutdownNow() {
return executorServiceDelegate.shutdownNow();
}
@Override
public boolean isShutdown() {
return executorServiceDelegate.isShutdown();
}
@Override
public boolean isTerminated() {
return executorServiceDelegate.isTerminated();
}
@Override
public boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException {
return executorServiceDelegate.awaitTermination(timeout, unit);
}
@Override
public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException {
throw new IllegalAccessError("not supported");
}
@Override
public <T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit) throws InterruptedException,
ExecutionException, TimeoutException {
throw new IllegalAccessError("not supported");
}
protected static class NoDataContainerTask implements DataContainer {
@Override
public Class<? extends DataContainer> getImplementedInterface() {
return null;
}
}
}