import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function;
import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.JdkFutureAdapters;
import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
import java.util.ArrayList;
import java.util.List;
-import java.util.concurrent.Future;
-import javax.annotation.Nullable;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatchOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatchOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.flat.batch.add.flow._case.FlatBatchAddFlow;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
/**
- * transform between FlatBatch API and flow batch API
+ * Transform between FlatBatch API and flow batch API.
*/
-public class FlatBatchFlowAdapters {
+public final class FlatBatchFlowAdapters {
private FlatBatchFlowAdapters() {
- throw new IllegalStateException("This class should not be instantiated.");
}
/**
+ * Adapt flat batch add flow.
* @param planStep batch step containing changes of the same type
* @param node pointer for RPC routing
- * @return input suitable for {@link org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.SalFlowsBatchService#addFlowsBatch(AddFlowsBatchInput)}
+ * @return input suitable for {@link org.opendaylight.yang.gen.v1.urn
+ * .opendaylight.flows.service.rev160314.SalFlowsBatchService#addFlowsBatch(AddFlowsBatchInput)}
*/
public static AddFlowsBatchInput adaptFlatBatchAddFlow(final BatchPlanStep planStep, final NodeRef node) {
final List<BatchAddFlows> batchFlows = new ArrayList<>();
}
/**
+ * Adapt flat batch remove flow.
* @param planStep batch step containing changes of the same type
* @param node pointer for RPC routing
- * @return input suitable for {@link org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.SalFlowsBatchService#removeFlowsBatch(RemoveFlowsBatchInput)}
+ * @return input suitable for {@link org.opendaylight.yang.gen.v1.urn
+ * .opendaylight.flows.service.rev160314.SalFlowsBatchService#removeFlowsBatch(RemoveFlowsBatchInput)}
*/
public static RemoveFlowsBatchInput adaptFlatBatchRemoveFlow(final BatchPlanStep planStep, final NodeRef node) {
final List<BatchRemoveFlows> batchFlows = new ArrayList<>();
}
/**
+ * Adapt flat batch update flow.
* @param planStep batch step containing changes of the same type
* @param node pointer for RPC routing
- * @return input suitable for {@link org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.SalFlowsBatchService#updateFlowsBatch(UpdateFlowsBatchInput)}
+ * @return input suitable for {@link org.opendaylight.yang.gen.v1.urn
+ * .opendaylight.flows.service.rev160314.SalFlowsBatchService#updateFlowsBatch(UpdateFlowsBatchInput)}
*/
public static UpdateFlowsBatchInput adaptFlatBatchUpdateFlow(final BatchPlanStep planStep, final NodeRef node) {
final List<BatchUpdateFlows> batchFlows = new ArrayList<>();
}
/**
+ * Convert batch result.
* @param stepOffset offset of current batch plan step
- * @return next chained result incorporating results of this step's batch
+ * @return converted {@link ProcessFlatBatchOutput} RPC result
*/
@VisibleForTesting
static <T extends BatchFlowOutputListGrouping> Function<RpcResult<T>, RpcResult<ProcessFlatBatchOutput>>
- createBatchFlowChainingFunction(final int stepOffset) {
- return new Function<RpcResult<T>, RpcResult<ProcessFlatBatchOutput>>() {
- @Nullable
- @Override
- public RpcResult<ProcessFlatBatchOutput> apply(@Nullable final RpcResult<T> input) {
- List<BatchFailure> batchFailures = wrapBatchFlowFailuresForFlat(input, stepOffset);
- ProcessFlatBatchOutputBuilder outputBuilder = new ProcessFlatBatchOutputBuilder().setBatchFailure(batchFailures);
- return RpcResultBuilder.<ProcessFlatBatchOutput>status(input.isSuccessful())
- .withRpcErrors(input.getErrors())
- .withResult(outputBuilder.build())
- .build();
- }
+ convertBatchFlowResult(final int stepOffset) {
+ return input -> {
+ List<BatchFailure> batchFailures = wrapBatchFlowFailuresForFlat(input, stepOffset);
+ ProcessFlatBatchOutputBuilder outputBuilder =
+ new ProcessFlatBatchOutputBuilder().setBatchFailure(batchFailures);
+ return RpcResultBuilder.<ProcessFlatBatchOutput>status(input.isSuccessful())
+ .withRpcErrors(input.getErrors())
+ .withResult(outputBuilder.build())
+ .build();
};
}
final RpcResult<T> input, final int stepOffset) {
final List<BatchFailure> batchFailures = new ArrayList<>();
if (input.getResult().getBatchFailedFlowsOutput() != null) {
- for (BatchFailedFlowsOutput stepOutput : input.getResult().getBatchFailedFlowsOutput()) {
+ for (BatchFailedFlowsOutput stepOutput : input.getResult().nonnullBatchFailedFlowsOutput().values()) {
final BatchFailure batchFailure = new BatchFailureBuilder()
- .setBatchOrder(stepOffset + stepOutput.getBatchOrder())
+ .setBatchOrder(stepOffset + stepOutput.getBatchOrder().toJava())
.setBatchItemIdChoice(new FlatBatchFailureFlowIdCaseBuilder()
.setFlowId(stepOutput.getFlowId())
.build())
}
/**
- * shortcut for {@link #createBatchFlowChainingFunction(int)} with conversion {@link ListenableFuture}
+ * Shortcut for {@link #convertBatchFlowResult(int)} with conversion {@link ListenableFuture}.
*
* @param <T> exact type of batch flow output
* @param resultUpdateFlowFuture batch flow rpc-result (add/remove/update)
* @param currentOffset offset of current batch plan step with respect to entire chain of steps
- * @return next chained result incorporating results of this step's batch
+ * @return ListenableFuture with converted result {@link ProcessFlatBatchOutput}
*/
public static <T extends BatchFlowOutputListGrouping> ListenableFuture<RpcResult<ProcessFlatBatchOutput>>
- adaptFlowBatchFutureForChain(final Future<RpcResult<T>> resultUpdateFlowFuture,
- final int currentOffset) {
- return Futures.transform(JdkFutureAdapters.listenInPoolThread(resultUpdateFlowFuture),
- FlatBatchFlowAdapters.<T>createBatchFlowChainingFunction(currentOffset));
+ convertFlowBatchFutureForChain(final ListenableFuture<RpcResult<T>> resultUpdateFlowFuture,
+ final int currentOffset) {
+ return Futures.transform(resultUpdateFlowFuture, FlatBatchFlowAdapters.convertBatchFlowResult(currentOffset),
+ MoreExecutors.directExecutor());
}
}