*/
package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import static java.util.Objects.requireNonNull;
+import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint16;
+import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint32;
+import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint64;
+import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint8;
+
import io.netty.buffer.ByteBuf;
-import java.math.BigInteger;
-import java.util.List;
-import java.util.Objects;
import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
-import org.opendaylight.openflowjava.protocol.impl.util.CodeKeyMaker;
import org.opendaylight.openflowjava.protocol.impl.util.CodeKeyMakerFactory;
import org.opendaylight.openflowjava.protocol.impl.util.ListDeserializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModCommand;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
* Translates FlowModInput messages.
*/
public class FlowModInputMessageFactory implements OFDeserializer<FlowModInput>, DeserializerRegistryInjector {
-
private static final byte PADDING = 2;
- private DeserializerRegistry registry;
- @Override
- @SuppressFBWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR") // FB doesn't recognize Objects.requireNonNull
- public FlowModInput deserialize(ByteBuf rawMessage) {
- Objects.requireNonNull(registry);
+ private DeserializerRegistry registry = null;
- FlowModInputBuilder builder = new FlowModInputBuilder();
- builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
- builder.setXid(rawMessage.readUnsignedInt());
- byte[] cookie = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
- rawMessage.readBytes(cookie);
- builder.setCookie(new BigInteger(1, cookie));
- final byte[] cookieMask = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
- rawMessage.readBytes(cookieMask);
- builder.setCookieMask(new BigInteger(1, cookieMask));
- builder.setTableId(new TableId((long) rawMessage.readUnsignedByte()));
- builder.setCommand(FlowModCommand.forValue(rawMessage.readUnsignedByte()));
- builder.setIdleTimeout(rawMessage.readUnsignedShort());
- builder.setHardTimeout(rawMessage.readUnsignedShort());
- builder.setPriority(rawMessage.readUnsignedShort());
- builder.setBufferId(rawMessage.readUnsignedInt());
- builder.setOutPort(new PortNumber(rawMessage.readUnsignedInt()));
- builder.setOutGroup(rawMessage.readUnsignedInt());
- builder.setFlags(createFlowModFlagsFromBitmap(rawMessage.readUnsignedShort()));
+ @Override
+ public FlowModInput deserialize(final ByteBuf rawMessage) {
+ FlowModInputBuilder builder = new FlowModInputBuilder()
+ .setVersion(EncodeConstants.OF_VERSION_1_3)
+ .setXid(readUint32(rawMessage))
+ .setCookie(readUint64(rawMessage))
+ .setCookieMask(readUint64(rawMessage))
+ .setTableId(new TableId(readUint8(rawMessage).toUint32()))
+ .setCommand(FlowModCommand.forValue(rawMessage.readUnsignedByte()))
+ .setIdleTimeout(readUint16(rawMessage))
+ .setHardTimeout(readUint16(rawMessage))
+ .setPriority(readUint16(rawMessage))
+ .setBufferId(readUint32(rawMessage))
+ .setOutPort(new PortNumber(readUint32(rawMessage)))
+ .setOutGroup(readUint32(rawMessage))
+ .setFlags(createFlowModFlagsFromBitmap(rawMessage.readUnsignedShort()));
rawMessage.skipBytes(PADDING);
OFDeserializer<Match> matchDeserializer = registry.getDeserializer(
- new MessageCodeKey(EncodeConstants.OF13_VERSION_ID, EncodeConstants.EMPTY_VALUE, Match.class));
- builder.setMatch(matchDeserializer.deserialize(rawMessage));
- CodeKeyMaker keyMaker = CodeKeyMakerFactory.createInstructionsKeyMaker(EncodeConstants.OF13_VERSION_ID);
- List<Instruction> instructions = ListDeserializer.deserializeList(EncodeConstants.OF13_VERSION_ID,
- rawMessage.readableBytes(), rawMessage, keyMaker, registry);
- builder.setInstruction(instructions);
- return builder.build();
+ new MessageCodeKey(EncodeConstants.OF_VERSION_1_3, EncodeConstants.EMPTY_VALUE, Match.class));
+ return builder
+ .setMatch(matchDeserializer.deserialize(rawMessage))
+ .setInstruction(ListDeserializer.deserializeList(EncodeConstants.OF13_VERSION_ID,
+ rawMessage.readableBytes(), rawMessage,
+ CodeKeyMakerFactory.createInstructionsKeyMaker(EncodeConstants.OF_VERSION_1_3), registry))
+ .build();
}
@SuppressWarnings("checkstyle:AbbreviationAsWordInName")
- private static FlowModFlags createFlowModFlagsFromBitmap(int input) {
+ private static FlowModFlags createFlowModFlagsFromBitmap(final int input) {
final Boolean _oFPFFSENDFLOWREM = (input & 1 << 0) != 0;
final Boolean _oFPFFCHECKOVERLAP = (input & 1 << 1) != 0;
final Boolean _oFPFFRESETCOUNTS = (input & 1 << 2) != 0;
}
@Override
- public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
- registry = deserializerRegistry;
+ public void injectDeserializerRegistry(final DeserializerRegistry deserializerRegistry) {
+ registry = requireNonNull(deserializerRegistry);
}
}