/**
* 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.device.listener;
import com.google.common.base.Preconditions;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.opendaylight.openflowplugin.api.openflow.device.RequestContext;
import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceReplyProcessor;
import org.opendaylight.openflowplugin.api.openflow.device.handlers.MultiMsgCollector;
import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.EventIdentifier;
import org.opendaylight.openflowplugin.impl.statistics.ofpspecific.EventsTimeCounter;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <p>
* Implementation for {@link MultiMsgCollector} interface
*
* @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
* @author <a href="mailto:tkubas@cisco.com">Timotej Kubas</a>
* </p>
* Created: Mar 23, 2015
*/
public class MultiMsgCollectorImpl<T extends OfHeader> implements MultiMsgCollector<T> {
private static final Logger LOG = LoggerFactory.getLogger(MultiMsgCollectorImpl.class);
private final List<T> replyCollection = new ArrayList<>();
private final RequestContext<List<T>> requestContext;
private final DeviceReplyProcessor deviceReplyProcessor;
public MultiMsgCollectorImpl(final DeviceReplyProcessor deviceReplyProcessor, final RequestContext<List<T>> requestContext) {
this.deviceReplyProcessor = Preconditions.checkNotNull(deviceReplyProcessor);
this.requestContext = Preconditions.checkNotNull(requestContext);
}
@Override
public void addMultipartMsg(@Nonnull final T reply, final boolean reqMore, @Nullable final EventIdentifier eventIdentifier) {
Preconditions.checkNotNull(reply);
Preconditions.checkNotNull(requestContext.getXid());
Preconditions.checkArgument(requestContext.getXid().getValue().equals(reply.getXid()));
LOG.trace("Try to add Multipart reply msg with XID {}", reply.getXid());
replyCollection.add(reply);
if (!reqMore) {
endCollecting(eventIdentifier);
}
}
@Override
public void endCollecting(@Nullable final EventIdentifier eventIdentifier) {
final RpcResult<List<T>> rpcResult = RpcResultBuilder.success(replyCollection).build();
if (Objects.nonNull(eventIdentifier)) {
EventsTimeCounter.markEnd(eventIdentifier);
}
requestContext.setResult(rpcResult);
requestContext.close();
deviceReplyProcessor.processReply(requestContext.getXid(), replyCollection);
}
}