/* * Copyright (c) 2013 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.openflowjava.protocol.impl.deserialization; import io.netty.buffer.ByteBuf; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry; import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey; import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey; import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; import org.opendaylight.yangtools.yang.binding.DataObject; /** * @author michal.polkorab * @author timotej.kubas * @author giuseppex.petralia@intel.com */ public class DeserializationFactory { private final Map<TypeToClassKey, Class<?>> messageClassMap = new ConcurrentHashMap<>(); private DeserializerRegistry registry; /** * Constructor */ public DeserializationFactory() { TypeToClassMapInitializer.initializeTypeToClassMap(messageClassMap); // Register type to class map for additional deserializers TypeToClassMapInitializer.initializeAdditionalTypeToClassMap(messageClassMap); } /** * Transforms ByteBuf into correct POJO message * * @param rawMessage * @param version * version decoded from OpenFlow protocol message * @return correct POJO as DataObject */ public DataObject deserialize(final ByteBuf rawMessage, final short version) { DataObject dataObject = null; int type = rawMessage.readUnsignedByte(); Class<?> clazz = messageClassMap.get(new TypeToClassKey(version, type)); rawMessage.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES); OFDeserializer<DataObject> deserializer = registry.getDeserializer(new MessageCodeKey(version, type, clazz)); dataObject = deserializer.deserialize(rawMessage); return dataObject; } /** * Register new type to class mapping used to assign return type when deserializing message * @param key type to class key * @param clazz return class */ public void registerMapping(final TypeToClassKey key, final Class<?> clazz) { messageClassMap.put(key, clazz); } /** * Unregister type to class mapping used to assign return type when deserializing message * @param key type to class key * @return true if mapping was successfully removed */ public boolean unregisterMapping(final TypeToClassKey key) { if (key == null) { throw new IllegalArgumentException("TypeToClassKey is null"); } return messageClassMap.remove(key) != null; } /** * @param registry */ public void setRegistry(final DeserializerRegistry registry) { this.registry = registry; } }