blob: 52ea495386ff50a666712e0ff62b61e00e92ebe5 [file] [log] [blame]
Ray Milkeyb82c42b2015-06-30 09:42:20 -07001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
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
18import org.onosproject.codec.CodecContext;
19import org.onosproject.net.DeviceId;
20import org.onosproject.net.Link;
21import org.onosproject.net.intent.Constraint;
22import org.onosproject.net.intent.constraint.AnnotationConstraint;
23import org.onosproject.net.intent.constraint.BandwidthConstraint;
Ray Milkeyb82c42b2015-06-30 09:42:20 -070024import org.onosproject.net.intent.constraint.LatencyConstraint;
25import org.onosproject.net.intent.constraint.LinkTypeConstraint;
26import org.onosproject.net.intent.constraint.ObstacleConstraint;
27import org.onosproject.net.intent.constraint.WaypointConstraint;
28
29import com.fasterxml.jackson.databind.node.ArrayNode;
30import com.fasterxml.jackson.databind.node.ObjectNode;
31
32import static com.google.common.base.Preconditions.checkNotNull;
33
34/**
35 * Implementation of encoder for constraint JSON codec.
36 */
Ray Milkey6d7968e2015-07-06 14:30:02 -070037public final class EncodeConstraintCodecHelper {
Ray Milkeyb82c42b2015-06-30 09:42:20 -070038
39 private final Constraint constraint;
40 private final CodecContext context;
41
42 /**
43 * Constructs a constraint encoder.
44 *
45 * @param constraint constraint to encode
46 * @param context to use for look ups
47 */
Ray Milkey6d7968e2015-07-06 14:30:02 -070048 public EncodeConstraintCodecHelper(Constraint constraint, CodecContext context) {
Ray Milkeyb82c42b2015-06-30 09:42:20 -070049 this.constraint = constraint;
50 this.context = context;
51 }
52
53 /**
54 * Encodes a latency constraint.
55 *
56 * @return JSON ObjectNode representing the constraint
57 */
58 private ObjectNode encodeLatencyConstraint() {
59 checkNotNull(constraint, "Duration constraint cannot be null");
60 final LatencyConstraint latencyConstraint =
61 (LatencyConstraint) constraint;
62 return context.mapper().createObjectNode()
63 .put("latencyMillis", latencyConstraint.latency().toMillis());
64 }
65
66 /**
67 * Encodes an obstacle constraint.
68 *
69 * @return JSON ObjectNode representing the constraint
70 */
71 private ObjectNode encodeObstacleConstraint() {
72 checkNotNull(constraint, "Obstacle constraint cannot be null");
73 final ObstacleConstraint obstacleConstraint =
74 (ObstacleConstraint) constraint;
75
76 final ObjectNode result = context.mapper().createObjectNode();
77 final ArrayNode jsonObstacles = result.putArray("obstacles");
78
79 for (DeviceId did : obstacleConstraint.obstacles()) {
80 jsonObstacles.add(did.toString());
81 }
82
83 return result;
84 }
85
86 /**
87 * Encodes a waypoint constraint.
88 *
89 * @return JSON ObjectNode representing the constraint
90 */
91 private ObjectNode encodeWaypointConstraint() {
92 checkNotNull(constraint, "Waypoint constraint cannot be null");
93 final WaypointConstraint waypointConstraint =
94 (WaypointConstraint) constraint;
95
96 final ObjectNode result = context.mapper().createObjectNode();
97 final ArrayNode jsonWaypoints = result.putArray("waypoints");
98
99 for (DeviceId did : waypointConstraint.waypoints()) {
100 jsonWaypoints.add(did.toString());
101 }
102
103 return result;
104 }
105
106 /**
107 * Encodes a annotation constraint.
108 *
109 * @return JSON ObjectNode representing the constraint
110 */
111 private ObjectNode encodeAnnotationConstraint() {
112 checkNotNull(constraint, "Annotation constraint cannot be null");
113 final AnnotationConstraint annotationConstraint =
114 (AnnotationConstraint) constraint;
115 return context.mapper().createObjectNode()
116 .put("key", annotationConstraint.key())
117 .put("threshold", annotationConstraint.threshold());
118 }
119
120 /**
121 * Encodes a bandwidth constraint.
122 *
123 * @return JSON ObjectNode representing the constraint
124 */
125 private ObjectNode encodeBandwidthConstraint() {
126 checkNotNull(constraint, "Bandwidth constraint cannot be null");
127 final BandwidthConstraint bandwidthConstraint =
128 (BandwidthConstraint) constraint;
129 return context.mapper().createObjectNode()
Sho SHIMIZUa88db492015-11-23 13:21:04 -0800130 .put("bandwidth", bandwidthConstraint.bandwidth().bps());
Ray Milkeyb82c42b2015-06-30 09:42:20 -0700131 }
132
133 /**
Ray Milkeyb82c42b2015-06-30 09:42:20 -0700134 * Encodes a link type constraint.
135 *
136 * @return JSON ObjectNode representing the constraint
137 */
138 private ObjectNode encodeLinkTypeConstraint() {
139 checkNotNull(constraint, "Link type constraint cannot be null");
140
141 final LinkTypeConstraint linkTypeConstraint =
142 (LinkTypeConstraint) constraint;
143
144 final ObjectNode result = context.mapper().createObjectNode()
145 .put(ConstraintCodec.INCLUSIVE, linkTypeConstraint.isInclusive());
146
147 final ArrayNode jsonTypes = result.putArray(ConstraintCodec.TYPES);
148
149 if (linkTypeConstraint.types() != null) {
150 for (Link.Type type : linkTypeConstraint.types()) {
151 jsonTypes.add(type.name());
152 }
153 }
154
155 return result;
156 }
157
158 /**
159 * Encodes the constraint in JSON.
160 *
161 * @return JSON node
162 */
163 public ObjectNode encode() {
164 final ObjectNode result;
165 if (constraint instanceof BandwidthConstraint) {
166 result = encodeBandwidthConstraint();
Ray Milkeyb82c42b2015-06-30 09:42:20 -0700167 } else if (constraint instanceof LinkTypeConstraint) {
168 result = encodeLinkTypeConstraint();
169 } else if (constraint instanceof AnnotationConstraint) {
170 result = encodeAnnotationConstraint();
171 } else if (constraint instanceof LatencyConstraint) {
172 result = encodeLatencyConstraint();
173 } else if (constraint instanceof ObstacleConstraint) {
174 result = encodeObstacleConstraint();
175 } else if (constraint instanceof WaypointConstraint) {
176 result = encodeWaypointConstraint();
177 } else {
178 result = context.mapper().createObjectNode();
179 }
180
181 result.put(ConstraintCodec.TYPE, constraint.getClass().getSimpleName());
182 return result;
183 }
184}