blob: df98b8db16fb02b29b0c4f36176a61fdd2745f3c [file] [log] [blame]
Ray Milkeyd43fe452015-05-29 09:35:12 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
Ray Milkeyd43fe452015-05-29 09:35:12 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.codec.impl;
17
andread35f89c2015-11-23 10:02:07 -080018import com.fasterxml.jackson.databind.node.ObjectNode;
Yafit Hadar5796d972015-10-15 13:16:11 +030019import org.onlab.util.HexString;
Ray Milkeyd43fe452015-05-29 09:35:12 -070020import org.onosproject.codec.CodecContext;
21import org.onosproject.net.OchSignal;
Yafit Hadar5796d972015-10-15 13:16:11 +030022import org.onosproject.net.OduSignalId;
Ray Milkeyd43fe452015-05-29 09:35:12 -070023import org.onosproject.net.flow.criteria.Criterion;
24import org.onosproject.net.flow.criteria.EthCriterion;
25import org.onosproject.net.flow.criteria.EthTypeCriterion;
26import org.onosproject.net.flow.criteria.IPCriterion;
27import org.onosproject.net.flow.criteria.IPDscpCriterion;
28import org.onosproject.net.flow.criteria.IPEcnCriterion;
29import org.onosproject.net.flow.criteria.IPProtocolCriterion;
30import org.onosproject.net.flow.criteria.IPv6ExthdrFlagsCriterion;
31import org.onosproject.net.flow.criteria.IPv6FlowLabelCriterion;
32import org.onosproject.net.flow.criteria.IPv6NDLinkLayerAddressCriterion;
33import org.onosproject.net.flow.criteria.IPv6NDTargetAddressCriterion;
34import org.onosproject.net.flow.criteria.IcmpCodeCriterion;
35import org.onosproject.net.flow.criteria.IcmpTypeCriterion;
36import org.onosproject.net.flow.criteria.Icmpv6CodeCriterion;
37import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion;
38import org.onosproject.net.flow.criteria.MetadataCriterion;
Jonathan Hartcc962d82016-08-09 16:52:22 -070039import org.onosproject.net.flow.criteria.MplsBosCriterion;
Ray Milkeyd43fe452015-05-29 09:35:12 -070040import org.onosproject.net.flow.criteria.MplsCriterion;
41import org.onosproject.net.flow.criteria.OchSignalCriterion;
42import org.onosproject.net.flow.criteria.OchSignalTypeCriterion;
Yafit Hadar52d81552015-10-07 12:26:52 +030043import org.onosproject.net.flow.criteria.OduSignalIdCriterion;
44import org.onosproject.net.flow.criteria.OduSignalTypeCriterion;
Ray Milkeyd43fe452015-05-29 09:35:12 -070045import org.onosproject.net.flow.criteria.PortCriterion;
46import org.onosproject.net.flow.criteria.SctpPortCriterion;
47import org.onosproject.net.flow.criteria.TcpPortCriterion;
Hyunsun Moon7080a0d2015-08-14 19:18:48 -070048import org.onosproject.net.flow.criteria.TunnelIdCriterion;
Ray Milkeyd43fe452015-05-29 09:35:12 -070049import org.onosproject.net.flow.criteria.UdpPortCriterion;
50import org.onosproject.net.flow.criteria.VlanIdCriterion;
51import org.onosproject.net.flow.criteria.VlanPcpCriterion;
52
andread35f89c2015-11-23 10:02:07 -080053import java.util.EnumMap;
Ray Milkeyd43fe452015-05-29 09:35:12 -070054
55import static com.google.common.base.Preconditions.checkNotNull;
56
57/**
58 * Encode portion of the criterion codec.
59 */
Ray Milkey6d7968e2015-07-06 14:30:02 -070060public final class EncodeCriterionCodecHelper {
Ray Milkeyd43fe452015-05-29 09:35:12 -070061
62 private final Criterion criterion;
63 private final CodecContext context;
64
65 private final EnumMap<Criterion.Type, CriterionTypeFormatter> formatMap;
66
67 /**
68 * Creates an encoder object for a criterion.
69 * Initializes the formatter lookup map for the criterion subclasses.
70 *
71 * @param criterion Criterion to encode
andread35f89c2015-11-23 10:02:07 -080072 * @param context context of the JSON encoding
Ray Milkeyd43fe452015-05-29 09:35:12 -070073 */
Ray Milkey6d7968e2015-07-06 14:30:02 -070074 public EncodeCriterionCodecHelper(Criterion criterion, CodecContext context) {
Ray Milkeyd43fe452015-05-29 09:35:12 -070075 this.criterion = criterion;
76 this.context = context;
77
78 formatMap = new EnumMap<>(Criterion.Type.class);
79
80 formatMap.put(Criterion.Type.IN_PORT, new FormatInPort());
81 formatMap.put(Criterion.Type.IN_PHY_PORT, new FormatInPort());
82 formatMap.put(Criterion.Type.METADATA, new FormatMetadata());
83 formatMap.put(Criterion.Type.ETH_DST, new FormatEth());
84 formatMap.put(Criterion.Type.ETH_SRC, new FormatEth());
85 formatMap.put(Criterion.Type.ETH_TYPE, new FormatEthType());
86 formatMap.put(Criterion.Type.VLAN_VID, new FormatVlanVid());
87 formatMap.put(Criterion.Type.VLAN_PCP, new FormatVlanPcp());
alshabibfa0dc662016-01-13 11:23:53 -080088 formatMap.put(Criterion.Type.INNER_VLAN_VID, new FormatInnerVlanVid());
89 formatMap.put(Criterion.Type.INNER_VLAN_PCP, new FormatInnerVlanPcp());
Ray Milkeyd43fe452015-05-29 09:35:12 -070090 formatMap.put(Criterion.Type.IP_DSCP, new FormatIpDscp());
91 formatMap.put(Criterion.Type.IP_ECN, new FormatIpEcn());
92 formatMap.put(Criterion.Type.IP_PROTO, new FormatIpProto());
93 formatMap.put(Criterion.Type.IPV4_SRC, new FormatIp());
94 formatMap.put(Criterion.Type.IPV4_DST, new FormatIp());
95 formatMap.put(Criterion.Type.TCP_SRC, new FormatTcp());
96 formatMap.put(Criterion.Type.TCP_DST, new FormatTcp());
97 formatMap.put(Criterion.Type.UDP_SRC, new FormatUdp());
98 formatMap.put(Criterion.Type.UDP_DST, new FormatUdp());
99 formatMap.put(Criterion.Type.SCTP_SRC, new FormatSctp());
100 formatMap.put(Criterion.Type.SCTP_DST, new FormatSctp());
101 formatMap.put(Criterion.Type.ICMPV4_TYPE, new FormatIcmpV4Type());
102 formatMap.put(Criterion.Type.ICMPV4_CODE, new FormatIcmpV4Code());
103 formatMap.put(Criterion.Type.IPV6_SRC, new FormatIp());
104 formatMap.put(Criterion.Type.IPV6_DST, new FormatIp());
105 formatMap.put(Criterion.Type.IPV6_FLABEL, new FormatIpV6FLabel());
106 formatMap.put(Criterion.Type.ICMPV6_TYPE, new FormatIcmpV6Type());
107 formatMap.put(Criterion.Type.ICMPV6_CODE, new FormatIcmpV6Code());
108 formatMap.put(Criterion.Type.IPV6_ND_TARGET, new FormatV6NDTarget());
109 formatMap.put(Criterion.Type.IPV6_ND_SLL, new FormatV6NDTll());
110 formatMap.put(Criterion.Type.IPV6_ND_TLL, new FormatV6NDTll());
111 formatMap.put(Criterion.Type.MPLS_LABEL, new FormatMplsLabel());
Jonathan Hartcc962d82016-08-09 16:52:22 -0700112 formatMap.put(Criterion.Type.MPLS_BOS, new FormatMplsBos());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700113 formatMap.put(Criterion.Type.IPV6_EXTHDR, new FormatIpV6Exthdr());
114 formatMap.put(Criterion.Type.OCH_SIGID, new FormatOchSigId());
115 formatMap.put(Criterion.Type.OCH_SIGTYPE, new FormatOchSigType());
Hyunsun Moon7080a0d2015-08-14 19:18:48 -0700116 formatMap.put(Criterion.Type.TUNNEL_ID, new FormatTunnelId());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700117 formatMap.put(Criterion.Type.DUMMY, new FormatDummyType());
Yafit Hadar52d81552015-10-07 12:26:52 +0300118 formatMap.put(Criterion.Type.ODU_SIGID, new FormatOduSignalId());
119 formatMap.put(Criterion.Type.ODU_SIGTYPE, new FormatOduSignalType());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700120 // Currently unimplemented
121 formatMap.put(Criterion.Type.ARP_OP, new FormatUnknown());
122 formatMap.put(Criterion.Type.ARP_SPA, new FormatUnknown());
123 formatMap.put(Criterion.Type.ARP_TPA, new FormatUnknown());
124 formatMap.put(Criterion.Type.ARP_SHA, new FormatUnknown());
125 formatMap.put(Criterion.Type.ARP_THA, new FormatUnknown());
126 formatMap.put(Criterion.Type.MPLS_TC, new FormatUnknown());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700127 formatMap.put(Criterion.Type.PBB_ISID, new FormatUnknown());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700128 formatMap.put(Criterion.Type.UNASSIGNED_40, new FormatUnknown());
129 formatMap.put(Criterion.Type.PBB_UCA, new FormatUnknown());
130 formatMap.put(Criterion.Type.TCP_FLAGS, new FormatUnknown());
131 formatMap.put(Criterion.Type.ACTSET_OUTPUT, new FormatUnknown());
132 formatMap.put(Criterion.Type.PACKET_TYPE, new FormatUnknown());
Jonathan Hart26a8d952015-12-02 15:16:35 -0800133 formatMap.put(Criterion.Type.EXTENSION, new FormatUnknown());
Saurav Das9d6c86b2016-02-19 09:01:07 -0800134 formatMap.put(Criterion.Type.ETH_DST_MASKED, new FormatUnknown());
135 formatMap.put(Criterion.Type.ETH_SRC_MASKED, new FormatUnknown());
Andreas Gilbert75b882f72017-02-03 09:58:07 +0100136 formatMap.put(Criterion.Type.TCP_SRC_MASKED, new FormatUnknown());
137 formatMap.put(Criterion.Type.TCP_DST_MASKED, new FormatUnknown());
138 formatMap.put(Criterion.Type.UDP_SRC_MASKED, new FormatUnknown());
139 formatMap.put(Criterion.Type.UDP_DST_MASKED, new FormatUnknown());
140 formatMap.put(Criterion.Type.SCTP_SRC_MASKED, new FormatUnknown());
141 formatMap.put(Criterion.Type.SCTP_DST_MASKED, new FormatUnknown());
Carmelo Cascone1022a4e2017-05-25 00:16:18 -0400142 formatMap.put(Criterion.Type.PROTOCOL_INDEPENDENT, new FormatUnknown());
Saurav Das9d6c86b2016-02-19 09:01:07 -0800143
Ray Milkeyd43fe452015-05-29 09:35:12 -0700144 }
145
146 private interface CriterionTypeFormatter {
147 ObjectNode encodeCriterion(ObjectNode root, Criterion criterion);
148 }
149
150 private static class FormatUnknown implements CriterionTypeFormatter {
151 @Override
152 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
153 return root;
154 }
155 }
156
157 private static class FormatInPort implements CriterionTypeFormatter {
158 @Override
159 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
160 final PortCriterion portCriterion = (PortCriterion) criterion;
161 return root.put(CriterionCodec.PORT, portCriterion.port().toLong());
162 }
163 }
164
165 private static class FormatMetadata implements CriterionTypeFormatter {
166 @Override
167 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
168 final MetadataCriterion metadataCriterion =
169 (MetadataCriterion) criterion;
170 return root.put(CriterionCodec.METADATA, metadataCriterion.metadata());
171 }
172 }
173
174 private static class FormatEth implements CriterionTypeFormatter {
175 @Override
176 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
177 final EthCriterion ethCriterion = (EthCriterion) criterion;
178 return root.put(CriterionCodec.MAC, ethCriterion.mac().toString());
179 }
180 }
181
182 private static class FormatEthType implements CriterionTypeFormatter {
183 @Override
184 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
185 final EthTypeCriterion ethTypeCriterion =
186 (EthTypeCriterion) criterion;
andread35f89c2015-11-23 10:02:07 -0800187 return root.put(CriterionCodec.ETH_TYPE, "0x"
188 + Integer.toHexString(ethTypeCriterion.ethType().toShort() & 0xffff));
Ray Milkeyd43fe452015-05-29 09:35:12 -0700189 }
190 }
191
192 private static class FormatVlanVid implements CriterionTypeFormatter {
193 @Override
194 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
195 final VlanIdCriterion vlanIdCriterion =
196 (VlanIdCriterion) criterion;
197 return root.put(CriterionCodec.VLAN_ID, vlanIdCriterion.vlanId().toShort());
198 }
199 }
200
201 private static class FormatVlanPcp implements CriterionTypeFormatter {
202 @Override
203 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
204 final VlanPcpCriterion vlanPcpCriterion =
205 (VlanPcpCriterion) criterion;
206 return root.put(CriterionCodec.PRIORITY, vlanPcpCriterion.priority());
207 }
208 }
209
alshabibfa0dc662016-01-13 11:23:53 -0800210 private static class FormatInnerVlanVid implements CriterionTypeFormatter {
211 @Override
212 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
213 final VlanIdCriterion vlanIdCriterion =
214 (VlanIdCriterion) criterion;
215 return root.put(CriterionCodec.INNER_VLAN_ID, vlanIdCriterion.vlanId().toShort());
216 }
217 }
218
219 private static class FormatInnerVlanPcp implements CriterionTypeFormatter {
220 @Override
221 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
222 final VlanPcpCriterion vlanPcpCriterion =
223 (VlanPcpCriterion) criterion;
224 return root.put(CriterionCodec.INNER_PRIORITY, vlanPcpCriterion.priority());
225 }
226 }
227
Ray Milkeyd43fe452015-05-29 09:35:12 -0700228 private static class FormatIpDscp implements CriterionTypeFormatter {
229 @Override
230 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
231 final IPDscpCriterion ipDscpCriterion =
232 (IPDscpCriterion) criterion;
233 return root.put(CriterionCodec.IP_DSCP, ipDscpCriterion.ipDscp());
234 }
235 }
236
237 private static class FormatIpEcn implements CriterionTypeFormatter {
238 @Override
239 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
240 final IPEcnCriterion ipEcnCriterion =
241 (IPEcnCriterion) criterion;
242 return root.put(CriterionCodec.IP_ECN, ipEcnCriterion.ipEcn());
243 }
244 }
245
246 private static class FormatIpProto implements CriterionTypeFormatter {
247 @Override
248 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
249 final IPProtocolCriterion iPProtocolCriterion =
250 (IPProtocolCriterion) criterion;
251 return root.put(CriterionCodec.PROTOCOL, iPProtocolCriterion.protocol());
252 }
253 }
254
255 private static class FormatIp implements CriterionTypeFormatter {
256 @Override
257 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
258 final IPCriterion iPCriterion = (IPCriterion) criterion;
259 return root.put(CriterionCodec.IP, iPCriterion.ip().toString());
260 }
261 }
262
263 private static class FormatTcp implements CriterionTypeFormatter {
264 @Override
265 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
266 final TcpPortCriterion tcpPortCriterion =
267 (TcpPortCriterion) criterion;
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700268 return root.put(CriterionCodec.TCP_PORT, tcpPortCriterion.tcpPort().toInt());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700269 }
270 }
271
272 private static class FormatUdp implements CriterionTypeFormatter {
273 @Override
274 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
275 final UdpPortCriterion udpPortCriterion =
276 (UdpPortCriterion) criterion;
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700277 return root.put(CriterionCodec.UDP_PORT, udpPortCriterion.udpPort().toInt());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700278 }
279 }
280
281 private static class FormatSctp implements CriterionTypeFormatter {
282 @Override
283 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
284 final SctpPortCriterion sctpPortCriterion =
285 (SctpPortCriterion) criterion;
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700286 return root.put(CriterionCodec.SCTP_PORT, sctpPortCriterion.sctpPort().toInt());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700287 }
288 }
289
290 private static class FormatIcmpV4Type implements CriterionTypeFormatter {
291 @Override
292 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
293 final IcmpTypeCriterion icmpTypeCriterion =
294 (IcmpTypeCriterion) criterion;
295 return root.put(CriterionCodec.ICMP_TYPE, icmpTypeCriterion.icmpType());
296 }
297 }
298
299 private static class FormatIcmpV4Code implements CriterionTypeFormatter {
300 @Override
301 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
302 final IcmpCodeCriterion icmpCodeCriterion =
303 (IcmpCodeCriterion) criterion;
304 return root.put(CriterionCodec.ICMP_CODE, icmpCodeCriterion.icmpCode());
305 }
306 }
307
308 private static class FormatIpV6FLabel implements CriterionTypeFormatter {
309 @Override
310 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
311 final IPv6FlowLabelCriterion ipv6FlowLabelCriterion =
312 (IPv6FlowLabelCriterion) criterion;
313 return root.put(CriterionCodec.FLOW_LABEL, ipv6FlowLabelCriterion.flowLabel());
314 }
315 }
316
317 private static class FormatIcmpV6Type implements CriterionTypeFormatter {
318 @Override
319 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
320 final Icmpv6TypeCriterion icmpv6TypeCriterion =
321 (Icmpv6TypeCriterion) criterion;
322 return root.put(CriterionCodec.ICMPV6_TYPE, icmpv6TypeCriterion.icmpv6Type());
323 }
324 }
325
326 private static class FormatIcmpV6Code implements CriterionTypeFormatter {
327 @Override
328 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
329 final Icmpv6CodeCriterion icmpv6CodeCriterion =
330 (Icmpv6CodeCriterion) criterion;
331 return root.put(CriterionCodec.ICMPV6_CODE, icmpv6CodeCriterion.icmpv6Code());
332 }
333 }
334
335 private static class FormatV6NDTarget implements CriterionTypeFormatter {
336 @Override
337 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
338 final IPv6NDTargetAddressCriterion ipv6NDTargetAddressCriterion
339 = (IPv6NDTargetAddressCriterion) criterion;
340 return root.put(CriterionCodec.TARGET_ADDRESS, ipv6NDTargetAddressCriterion.targetAddress().toString());
341 }
342 }
343
344 private static class FormatV6NDTll implements CriterionTypeFormatter {
345 @Override
346 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
347 final IPv6NDLinkLayerAddressCriterion ipv6NDLinkLayerAddressCriterion
348 = (IPv6NDLinkLayerAddressCriterion) criterion;
349 return root.put(CriterionCodec.MAC, ipv6NDLinkLayerAddressCriterion.mac().toString());
350 }
351 }
352
353 private static class FormatMplsLabel implements CriterionTypeFormatter {
354 @Override
355 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
356 final MplsCriterion mplsCriterion =
357 (MplsCriterion) criterion;
358 return root.put(CriterionCodec.LABEL, mplsCriterion.label().toInt());
359 }
360 }
361
Jonathan Hartcc962d82016-08-09 16:52:22 -0700362 private static class FormatMplsBos implements CriterionTypeFormatter {
363 @Override
364 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
365 final MplsBosCriterion mplsBosCriterion =
366 (MplsBosCriterion) criterion;
367 return root.put(CriterionCodec.BOS, mplsBosCriterion.mplsBos());
368 }
369 }
370
Ray Milkeyd43fe452015-05-29 09:35:12 -0700371 private static class FormatIpV6Exthdr implements CriterionTypeFormatter {
372 @Override
373 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
374 final IPv6ExthdrFlagsCriterion exthdrCriterion =
375 (IPv6ExthdrFlagsCriterion) criterion;
376 return root.put(CriterionCodec.EXT_HDR_FLAGS, exthdrCriterion.exthdrFlags());
377 }
378 }
379
380 private static class FormatOchSigId implements CriterionTypeFormatter {
381 @Override
382 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
383 OchSignal ochSignal = ((OchSignalCriterion) criterion).lambda();
384 ObjectNode child = root.putObject(CriterionCodec.OCH_SIGNAL_ID);
385
386 child.put(CriterionCodec.GRID_TYPE, ochSignal.gridType().name());
387 child.put(CriterionCodec.CHANNEL_SPACING, ochSignal.channelSpacing().name());
388 child.put(CriterionCodec.SPACING_MULIPLIER, ochSignal.spacingMultiplier());
389 child.put(CriterionCodec.SLOT_GRANULARITY, ochSignal.slotGranularity());
390
391 return root;
392 }
393 }
394
395 private static class FormatOchSigType implements CriterionTypeFormatter {
396 @Override
397 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
398 final OchSignalTypeCriterion ochSignalTypeCriterion =
399 (OchSignalTypeCriterion) criterion;
Yafit Hadar52d81552015-10-07 12:26:52 +0300400 return root.put(CriterionCodec.OCH_SIGNAL_TYPE, ochSignalTypeCriterion.signalType().name());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700401 }
402 }
403
Hyunsun Moon7080a0d2015-08-14 19:18:48 -0700404 private static class FormatTunnelId implements CriterionTypeFormatter {
405 @Override
406 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
407 final TunnelIdCriterion tunnelIdCriterion =
408 (TunnelIdCriterion) criterion;
409 return root.put(CriterionCodec.TUNNEL_ID, tunnelIdCriterion.tunnelId());
410 }
411 }
412
Yafit Hadar52d81552015-10-07 12:26:52 +0300413 private static class FormatOduSignalId implements CriterionTypeFormatter {
414 @Override
415 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
Yafit Hadar5796d972015-10-15 13:16:11 +0300416 OduSignalId oduSignalId = ((OduSignalIdCriterion) criterion).oduSignalId();
417 ObjectNode child = root.putObject(CriterionCodec.ODU_SIGNAL_ID);
418
419 child.put(CriterionCodec.TRIBUTARY_PORT_NUMBER, oduSignalId.tributaryPortNumber());
420 child.put(CriterionCodec.TRIBUTARY_SLOT_LEN, oduSignalId.tributarySlotLength());
421 child.put(CriterionCodec.TRIBUTARY_SLOT_BITMAP, HexString.toHexString(oduSignalId.tributarySlotBitmap()));
422
423 return root;
Yafit Hadar52d81552015-10-07 12:26:52 +0300424 }
425 }
426
Yafit Hadar5796d972015-10-15 13:16:11 +0300427
Yafit Hadar52d81552015-10-07 12:26:52 +0300428 private static class FormatOduSignalType implements CriterionTypeFormatter {
429 @Override
430 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
431 final OduSignalTypeCriterion oduSignalTypeCriterion =
432 (OduSignalTypeCriterion) criterion;
433 return root.put(CriterionCodec.ODU_SIGNAL_TYPE, oduSignalTypeCriterion.signalType().name());
434 }
435 }
436
Ray Milkeyd43fe452015-05-29 09:35:12 -0700437 private class FormatDummyType implements CriterionTypeFormatter {
438
439 @Override
440 public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
441 checkNotNull(criterion, "Criterion cannot be null");
442
443 return root.put(CriterionCodec.TYPE, criterion.type().toString());
444
445 }
446 }
447
448 /**
449 * Encodes a criterion into a JSON node.
450 *
451 * @return encoded JSON object for the given criterion
452 */
453 public ObjectNode encode() {
454 final ObjectNode result = context.mapper().createObjectNode()
455 .put(CriterionCodec.TYPE, criterion.type().toString());
456
457 CriterionTypeFormatter formatter =
458 checkNotNull(
459 formatMap.get(criterion.type()),
460 "No formatter found for criterion type "
461 + criterion.type().toString());
462
463 return formatter.encodeCriterion(result, criterion);
464 }
465
466}