2 * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.openflowplugin.impl.services;
11 import java.util.Collections;
12 import java.util.List;
13 import java.util.Optional;
14 import java.util.concurrent.Future;
15 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
16 import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
17 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
18 import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
19 import org.opendaylight.openflowplugin.impl.services.util.RequestInputUtils;
20 import org.opendaylight.openflowplugin.impl.services.util.ServiceException;
21 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
22 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.multipart.request.table.features.TableFeatures;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.TableUpdatedBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableOutput;
31 import org.opendaylight.yangtools.yang.common.RpcResult;
33 public abstract class AbstractTableMultipartService<T extends OfHeader> extends AbstractMultipartService<UpdateTableInput, T> {
35 private final ConvertorExecutor convertorExecutor;
36 private final MultipartWriterProvider multipartWriterProvider;
37 private final VersionConvertorData data;
39 protected AbstractTableMultipartService(final RequestContextStack requestContextStack,
40 final DeviceContext deviceContext,
41 final ConvertorExecutor convertorExecutor,
42 final MultipartWriterProvider multipartWriterProvider) {
43 super(requestContextStack, deviceContext);
44 this.convertorExecutor = convertorExecutor;
45 this.multipartWriterProvider = multipartWriterProvider;
46 data = new VersionConvertorData(getVersion());
50 protected OfHeader buildRequest(final Xid xid, final UpdateTableInput input) throws ServiceException {
51 final Optional<List<TableFeatures>> tableFeatures = getConvertorExecutor().convert(input.getUpdatedTable(), data);
53 return RequestInputUtils.createMultipartHeader(MultipartType.OFPMPTABLEFEATURES, xid.getValue(), getVersion())
54 .setMultipartRequestBody(new MultipartRequestTableFeaturesCaseBuilder()
55 .setMultipartRequestTableFeatures(new MultipartRequestTableFeaturesBuilder()
56 .setTableFeatures(tableFeatures
57 .orElseGet(Collections::emptyList))
64 * Get convertor executor
65 * @return convertor executor
67 protected ConvertorExecutor getConvertorExecutor() {
68 return convertorExecutor;
75 protected VersionConvertorData getData() {
80 * Stores table features to operational datastore
82 protected void storeStatistics(List<org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures> result) {
83 multipartWriterProvider
84 .lookup(MultipartType.OFPMPTABLEFEATURES)
85 .ifPresent(writer -> {
87 new TableUpdatedBuilder()
88 .setTableFeatures(result)
92 getTxFacade().submitTransaction();
97 * Process experimenter input and result experimenter output
98 * @param input experimenter input
99 * @return experimenter output
101 public abstract Future<RpcResult<UpdateTableOutput>> handleAndReply(UpdateTableInput input);