blob: a0646c7ccf4a0ef5e668ffc31916795d468f88d0 [file] [log] [blame]
Simon Huntd3ceffa2015-08-25 12:44:35 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Simon Huntd3ceffa2015-08-25 12:44:35 -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.
Simon Huntd3ceffa2015-08-25 12:44:35 -070015 */
16
Simon Hunt52560662015-08-27 22:46:44 -070017package org.onosproject.ui.topo;
Simon Huntd3ceffa2015-08-25 12:44:35 -070018
19import com.fasterxml.jackson.databind.ObjectMapper;
20import com.fasterxml.jackson.databind.node.ArrayNode;
21import com.fasterxml.jackson.databind.node.ObjectNode;
Simon Hunt52560662015-08-27 22:46:44 -070022
23import static org.onosproject.ui.JsonUtils.envelope;
Simon Huntd3ceffa2015-08-25 12:44:35 -070024
25/**
26 * JSON utilities for the Topology View.
27 */
28public final class TopoJson {
Simon Hunt743a8492015-08-25 16:18:19 -070029 // package-private for unit test access
Simon Hunt52560662015-08-27 22:46:44 -070030 static final String SHOW_HIGHLIGHTS = "showHighlights";
Simon Hunt8e258112017-05-05 13:19:04 -070031 static final String TOPO2_HIGHLIGHTS = "topo2Highlights";
Simon Hunt52560662015-08-27 22:46:44 -070032
Simon Hunt743a8492015-08-25 16:18:19 -070033 static final String DEVICES = "devices";
34 static final String HOSTS = "hosts";
35 static final String LINKS = "links";
36 static final String SUBDUE = "subdue";
Andrea Campanella2dc91dc2015-12-07 12:17:02 -080037 static final String DELAY = "delay";
Simon Huntd3ceffa2015-08-25 12:44:35 -070038
Simon Hunt743a8492015-08-25 16:18:19 -070039 static final String ID = "id";
40 static final String LABEL = "label";
41 static final String CSS = "css";
Simon Hunt85897572015-10-20 16:29:51 -070042 static final String BADGE = "badge";
Simon Hunte9343f32015-10-21 18:07:46 -070043 static final String STATUS = "status";
44 static final String TXT = "txt";
45 static final String GID = "gid";
Simon Hunt85897572015-10-20 16:29:51 -070046 static final String MSG = "msg";
Simon Huntd3ceffa2015-08-25 12:44:35 -070047
Simon Hunt743a8492015-08-25 16:18:19 -070048 static final String TITLE = "title";
49 static final String TYPE = "type";
Simon Hunt10618f62017-06-15 19:30:52 -070050 static final String NAV_PATH = "navPath";
Simon Hunt743a8492015-08-25 16:18:19 -070051 static final String PROP_ORDER = "propOrder";
Simon Hunt879ce452017-08-10 23:32:00 -070052 static final String PROP_LABELS = "propLabels";
53 static final String PROP_VALUES = "propValues";
Simon Hunt743a8492015-08-25 16:18:19 -070054 static final String BUTTONS = "buttons";
Simon Huntd3ceffa2015-08-25 12:44:35 -070055
56
57 private static final ObjectMapper MAPPER = new ObjectMapper();
58
59 private static ObjectNode objectNode() {
60 return MAPPER.createObjectNode();
61 }
62
63 private static ArrayNode arrayNode() {
64 return MAPPER.createArrayNode();
65 }
66
67 // non-instantiable
Simon Hunt10618f62017-06-15 19:30:52 -070068 private TopoJson() {
69 }
Simon Huntd3ceffa2015-08-25 12:44:35 -070070
71 /**
Simon Hunt52560662015-08-27 22:46:44 -070072 * Returns a formatted message ready to send to the topology view
73 * to render highlights.
74 *
75 * @param highlights highlights model to transform
76 * @return fully formatted "show highlights" message
77 */
78 public static ObjectNode highlightsMessage(Highlights highlights) {
79 return envelope(SHOW_HIGHLIGHTS, json(highlights));
80 }
81
82 /**
Simon Hunt8e258112017-05-05 13:19:04 -070083 * Returns a formatted message ready to send to the topology-2 view
84 * to render highlights.
85 *
86 * @param highlights highlights model to transform
87 * @return fully formatted "show highlights" message
88 */
89 public static ObjectNode topo2HighlightsMessage(Highlights highlights) {
90 return envelope(TOPO2_HIGHLIGHTS, json(highlights));
91 }
92
93 /**
Simon Huntd3ceffa2015-08-25 12:44:35 -070094 * Transforms the given highlights model into a JSON message payload.
95 *
96 * @param highlights the model to transform
97 * @return JSON payload
98 */
99 public static ObjectNode json(Highlights highlights) {
100 ObjectNode payload = objectNode();
101
102 ArrayNode devices = arrayNode();
103 ArrayNode hosts = arrayNode();
104 ArrayNode links = arrayNode();
105
106 payload.set(DEVICES, devices);
107 payload.set(HOSTS, hosts);
108 payload.set(LINKS, links);
109
110 highlights.devices().forEach(dh -> devices.add(json(dh)));
111 highlights.hosts().forEach(hh -> hosts.add(json(hh)));
112 highlights.links().forEach(lh -> links.add(json(lh)));
113
Simon Hunt743a8492015-08-25 16:18:19 -0700114 Highlights.Amount toSubdue = highlights.subdueLevel();
115 if (!toSubdue.equals(Highlights.Amount.ZERO)) {
116 payload.put(SUBDUE, toSubdue.toString());
117 }
Andrea Campanella2dc91dc2015-12-07 12:17:02 -0800118 int delay = highlights.delayMs();
119 if (delay > 0) {
120 payload.put(DELAY, delay);
121 }
Simon Huntd3ceffa2015-08-25 12:44:35 -0700122 return payload;
123 }
124
Simon Hunte9343f32015-10-21 18:07:46 -0700125 private static ObjectNode json(NodeBadge b) {
126 ObjectNode n = objectNode()
127 .put(STATUS, b.status().code())
128 .put(b.isGlyph() ? GID : TXT, b.text());
129 if (b.message() != null) {
130 n.put(MSG, b.message());
131 }
132 return n;
133 }
134
Simon Huntd3ceffa2015-08-25 12:44:35 -0700135 private static ObjectNode json(DeviceHighlight dh) {
Simon Hunt5b3ff902015-08-27 09:46:27 -0700136 ObjectNode n = objectNode()
Simon Hunt94f7dae2015-08-26 17:40:59 -0700137 .put(ID, dh.elementId());
Simon Hunt5b3ff902015-08-27 09:46:27 -0700138 if (dh.subdued()) {
139 n.put(SUBDUE, true);
140 }
Simon Hunt85897572015-10-20 16:29:51 -0700141 NodeBadge badge = dh.badge();
142 if (badge != null) {
Simon Hunte9343f32015-10-21 18:07:46 -0700143 n.set(BADGE, json(badge));
Simon Hunt85897572015-10-20 16:29:51 -0700144 }
Simon Hunt5b3ff902015-08-27 09:46:27 -0700145 return n;
Simon Huntd3ceffa2015-08-25 12:44:35 -0700146 }
147
148 private static ObjectNode json(HostHighlight hh) {
Simon Hunt5b3ff902015-08-27 09:46:27 -0700149 ObjectNode n = objectNode()
Simon Hunt94f7dae2015-08-26 17:40:59 -0700150 .put(ID, hh.elementId());
Simon Hunt5b3ff902015-08-27 09:46:27 -0700151 if (hh.subdued()) {
152 n.put(SUBDUE, true);
153 }
Andrea Campanella52125412015-12-03 14:50:40 -0800154 NodeBadge badge = hh.badge();
155 if (badge != null) {
156 n.set(BADGE, json(badge));
157 }
Simon Hunt5b3ff902015-08-27 09:46:27 -0700158 return n;
Simon Huntd3ceffa2015-08-25 12:44:35 -0700159 }
160
161 private static ObjectNode json(LinkHighlight lh) {
Simon Hunt5b3ff902015-08-27 09:46:27 -0700162 ObjectNode n = objectNode()
Simon Huntd3ceffa2015-08-25 12:44:35 -0700163 .put(ID, lh.elementId())
164 .put(LABEL, lh.label())
165 .put(CSS, lh.cssClasses());
Simon Hunt5b3ff902015-08-27 09:46:27 -0700166 if (lh.subdued()) {
167 n.put(SUBDUE, true);
168 }
169 return n;
Simon Huntd3ceffa2015-08-25 12:44:35 -0700170 }
171
172 /**
173 * Translates the given property panel into JSON, for returning
174 * to the client.
175 *
176 * @param pp the property panel model
177 * @return JSON payload
178 */
179 public static ObjectNode json(PropertyPanel pp) {
180 ObjectNode result = objectNode()
181 .put(TITLE, pp.title())
182 .put(TYPE, pp.typeId())
183 .put(ID, pp.id());
184
Simon Hunt10618f62017-06-15 19:30:52 -0700185 if (pp.navPath() != null) {
186 result.put(NAV_PATH, pp.navPath());
187 }
188
Simon Hunt879ce452017-08-10 23:32:00 -0700189 ObjectNode plabels = objectNode();
190 ObjectNode pvalues = objectNode();
Simon Huntd3ceffa2015-08-25 12:44:35 -0700191 ArrayNode porder = arrayNode();
192 for (PropertyPanel.Prop p : pp.properties()) {
193 porder.add(p.key());
Simon Hunt879ce452017-08-10 23:32:00 -0700194 plabels.put(p.key(), p.label());
195 pvalues.put(p.key(), p.value());
Simon Huntd3ceffa2015-08-25 12:44:35 -0700196 }
197 result.set(PROP_ORDER, porder);
Simon Hunt879ce452017-08-10 23:32:00 -0700198 result.set(PROP_LABELS, plabels);
199 result.set(PROP_VALUES, pvalues);
Simon Huntd3ceffa2015-08-25 12:44:35 -0700200
201 ArrayNode buttons = arrayNode();
202 for (ButtonId b : pp.buttons()) {
203 buttons.add(b.id());
204 }
205 result.set(BUTTONS, buttons);
206 return result;
207 }
208
209}