package org.opendaylight.openflowplugin.impl.statistics.services.dedicated;
import com.google.common.base.Function;
+import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.JdkFutureAdapters;
import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
import java.util.List;
import java.util.concurrent.Future;
+import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue;
+import org.opendaylight.openflowplugin.api.openflow.connection.OutboundQueueProvider;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yangtools.yang.common.RpcError;
import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public Future<RpcResult<List<MultipartReply>>> getStatisticsOfType(final MultipartType type) {
- return handleServiceCall(
- PRIMARY_CONNECTION, new Function<DataCrate<List<MultipartReply>>, ListenableFuture<RpcResult<Void>>>() {
+ return handleServiceCall( new Function<DataCrate<List<MultipartReply>>, ListenableFuture<RpcResult<Void>>>() {
@Override
public ListenableFuture<RpcResult<Void>> apply(final DataCrate<List<MultipartReply>> data) {
-
- LOG.info("Calling multipart request for type {}", type);
final Xid xid = data.getRequestContext().getXid();
- deviceContext.hookRequestCtx(xid, data.getRequestContext());
+ final DeviceContext deviceContext = getDeviceContext();
deviceContext.getOpenflowMessageListenerFacade().registerMultipartXid(xid.getValue());
MultipartRequestInput multipartRequestInput = MultipartRequestInputFactory.
makeMultipartRequestInput(xid.getValue(),
- version,
+ getVersion(),
type);
- final Future<RpcResult<Void>> resultFromOFLib = deviceContext.getPrimaryConnectionContext()
- .getConnectionAdapter().multipartRequest(multipartRequestInput);
- return JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+ final OutboundQueue outboundQueue = deviceContext.getPrimaryConnectionContext().getOutboundQueueProvider().getOutboundQueue();
+ final SettableFuture<RpcResult<Void>> settableFuture = SettableFuture.create();
+ synchronized (outboundQueue){
+ outboundQueue.commitEntry(xid.getValue(), multipartRequestInput, new FutureCallback<OfHeader>() {
+ @Override
+ public void onSuccess(final OfHeader ofHeader) {
+ settableFuture.set(RpcResultBuilder.<Void>success().build());
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ RpcResultBuilder rpcResultBuilder = RpcResultBuilder.<Void>failed().withError(RpcError.ErrorType.APPLICATION, throwable.getMessage());
+ settableFuture.set(rpcResultBuilder.build());
+ }
+ });
+ }
+ return settableFuture;
}
}