blob: dd9563c74bdab9c02168b1656a8946fc37d10181 [file] [log] [blame]
Ray Milkeyb9a8a182015-01-20 14:15:35 -08001/*
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.codec.JsonCodec;
20import org.onosproject.net.DeviceId;
21import org.onosproject.net.Link;
22import org.onosproject.net.intent.Constraint;
23import org.onosproject.net.intent.constraint.AnnotationConstraint;
24import org.onosproject.net.intent.constraint.BandwidthConstraint;
25import org.onosproject.net.intent.constraint.LambdaConstraint;
26import org.onosproject.net.intent.constraint.LatencyConstraint;
27import org.onosproject.net.intent.constraint.LinkTypeConstraint;
28import org.onosproject.net.intent.constraint.ObstacleConstraint;
29import org.onosproject.net.intent.constraint.WaypointConstraint;
30
31import com.fasterxml.jackson.databind.node.ArrayNode;
32import com.fasterxml.jackson.databind.node.ObjectNode;
33
34import static com.google.common.base.Preconditions.checkNotNull;
35
36/**
37 * Constraint JSON codec.
38 */
Ray Milkey540b2ce2015-02-04 17:50:20 -080039public final class ConstraintCodec extends JsonCodec<Constraint> {
Ray Milkeyb9a8a182015-01-20 14:15:35 -080040
41 /**
42 * Encodes a latency constraint.
43 *
44 * @param constraint latency constraint to encode
45 * @param context code context
46 * @return JSON ObjectNode representing the constraint
47 */
48 private ObjectNode encodeLatencyConstraint(Constraint constraint,
49 CodecContext context) {
50 checkNotNull(constraint, "Duration constraint cannot be null");
51 final LatencyConstraint latencyConstraint =
52 (LatencyConstraint) constraint;
53 return context.mapper().createObjectNode()
54 .put("latencyMillis", latencyConstraint.latency().toMillis());
55 }
56
57 /**
58 * Encodes an obstacle constraint.
59 *
60 * @param constraint obstacle constraint to encode
61 * @param context code context
62 * @return JSON ObjectNode representing the constraint
63 */
64 private ObjectNode encodeObstacleConstraint(Constraint constraint,
65 CodecContext context) {
66 checkNotNull(constraint, "Obstacle constraint cannot be null");
67 final ObstacleConstraint obstacleConstraint =
68 (ObstacleConstraint) constraint;
69
70 final ObjectNode result = context.mapper().createObjectNode();
71 final ArrayNode jsonObstacles = result.putArray("obstacles");
72
73 for (DeviceId did : obstacleConstraint.obstacles()) {
74 jsonObstacles.add(did.toString());
75 }
76
77 return result;
78 }
79
80 /**
81 * Encodes a waypoint constraint.
82 *
83 * @param constraint waypoint constraint to encode
84 * @param context code context
85 * @return JSON ObjectNode representing the constraint
86 */
87 private ObjectNode encodeWaypointConstraint(Constraint constraint,
88 CodecContext context) {
89 checkNotNull(constraint, "Waypoint constraint cannot be null");
90 final WaypointConstraint waypointConstraint =
91 (WaypointConstraint) constraint;
92
93 final ObjectNode result = context.mapper().createObjectNode();
94 final ArrayNode jsonWaypoints = result.putArray("waypoints");
95
96 for (DeviceId did : waypointConstraint.waypoints()) {
97 jsonWaypoints.add(did.toString());
98 }
99
100 return result;
101 }
102
103 /**
104 * Encodes a annotation constraint.
105 *
106 * @param constraint annotation constraint to encode
107 * @param context code context
108 * @return JSON ObjectNode representing the constraint
109 */
110 private ObjectNode encodeAnnotationConstraint(Constraint constraint,
111 CodecContext context) {
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 * @param constraint bandwidth constraint to encode
124 * @param context code context
125 * @return JSON ObjectNode representing the constraint
126 */
127 private ObjectNode encodeBandwidthConstraint(Constraint constraint,
128 CodecContext context) {
129 checkNotNull(constraint, "Bandwidth constraint cannot be null");
130 final BandwidthConstraint bandwidthConstraint =
131 (BandwidthConstraint) constraint;
132 return context.mapper().createObjectNode()
133 .put("bandwidth", bandwidthConstraint.bandwidth().toDouble());
134 }
135
136 /**
137 * Encodes a lambda constraint.
138 *
139 * @param constraint lambda constraint to encode
140 * @param context code context
141 * @return JSON ObjectNode representing the constraint
142 */
143 private ObjectNode encodeLambdaConstraint(Constraint constraint,
144 CodecContext context) {
145 checkNotNull(constraint, "Lambda constraint cannot be null");
146 final LambdaConstraint lambdaConstraint =
147 (LambdaConstraint) constraint;
148
149 return context.mapper().createObjectNode()
150 .put("lambda", lambdaConstraint.lambda().toInt());
151 }
152
153 /**
154 * Encodes a link type constraint.
155 *
156 * @param constraint link type constraint to encode
157 * @param context code context
158 * @return JSON ObjectNode representing the constraint
159 */
160 private ObjectNode encodeLinkTypeConstraint(Constraint constraint,
161 CodecContext context) {
162 checkNotNull(constraint, "Link type constraint cannot be null");
163
164 final LinkTypeConstraint linkTypeConstraint =
165 (LinkTypeConstraint) constraint;
166
167 final ObjectNode result = context.mapper().createObjectNode()
168 .put("inclusive", linkTypeConstraint.isInclusive());
169
170 final ArrayNode jsonTypes = result.putArray("types");
171
172 if (linkTypeConstraint.types() != null) {
173 for (Link.Type type : linkTypeConstraint.types()) {
174 jsonTypes.add(type.name());
175 }
176 }
177
178 return result;
179 }
180
181 @Override
182 public ObjectNode encode(Constraint constraint, CodecContext context) {
183 checkNotNull(constraint, "Constraint cannot be null");
184
185 final ObjectNode result;
186 if (constraint instanceof BandwidthConstraint) {
187 result = encodeBandwidthConstraint(constraint, context);
188 } else if (constraint instanceof LambdaConstraint) {
189 result = encodeLambdaConstraint(constraint, context);
190 } else if (constraint instanceof LinkTypeConstraint) {
191 result = encodeLinkTypeConstraint(constraint, context);
192 } else if (constraint instanceof AnnotationConstraint) {
193 result = encodeAnnotationConstraint(constraint, context);
194 } else if (constraint instanceof LatencyConstraint) {
195 result = encodeLatencyConstraint(constraint, context);
196 } else if (constraint instanceof ObstacleConstraint) {
197 result = encodeObstacleConstraint(constraint, context);
198 } else if (constraint instanceof WaypointConstraint) {
199 result = encodeWaypointConstraint(constraint, context);
200 } else {
201 result = context.mapper().createObjectNode();
202 }
203
204 result.put("type", constraint.getClass().getSimpleName());
205 return result;
206 }
207}