Use YANG java files instead of the old model TELSDN-474 #close
[lispflowmapping.git] / mappingservice / implementation / src / main / java / org / opendaylight / lispflowmapping / implementation / serializer / MapReplySerializer.java
1 package org.opendaylight.lispflowmapping.implementation.serializer;
2
3 import java.nio.ByteBuffer;
4 import java.util.ArrayList;
5
6 import org.apache.commons.lang3.BooleanUtils;
7 import org.opendaylight.lispflowmapping.implementation.util.ByteUtil;
8 import org.opendaylight.lispflowmapping.implementation.util.NumberUtil;
9 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapReply;
10 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord;
11 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.mapreplymessage.MapReplyBuilder;
12
13 /**
14  * This class deals with serializing map reply from the java object to udp.
15  */
16 public class MapReplySerializer {
17
18     private static final MapReplySerializer INSTANCE = new MapReplySerializer();
19
20     // Private constructor prevents instantiation from other classes
21     private MapReplySerializer() {
22     }
23
24     public static MapReplySerializer getInstance() {
25         return INSTANCE;
26     }
27
28     public ByteBuffer serialize(MapReply mapReply) {
29         int size = Length.HEADER_SIZE;
30         for (EidToLocatorRecord eidToLocatorRecord : mapReply.getEidToLocatorRecord()) {
31             size += EidToLocatorRecordSerializer.getInstance().getSerializationSize(eidToLocatorRecord);
32         }
33
34         ByteBuffer replyBuffer = ByteBuffer.allocate(size);
35
36         replyBuffer.put((byte) ((LispMessageEnum.MapReply.getValue() << 4) | //
37                 (BooleanUtils.isTrue(mapReply.isProbe()) ? Flags.PROBE : 0x00) | //
38                 (BooleanUtils.isTrue(mapReply.isEchoNonceEnabled()) ? Flags.ECHO_NONCE_ENABLED : 0x00)));
39
40         replyBuffer.position(replyBuffer.position() + Length.RES);
41         if (mapReply.getEidToLocatorRecord() != null) {
42             replyBuffer.put((byte) mapReply.getEidToLocatorRecord().size());
43         } else {
44             replyBuffer.put((byte) 0);
45
46         }
47         replyBuffer.putLong(NumberUtil.asLong(mapReply.getNonce()));
48         if (mapReply.getEidToLocatorRecord() != null) {
49             for (EidToLocatorRecord eidToLocatorRecord : mapReply.getEidToLocatorRecord()) {
50                 EidToLocatorRecordSerializer.getInstance().serialize(replyBuffer, eidToLocatorRecord);
51             }
52         }
53         return replyBuffer;
54     }
55
56     public MapReply deserialize(ByteBuffer replyBuffer) {
57         MapReplyBuilder builder = new MapReplyBuilder();
58         byte typeAndFlags = replyBuffer.get();
59         builder.setProbe(ByteUtil.extractBit(typeAndFlags, Flags.PROBE));
60         builder.setEchoNonceEnabled(ByteUtil.extractBit(typeAndFlags, Flags.ECHO_NONCE_ENABLED));
61         builder.setSecurityEnabled(ByteUtil.extractBit(typeAndFlags, Flags.SECURITY_ENABLED));
62         replyBuffer.getShort();
63         int recordCount = replyBuffer.get();
64         builder.setNonce(replyBuffer.getLong());
65         builder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
66         for (int i = 0; i < recordCount; i++) {
67             builder.getEidToLocatorRecord().add(EidToLocatorRecordSerializer.getInstance().deserialize(replyBuffer));
68         }
69
70         return builder.build();
71     }
72
73     private interface Length {
74         int RES = 2;
75         int HEADER_SIZE = 12;
76     }
77
78     private interface Flags {
79         int PROBE = 0x08;
80         int ECHO_NONCE_ENABLED = 0x04;
81         int SECURITY_ENABLED = 0x02;
82     }
83
84 }