2 * Copyright (c) 2016 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.protocol.serialization.util;
11 import io.netty.buffer.ByteBuf;
12 import java.util.Optional;
13 import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderSerializer;
14 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
16 import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
17 import org.opendaylight.openflowjava.protocol.impl.util.TypeKeyMakerFactory;
18 import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey;
19 import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava;
20 import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava;
21 import org.opendaylight.openflowplugin.extension.api.TypeVersionKey;
22 import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider;
23 import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionGrouping;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
31 * Utility class for action serialization.
33 public final class ActionUtil {
34 private static final Logger LOG = LoggerFactory.getLogger(ActionUtil.class);
36 private ActionUtil() {
40 * Serialize OpenFlow action, using extension converter if available.
41 * TODO: Remove also extension converters
43 * @param action OpenFlowPlugin action
44 * @param version OpenFlow version
45 * @param registry serializer registry
46 * @param outBuffer output buffer
48 @SuppressWarnings("unchecked")
49 public static void writeAction(Action action, short version, SerializerRegistry registry, ByteBuf outBuffer) {
51 Optional.ofNullable(OFSessionUtil.getExtensionConvertorProvider())
53 (GeneralExtensionGrouping.class.isInstance(action)
54 ? convertExtensionGrouping(provider, (GeneralExtensionGrouping)action, version)
55 : convertGenericAction(provider, action, version))
57 final OFSerializer<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common
58 .action.rev150203.actions.grouping.Action> serializer = registry
59 .getSerializer(TypeKeyMakerFactory.createActionKeyMaker(version)
62 serializer.serialize(ofjAction, outBuffer);
66 final OFSerializer<Action> serializer = registry.getSerializer(
68 version, (Class<? extends Action>) action.getImplementedInterface()));
70 serializer.serialize(action, outBuffer);
73 } catch (final IllegalStateException | ClassCastException e) {
74 LOG.warn("Serializer for action {} for version {} not found.", action.getImplementedInterface(), version);
79 * Serialize OpenFlow action header, using extension converter if available.
80 * TODO: Remove also extension converters
82 * @param action OpenFlowPlugin action
83 * @param version OpenFlow version
84 * @param registry serializer registry
85 * @param outBuffer output buffer
87 @SuppressWarnings("unchecked")
88 public static void writeActionHeader(Action action, short version, SerializerRegistry registry, ByteBuf outBuffer) {
90 Optional.ofNullable(OFSessionUtil.getExtensionConvertorProvider())
92 (GeneralExtensionGrouping.class.isInstance(action)
93 ? convertExtensionGrouping(provider, (GeneralExtensionGrouping)action, version)
94 : convertGenericAction(provider, action, version))
96 final HeaderSerializer<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow
98 .action.rev150203.actions.grouping.Action> serializer = registry
99 .getSerializer(TypeKeyMakerFactory.createActionKeyMaker(version)
102 serializer.serializeHeader(ofjAction, outBuffer);
106 final HeaderSerializer<Action> serializer = registry.getSerializer(
107 new MessageTypeKey<>(
108 version, (Class<? extends Action>) action.getImplementedInterface()));
110 serializer.serializeHeader(action, outBuffer);
113 } catch (final IllegalStateException | ClassCastException e) {
114 LOG.warn("Header Serializer for action {} for version {} not found.", action.getImplementedInterface(),
120 * Try to convert action that implements
121 * #{@link org.opendaylight.yang.gen.v1.urn
122 * .opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionGrouping}.
123 * to OpenFlowJava action
125 * @param provider extension converter provider
126 * @param action GeneralExtensionGrouping action
127 * @param version OpenFlow version
128 * @return optional OpenFlowJava action
130 private static Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions
131 .grouping.Action> convertExtensionGrouping(final ExtensionConverterProvider provider,
132 final GeneralExtensionGrouping action,
133 final short version) {
134 final ConverterExtensionKey<? extends ExtensionKey> key =
135 new ConverterExtensionKey<>(action.getExtensionKey(), version);
137 final ConvertorToOFJava<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions
138 .grouping.Action> converter = provider.getConverter(key);
140 return Optional.ofNullable(converter).map(c -> c.convert(action.getExtension()));
144 * Try to convert generic OpenFlowPlugin action to OpenFlowJava action.
146 * @param provider extension converter provider
147 * @param action OpenFlowPlugin action
148 * @param version OpenFlow version
149 * @return optional OpenFlowJava action
151 @SuppressWarnings("unchecked")
152 private static Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions
153 .grouping.Action> convertGenericAction(final ExtensionConverterProvider provider,
155 final short version) {
157 final TypeVersionKey<Action> key =
158 new TypeVersionKey<>((Class<? extends Action>) action.getImplementedInterface(), version);
160 final ConvertorActionToOFJava<Action, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action
161 .rev150203.actions.grouping.Action> converter = provider.getConverter(key);
164 return Optional.ofNullable(converter).map(c -> c.convert(action));