Add methods that allows registering any serializer
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / experimenter / OnfExperimenterErrorFactory.java
1 /*
2  * Copyright (c) 2016 Pantheon Technologies s.r.o. and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.openflowjava.protocol.impl.deserialization.experimenter;
10
11 import io.netty.buffer.ByteBuf;
12 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
13 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.OnfExperimenterErrorCode;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ExperimenterIdError;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ExperimenterIdErrorBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
23
24 /**
25  * Translates (ONF approved) experimenter error messages.
26  */
27 public class OnfExperimenterErrorFactory implements OFDeserializer<ErrorMessage> {
28
29     private static final Logger LOG = LoggerFactory.getLogger(OnfExperimenterErrorFactory.class);
30     private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
31     private static final String UNKNOWN_CODE = "UNKNOWN_CODE";
32
33     @Override
34     public ErrorMessage deserialize(ByteBuf message) {
35         ErrorMessageBuilder builder = new ErrorMessageBuilder();
36         builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
37         builder.setXid(message.readUnsignedInt());
38
39         int type = message.readUnsignedShort();
40         ErrorType errorType = ErrorType.forValue(type);
41         if (errorType != null && errorType.equals(ErrorType.EXPERIMENTER)) {
42             builder.setType(errorType.getIntValue());
43             builder.setTypeString(errorType.getName());
44         } else {
45             LOG.warn("Deserializing other than {} error message with {}", ErrorType.EXPERIMENTER.getName(),
46                     this.getClass().getCanonicalName());
47             builder.setType(type);
48             builder.setTypeString(UNKNOWN_TYPE);
49         }
50
51         int code = message.readUnsignedShort();
52         OnfExperimenterErrorCode errorCode = OnfExperimenterErrorCode.forValue(code);
53         if (errorCode != null) {
54             builder.setCode(errorCode.getIntValue());
55             builder.setCodeString(errorCode.getName());
56         } else {
57             builder.setCode(code);
58             builder.setCodeString(UNKNOWN_CODE);
59         }
60
61         builder.addAugmentation(ExperimenterIdError.class, new ExperimenterIdErrorBuilder()
62                 .setExperimenter(new ExperimenterId(message.readUnsignedInt()))
63                 .build());
64
65         if (message.readableBytes() > 0) {
66             byte[] data = new byte[message.readableBytes()];
67             message.readBytes(data);
68             builder.setData(data);
69         }
70         return builder.build();
71     }
72 }