/**
* Copyright (c) 2015 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.impl.services;
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.FutureCallback;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.opendaylight.openflowjava.protocol.api.connection.DeviceRequestFailedException;
import org.opendaylight.openflowplugin.api.openflow.device.RequestContext;
import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.EventIdentifier;
import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy;
import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy.STATISTIC_GROUP;
import org.opendaylight.openflowplugin.impl.services.util.RequestContextUtil;
import org.opendaylight.openflowplugin.impl.statistics.ofpspecific.EventsTimeCounter;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Error;
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;
public abstract class AbstractRequestCallback<T> implements FutureCallback<OfHeader> {
private final RequestContext<T> context;
private final Class<?> requestType;
private final MessageSpy spy;
private EventIdentifier eventIdentifier;
protected AbstractRequestCallback(final RequestContext<T> context,
final Class<?> requestType,
final MessageSpy spy,
final EventIdentifier eventIdentifier) {
this.context = Preconditions.checkNotNull(context);
this.requestType = Preconditions.checkNotNull(requestType);
this.spy = Preconditions.checkNotNull(spy);
this.eventIdentifier = eventIdentifier;
}
protected final void setResult(@Nullable final RpcResult<T> result) {
context.setResult(result);
context.close();
}
protected final void spyMessage(@Nonnull final STATISTIC_GROUP group) {
spy.spyMessage(requestType, Preconditions.checkNotNull(group));
}
public EventIdentifier getEventIdentifier() {
return eventIdentifier;
}
@Override
public final void onFailure(@Nonnull final Throwable t) {
final RpcResultBuilder<T> builder;
if (null != eventIdentifier) {
EventsTimeCounter.markEnd(eventIdentifier);
}
if (t instanceof DeviceRequestFailedException) {
final Error err = ((DeviceRequestFailedException) t).getError();
final String errorString = String.format("Device reported error type %s code %s", err.getTypeString(), err.getCodeString());
builder = RpcResultBuilder.<T>failed().withError(RpcError.ErrorType.APPLICATION, errorString, t);
spyMessage(MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE);
} else {
builder = RpcResultBuilder.<T>failed().withError(RpcError.ErrorType.APPLICATION, t.getMessage(), t);
spyMessage(MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_ERROR);
}
context.setResult(builder.build());
RequestContextUtil.closeRequestContext(context);
}
}