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