/*
* Copyright (c) 2017 Pantheon Technologies s.r.o. 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.protocol.deserialization.multipart;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Chaining;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.ChainingChecks;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupAll;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupCapability;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupFf;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupIndirect;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupSelect;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectLiveness;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight;
import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.reply.MultipartReplyBody;
public class MultipartReplyGroupFeaturesDeserializer implements OFDeserializer<MultipartReplyBody> {
private static final int GROUP_TYPES = 4;
@Override
public MultipartReplyBody deserialize(ByteBuf message) {
final MultipartReplyGroupFeaturesBuilder builder = new MultipartReplyGroupFeaturesBuilder();
return builder
.setGroupTypesSupported(readGroupTypes(message))
.setGroupCapabilitiesSupported(readGroupCapabilities(message))
.setMaxGroups(IntStream
.range(0, GROUP_TYPES)
.mapToObj(i -> message.readUnsignedInt())
.collect(Collectors.toList()))
.setActions(IntStream
.range(0, GROUP_TYPES)
.mapToObj(i -> message.readUnsignedInt())
.collect(Collectors.toList()))
.build();
}
private static List<Class<? extends GroupCapability>> readGroupCapabilities(ByteBuf message) {
final List<Class<? extends GroupCapability>> groupCapabilities = new ArrayList<>();
final long capabilitiesMask = message.readUnsignedInt();
final boolean gcSelectWeight = ((capabilitiesMask) & (1 << 0)) != 0;
final boolean gcSelectLiveness = ((capabilitiesMask) & (1 << 1)) != 0;
final boolean gcChaining = ((capabilitiesMask) & (1 << 2)) != 0;
final boolean gcChainingChecks = ((capabilitiesMask) & (1 << 3)) != 0;
if (gcSelectWeight) groupCapabilities.add(SelectWeight.class);
if (gcSelectLiveness) groupCapabilities.add(SelectLiveness.class);
if (gcChaining) groupCapabilities.add(Chaining.class);
if (gcChainingChecks) groupCapabilities.add(ChainingChecks.class);
return groupCapabilities;
}
private static List<Class<? extends GroupType>> readGroupTypes(ByteBuf message) {
final List<Class<? extends GroupType>> groupTypes = new ArrayList<>();
final long typesMask = message.readUnsignedInt();
final boolean gtAll = ((typesMask) & (1 << 0)) != 0;
final boolean gtSelect = ((typesMask) & (1 << 1)) != 0;
final boolean gtIndirect = ((typesMask) & (1 << 2)) != 0;
final boolean gtFF = ((typesMask) & (1 << 3)) != 0;
if (gtAll) groupTypes.add(GroupAll.class);
if (gtSelect) groupTypes.add(GroupSelect.class);
if (gtIndirect) groupTypes.add(GroupIndirect.class);
if (gtFF) groupTypes.add(GroupFf.class);
return groupTypes;
}
}