GUI -- Huge Refactoring of server-side message handlers (Part Two).
--- Well, it compiles, and seems to work, with the cursory testing I've done... Change-Id: I0e59657c134e109850e4770766083370dfd9fdc2
Showing
17 changed files
with
767 additions
and
381 deletions
... | @@ -27,10 +27,11 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; | ... | @@ -27,10 +27,11 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; |
27 | import org.apache.felix.scr.annotations.Service; | 27 | import org.apache.felix.scr.annotations.Service; |
28 | import org.onlab.osgi.ServiceDirectory; | 28 | import org.onlab.osgi.ServiceDirectory; |
29 | import org.onosproject.intentperf.IntentPerfCollector.Sample; | 29 | import org.onosproject.intentperf.IntentPerfCollector.Sample; |
30 | +import org.onosproject.ui.RequestHandler; | ||
30 | import org.onosproject.ui.UiConnection; | 31 | import org.onosproject.ui.UiConnection; |
31 | import org.onosproject.ui.UiExtension; | 32 | import org.onosproject.ui.UiExtension; |
32 | import org.onosproject.ui.UiExtensionService; | 33 | import org.onosproject.ui.UiExtensionService; |
33 | -import org.onosproject.ui.UiMessageHandler; | 34 | +import org.onosproject.ui.UiMessageHandlerTwo; |
34 | import org.onosproject.ui.UiView; | 35 | import org.onosproject.ui.UiView; |
35 | 36 | ||
36 | import java.util.Collection; | 37 | import java.util.Collection; |
... | @@ -48,14 +49,20 @@ import static org.onosproject.ui.UiView.Category.OTHER; | ... | @@ -48,14 +49,20 @@ import static org.onosproject.ui.UiView.Category.OTHER; |
48 | @Service(value = IntentPerfUi.class) | 49 | @Service(value = IntentPerfUi.class) |
49 | public class IntentPerfUi { | 50 | public class IntentPerfUi { |
50 | 51 | ||
52 | + private static final String INTENT_PERF_START = "intentPerfStart"; | ||
53 | + private static final String INTENT_PERF_STOP = "intentPerfStop"; | ||
54 | + | ||
51 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 55 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
52 | protected UiExtensionService uiExtensionService; | 56 | protected UiExtensionService uiExtensionService; |
53 | 57 | ||
54 | private final Set<StreamingControl> handlers = synchronizedSet(new HashSet<>()); | 58 | private final Set<StreamingControl> handlers = synchronizedSet(new HashSet<>()); |
55 | 59 | ||
56 | - private List<UiView> views = ImmutableList.of(new UiView(OTHER, "intentPerf", "Intent Performance")); | 60 | + private List<UiView> views = ImmutableList.of( |
57 | - private UiExtension uiExtension = new UiExtension(views, this::newHandlers, | 61 | + new UiView(OTHER, "intentPerf", "Intent Performance") |
58 | - getClass().getClassLoader()); | 62 | + ); |
63 | + | ||
64 | + private UiExtension uiExtension = | ||
65 | + new UiExtension(views, this::newHandlers, getClass().getClassLoader()); | ||
59 | 66 | ||
60 | private IntentPerfCollector collector; | 67 | private IntentPerfCollector collector; |
61 | 68 | ||
... | @@ -90,25 +97,22 @@ public class IntentPerfUi { | ... | @@ -90,25 +97,22 @@ public class IntentPerfUi { |
90 | } | 97 | } |
91 | 98 | ||
92 | // Creates and returns session specific message handler. | 99 | // Creates and returns session specific message handler. |
93 | - private Collection<UiMessageHandler> newHandlers() { | 100 | + private Collection<UiMessageHandlerTwo> newHandlers() { |
94 | return ImmutableList.of(new StreamingControl()); | 101 | return ImmutableList.of(new StreamingControl()); |
95 | } | 102 | } |
96 | 103 | ||
104 | + | ||
97 | // UI Message handlers for turning on/off reporting to a session. | 105 | // UI Message handlers for turning on/off reporting to a session. |
98 | - private class StreamingControl extends UiMessageHandler { | 106 | + private class StreamingControl extends UiMessageHandlerTwo { |
99 | 107 | ||
100 | private boolean streamingEnabled = false; | 108 | private boolean streamingEnabled = false; |
101 | 109 | ||
102 | - protected StreamingControl() { | ||
103 | - super(ImmutableSet.of("intentPerfStart", "intentPerfStop")); | ||
104 | - } | ||
105 | - | ||
106 | @Override | 110 | @Override |
107 | - public void process(ObjectNode message) { | 111 | + protected Collection<RequestHandler> getHandlers() { |
108 | - streamingEnabled = message.path("event").asText("unknown").equals("intentPerfStart"); | 112 | + return ImmutableSet.of( |
109 | - if (streamingEnabled) { | 113 | + new IntentPerfStart(), |
110 | - sendInitData(); | 114 | + new IntentPerfStop() |
111 | - } | 115 | + ); |
112 | } | 116 | } |
113 | 117 | ||
114 | @Override | 118 | @Override |
... | @@ -129,17 +133,6 @@ public class IntentPerfUi { | ... | @@ -129,17 +133,6 @@ public class IntentPerfUi { |
129 | } | 133 | } |
130 | } | 134 | } |
131 | 135 | ||
132 | - private void sendInitData() { | ||
133 | - ObjectNode rootNode = mapper.createObjectNode(); | ||
134 | - ArrayNode an = mapper.createArrayNode(); | ||
135 | - ArrayNode sn = mapper.createArrayNode(); | ||
136 | - rootNode.set("headers", an); | ||
137 | - rootNode.set("samples", sn); | ||
138 | - | ||
139 | - collector.getSampleHeaders().forEach(an::add); | ||
140 | - collector.getSamples().forEach(s -> sn.add(sampleNode(s))); | ||
141 | - connection().sendMessage("intentPerfInit", 0, rootNode); | ||
142 | - } | ||
143 | 136 | ||
144 | private ObjectNode sampleNode(Sample sample) { | 137 | private ObjectNode sampleNode(Sample sample) { |
145 | ObjectNode sampleNode = mapper.createObjectNode(); | 138 | ObjectNode sampleNode = mapper.createObjectNode(); |
... | @@ -153,6 +146,47 @@ public class IntentPerfUi { | ... | @@ -153,6 +146,47 @@ public class IntentPerfUi { |
153 | return sampleNode; | 146 | return sampleNode; |
154 | } | 147 | } |
155 | 148 | ||
149 | + // ====================================================================== | ||
150 | + | ||
151 | + private final class IntentPerfStart extends RequestHandler { | ||
152 | + | ||
153 | + private IntentPerfStart() { | ||
154 | + super(INTENT_PERF_START); | ||
155 | + } | ||
156 | + | ||
157 | + @Override | ||
158 | + public void process(long sid, ObjectNode payload) { | ||
159 | + streamingEnabled = true; | ||
160 | + sendInitData(); | ||
161 | + } | ||
162 | + | ||
163 | + private void sendInitData() { | ||
164 | + ObjectNode rootNode = MAPPER.createObjectNode(); | ||
165 | + ArrayNode an = MAPPER.createArrayNode(); | ||
166 | + ArrayNode sn = MAPPER.createArrayNode(); | ||
167 | + rootNode.set("headers", an); | ||
168 | + rootNode.set("samples", sn); | ||
169 | + | ||
170 | + collector.getSampleHeaders().forEach(an::add); | ||
171 | + collector.getSamples().forEach(s -> sn.add(sampleNode(s))); | ||
172 | + sendMessage("intentPerfInit", 0, rootNode); | ||
173 | + } | ||
174 | + } | ||
175 | + | ||
176 | + // ====================================================================== | ||
177 | + | ||
178 | + private final class IntentPerfStop extends RequestHandler { | ||
179 | + | ||
180 | + private IntentPerfStop() { | ||
181 | + super(INTENT_PERF_STOP); | ||
182 | + } | ||
183 | + | ||
184 | + @Override | ||
185 | + public void process(long sid, ObjectNode payload) { | ||
186 | + streamingEnabled = false; | ||
187 | + } | ||
188 | + } | ||
189 | + | ||
156 | } | 190 | } |
157 | 191 | ||
158 | } | 192 | } | ... | ... |
... | @@ -61,6 +61,17 @@ public final class JsonUtils { | ... | @@ -61,6 +61,17 @@ public final class JsonUtils { |
61 | } | 61 | } |
62 | 62 | ||
63 | /** | 63 | /** |
64 | + * Returns the sequence identifier from the specified event, or 0 (zero) | ||
65 | + * if the "sid" property does not exist. | ||
66 | + * | ||
67 | + * @param event message event | ||
68 | + * @return extracted sequence identifier | ||
69 | + */ | ||
70 | + public static long sid(ObjectNode event) { | ||
71 | + return number(event, "sid"); | ||
72 | + } | ||
73 | + | ||
74 | + /** | ||
64 | * Returns the payload from the specified event. | 75 | * Returns the payload from the specified event. |
65 | * | 76 | * |
66 | * @param event message event | 77 | * @param event message event |
... | @@ -95,7 +106,7 @@ public final class JsonUtils { | ... | @@ -95,7 +106,7 @@ public final class JsonUtils { |
95 | /** | 106 | /** |
96 | * Returns the specified node property as a string, with a default fallback. | 107 | * Returns the specified node property as a string, with a default fallback. |
97 | * | 108 | * |
98 | - * @param node message event | 109 | + * @param node object node |
99 | * @param name property name | 110 | * @param name property name |
100 | * @param defaultValue fallback value if property is absent | 111 | * @param defaultValue fallback value if property is absent |
101 | * @return property as a string | 112 | * @return property as a string |
... | @@ -104,4 +115,15 @@ public final class JsonUtils { | ... | @@ -104,4 +115,15 @@ public final class JsonUtils { |
104 | return node.path(name).asText(defaultValue); | 115 | return node.path(name).asText(defaultValue); |
105 | } | 116 | } |
106 | 117 | ||
118 | + /** | ||
119 | + * Returns the specified node property as an object node. | ||
120 | + * | ||
121 | + * @param node object node | ||
122 | + * @param name property name | ||
123 | + * @return property as a node | ||
124 | + */ | ||
125 | + public static ObjectNode node(ObjectNode node, String name) { | ||
126 | + return (ObjectNode) node.path(name); | ||
127 | + } | ||
128 | + | ||
107 | } | 129 | } | ... | ... |
1 | +/* | ||
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 | + */ | ||
16 | +package org.onosproject.ui; | ||
17 | + | ||
18 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
19 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
20 | + | ||
21 | +/** | ||
22 | + * Abstraction of an entity that handles a specific request from the | ||
23 | + * user interface client. | ||
24 | + * | ||
25 | + * @see UiMessageHandlerTwo | ||
26 | + */ | ||
27 | +public abstract class RequestHandler { | ||
28 | + | ||
29 | + protected static final ObjectMapper MAPPER = new ObjectMapper(); | ||
30 | + | ||
31 | + private final String eventType; | ||
32 | + private UiMessageHandlerTwo parent; | ||
33 | + | ||
34 | + | ||
35 | + public RequestHandler(String eventType) { | ||
36 | + this.eventType = eventType; | ||
37 | + } | ||
38 | + | ||
39 | + // package private | ||
40 | + void setParent(UiMessageHandlerTwo parent) { | ||
41 | + this.parent = parent; | ||
42 | + } | ||
43 | + | ||
44 | + /** | ||
45 | + * Returns the event type that this handler handles. | ||
46 | + * | ||
47 | + * @return event type | ||
48 | + */ | ||
49 | + public String eventType() { | ||
50 | + return eventType; | ||
51 | + } | ||
52 | + | ||
53 | + /** | ||
54 | + * Processes the incoming message payload from the client. | ||
55 | + * | ||
56 | + * @param sid message sequence identifier | ||
57 | + * @param payload request message payload | ||
58 | + */ | ||
59 | + public abstract void process(long sid, ObjectNode payload); | ||
60 | + | ||
61 | + | ||
62 | + | ||
63 | + // =================================================================== | ||
64 | + // === Convenience methods... | ||
65 | + | ||
66 | + /** | ||
67 | + * Returns implementation of the specified service class. | ||
68 | + * | ||
69 | + * @param serviceClass service class | ||
70 | + * @param <T> type of service | ||
71 | + * @return implementation class | ||
72 | + * @throws org.onlab.osgi.ServiceNotFoundException if no implementation found | ||
73 | + */ | ||
74 | + protected <T> T get(Class<T> serviceClass) { | ||
75 | + return parent.directory().get(serviceClass); | ||
76 | + } | ||
77 | + | ||
78 | + /** | ||
79 | + * Sends a message back to the client. | ||
80 | + * | ||
81 | + * @param eventType message event type | ||
82 | + * @param sid message sequence identifier | ||
83 | + * @param payload message payload | ||
84 | + */ | ||
85 | + protected void sendMessage(String eventType, long sid, ObjectNode payload) { | ||
86 | + parent.connection().sendMessage(eventType, sid, payload); | ||
87 | + } | ||
88 | + | ||
89 | + /** | ||
90 | + * Sends a message back to the client. | ||
91 | + * Here, the message is preformatted; the assumption is it has its | ||
92 | + * eventType, sid and payload attributes already filled in. | ||
93 | + * | ||
94 | + * @param message the message to send | ||
95 | + */ | ||
96 | + protected void sendMessage(ObjectNode message) { | ||
97 | + parent.connection().sendMessage(message); | ||
98 | + } | ||
99 | + | ||
100 | + /** | ||
101 | + * Allows one request handler to pass the event on to another for | ||
102 | + * further processing. | ||
103 | + * Note that the message handlers must be defined in the same parent. | ||
104 | + * | ||
105 | + * @param eventType event type | ||
106 | + * @param sid sequence identifier | ||
107 | + * @param payload message payload | ||
108 | + */ | ||
109 | + protected void chain(String eventType, long sid, ObjectNode payload) { | ||
110 | + parent.exec(eventType, sid, payload); | ||
111 | + } | ||
112 | + | ||
113 | + // =================================================================== | ||
114 | + | ||
115 | + | ||
116 | + // FIXME : Javadocs | ||
117 | + protected String string(ObjectNode node, String key) { | ||
118 | + return JsonUtils.string(node, key); | ||
119 | + } | ||
120 | + | ||
121 | + protected String string(ObjectNode node, String key, String defValue) { | ||
122 | + return JsonUtils.string(node, key, defValue); | ||
123 | + } | ||
124 | + | ||
125 | +} |
... | @@ -40,6 +40,7 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -40,6 +40,7 @@ import static com.google.common.base.Preconditions.checkNotNull; |
40 | * } | 40 | * } |
41 | * </pre> | 41 | * </pre> |
42 | */ | 42 | */ |
43 | +@Deprecated | ||
43 | public abstract class UiMessageHandler { | 44 | public abstract class UiMessageHandler { |
44 | 45 | ||
45 | private final Set<String> messageTypes; | 46 | private final Set<String> messageTypes; | ... | ... |
... | @@ -28,6 +28,6 @@ public interface UiMessageHandlerFactory { | ... | @@ -28,6 +28,6 @@ public interface UiMessageHandlerFactory { |
28 | * | 28 | * |
29 | * @return collection of new handlers | 29 | * @return collection of new handlers |
30 | */ | 30 | */ |
31 | - Collection<UiMessageHandler> newHandlers(); | 31 | + Collection<UiMessageHandlerTwo> newHandlers(); |
32 | 32 | ||
33 | } | 33 | } | ... | ... |
1 | +/* | ||
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 | + */ | ||
16 | +package org.onosproject.ui; | ||
17 | + | ||
18 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
19 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
20 | +import org.onlab.osgi.ServiceDirectory; | ||
21 | + | ||
22 | +import java.util.Collection; | ||
23 | +import java.util.Collections; | ||
24 | +import java.util.HashMap; | ||
25 | +import java.util.Map; | ||
26 | +import java.util.Set; | ||
27 | + | ||
28 | +import static com.google.common.base.Preconditions.checkArgument; | ||
29 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
30 | + | ||
31 | +/** | ||
32 | + * Abstraction of an entity capable of processing a JSON message from the user | ||
33 | + * interface client. | ||
34 | + * <p> | ||
35 | + * The message is a JSON object with the following structure: | ||
36 | + * </p> | ||
37 | + * <pre> | ||
38 | + * { | ||
39 | + * "type": "<em>event-type</em>", | ||
40 | + * "sid": "<em>sequence-number</em>", | ||
41 | + * "payload": { | ||
42 | + * <em>arbitrary JSON object structure</em> | ||
43 | + * } | ||
44 | + * } | ||
45 | + * </pre> | ||
46 | + */ | ||
47 | +public abstract class UiMessageHandlerTwo { | ||
48 | + | ||
49 | + private final Map<String, RequestHandler> handlerMap = new HashMap<>(); | ||
50 | + | ||
51 | + private UiConnection connection; | ||
52 | + private ServiceDirectory directory; | ||
53 | + | ||
54 | + /** | ||
55 | + * Mapper for creating ObjectNodes and ArrayNodes etc. | ||
56 | + */ | ||
57 | + protected final ObjectMapper mapper = new ObjectMapper(); | ||
58 | + | ||
59 | + /** | ||
60 | + * Binds the handlers returned from {@link #getHandlers()} to this | ||
61 | + * instance. | ||
62 | + */ | ||
63 | + void bindHandlers() { | ||
64 | + Collection<RequestHandler> handlers = getHandlers(); | ||
65 | + checkNotNull(handlers, "Handlers cannot be null"); | ||
66 | + checkArgument(!handlers.isEmpty(), "Handlers cannot be empty"); | ||
67 | + | ||
68 | + for (RequestHandler h : handlers) { | ||
69 | + h.setParent(this); | ||
70 | + handlerMap.put(h.eventType(), h); | ||
71 | + } | ||
72 | + } | ||
73 | + | ||
74 | + /** | ||
75 | + * Subclasses must return the collection of handlers for the | ||
76 | + * message types they handle. | ||
77 | + * | ||
78 | + * @return the message handler instances | ||
79 | + */ | ||
80 | + protected abstract Collection<RequestHandler> getHandlers(); | ||
81 | + | ||
82 | + /** | ||
83 | + * Returns the set of message types which this handler is capable of | ||
84 | + * processing. | ||
85 | + * | ||
86 | + * @return set of message types | ||
87 | + */ | ||
88 | + public Set<String> messageTypes() { | ||
89 | + return Collections.unmodifiableSet(handlerMap.keySet()); | ||
90 | + } | ||
91 | + | ||
92 | + /** | ||
93 | + * Processes a JSON message from the user interface client. | ||
94 | + * | ||
95 | + * @param message JSON message | ||
96 | + */ | ||
97 | + public void process(ObjectNode message) { | ||
98 | + String type = JsonUtils.eventType(message); | ||
99 | + long sid = JsonUtils.sid(message); | ||
100 | + ObjectNode payload = JsonUtils.payload(message); | ||
101 | + exec(type, sid, payload); | ||
102 | + } | ||
103 | + | ||
104 | + /** | ||
105 | + * Finds the appropriate handler and executes the process method. | ||
106 | + * | ||
107 | + * @param eventType event type | ||
108 | + * @param sid sequence identifier | ||
109 | + * @param payload message payload | ||
110 | + */ | ||
111 | + void exec(String eventType, long sid, ObjectNode payload) { | ||
112 | + RequestHandler handler = handlerMap.get(eventType); | ||
113 | + if (handler != null) { | ||
114 | + handler.process(sid, payload); | ||
115 | + } | ||
116 | + } | ||
117 | + | ||
118 | + /** | ||
119 | + * Initializes the handler with the user interface connection and | ||
120 | + * service directory context. | ||
121 | + * | ||
122 | + * @param connection user interface connection | ||
123 | + * @param directory service directory | ||
124 | + */ | ||
125 | + public void init(UiConnection connection, ServiceDirectory directory) { | ||
126 | + this.connection = connection; | ||
127 | + this.directory = directory; | ||
128 | + bindHandlers(); | ||
129 | + } | ||
130 | + | ||
131 | + /** | ||
132 | + * Destroys the message handler context. | ||
133 | + */ | ||
134 | + public void destroy() { | ||
135 | + this.connection = null; | ||
136 | + this.directory = null; | ||
137 | + } | ||
138 | + | ||
139 | + /** | ||
140 | + * Returns the user interface connection with which this handler was primed. | ||
141 | + * | ||
142 | + * @return user interface connection | ||
143 | + */ | ||
144 | + public UiConnection connection() { | ||
145 | + return connection; | ||
146 | + } | ||
147 | + | ||
148 | + /** | ||
149 | + * Returns the user interface connection with which this handler was primed. | ||
150 | + * | ||
151 | + * @return user interface connection | ||
152 | + */ | ||
153 | + public ServiceDirectory directory() { | ||
154 | + return directory; | ||
155 | + } | ||
156 | + | ||
157 | + /** | ||
158 | + * Returns implementation of the specified service class. | ||
159 | + * | ||
160 | + * @param serviceClass service class | ||
161 | + * @param <T> type of service | ||
162 | + * @return implementation class | ||
163 | + * @throws org.onlab.osgi.ServiceNotFoundException if no implementation found | ||
164 | + */ | ||
165 | + protected <T> T get(Class<T> serviceClass) { | ||
166 | + return directory.get(serviceClass); | ||
167 | + } | ||
168 | + | ||
169 | +} |
... | @@ -73,4 +73,19 @@ public abstract class AbstractTableRow implements TableRow { | ... | @@ -73,4 +73,19 @@ public abstract class AbstractTableRow implements TableRow { |
73 | protected void add(String id, Object value) { | 73 | protected void add(String id, Object value) { |
74 | cells.put(id, value.toString()); | 74 | cells.put(id, value.toString()); |
75 | } | 75 | } |
76 | + | ||
77 | + /** | ||
78 | + * Concatenates an arbitrary number of objects, using their | ||
79 | + * toString() methods. | ||
80 | + * | ||
81 | + * @param items the items to concatenate | ||
82 | + * @return a concatenated string | ||
83 | + */ | ||
84 | + protected static String concat(Object... items) { | ||
85 | + StringBuilder sb = new StringBuilder(); | ||
86 | + for (Object o : items) { | ||
87 | + sb.append(o); | ||
88 | + } | ||
89 | + return sb.toString(); | ||
90 | + } | ||
76 | } | 91 | } | ... | ... |
... | @@ -22,13 +22,15 @@ import org.onosproject.app.ApplicationService; | ... | @@ -22,13 +22,15 @@ import org.onosproject.app.ApplicationService; |
22 | import org.onosproject.app.ApplicationState; | 22 | import org.onosproject.app.ApplicationState; |
23 | import org.onosproject.core.Application; | 23 | import org.onosproject.core.Application; |
24 | import org.onosproject.core.ApplicationId; | 24 | import org.onosproject.core.ApplicationId; |
25 | -import org.onosproject.ui.UiMessageHandler; | 25 | +import org.onosproject.ui.RequestHandler; |
26 | +import org.onosproject.ui.UiMessageHandlerTwo; | ||
26 | import org.onosproject.ui.table.AbstractTableRow; | 27 | import org.onosproject.ui.table.AbstractTableRow; |
27 | import org.onosproject.ui.table.RowComparator; | 28 | import org.onosproject.ui.table.RowComparator; |
28 | import org.onosproject.ui.table.TableRow; | 29 | import org.onosproject.ui.table.TableRow; |
29 | import org.onosproject.ui.table.TableUtils; | 30 | import org.onosproject.ui.table.TableUtils; |
30 | 31 | ||
31 | import java.util.Arrays; | 32 | import java.util.Arrays; |
33 | +import java.util.Collection; | ||
32 | import java.util.List; | 34 | import java.util.List; |
33 | import java.util.stream.Collectors; | 35 | import java.util.stream.Collectors; |
34 | 36 | ||
... | @@ -37,62 +39,74 @@ import static org.onosproject.app.ApplicationState.ACTIVE; | ... | @@ -37,62 +39,74 @@ import static org.onosproject.app.ApplicationState.ACTIVE; |
37 | /** | 39 | /** |
38 | * Message handler for application view related messages. | 40 | * Message handler for application view related messages. |
39 | */ | 41 | */ |
40 | -public class ApplicationViewMessageHandler extends UiMessageHandler { | 42 | +public class ApplicationViewMessageHandler extends UiMessageHandlerTwo { |
41 | 43 | ||
42 | - /** | 44 | + private static final String APP_DATA_REQ = "appDataRequest"; |
43 | - * Creates a new message handler for the application messages. | 45 | + private static final String APP_MGMT_REQ = "appManagementRequest"; |
44 | - */ | ||
45 | - protected ApplicationViewMessageHandler() { | ||
46 | - super(ImmutableSet.of("appDataRequest", "appManagementRequest")); | ||
47 | - } | ||
48 | 46 | ||
49 | @Override | 47 | @Override |
50 | - public void process(ObjectNode message) { | 48 | + protected Collection<RequestHandler> getHandlers() { |
51 | - String type = eventType(message); | 49 | + return ImmutableSet.of( |
52 | - if (type.equals("appDataRequest")) { | 50 | + new AppDataRequest(), |
53 | - sendAppList(message); | 51 | + new AppMgmtRequest() |
54 | - } else if (type.equals("appManagementRequest")) { | 52 | + ); |
55 | - processManagementCommand(message); | ||
56 | - } | ||
57 | } | 53 | } |
58 | 54 | ||
59 | - private void sendAppList(ObjectNode message) { | 55 | + // ====================================================================== |
60 | - ObjectNode payload = payload(message); | ||
61 | - RowComparator rc = TableUtils.createRowComparator(payload); | ||
62 | 56 | ||
63 | - ApplicationService service = get(ApplicationService.class); | 57 | + private final class AppDataRequest extends RequestHandler { |
64 | - TableRow[] rows = generateTableRows(service); | ||
65 | - Arrays.sort(rows, rc); | ||
66 | - ObjectNode rootNode = mapper.createObjectNode(); | ||
67 | - rootNode.set("apps", TableUtils.generateArrayNode(rows)); | ||
68 | 58 | ||
69 | - connection().sendMessage("appDataResponse", 0, rootNode); | 59 | + private AppDataRequest() { |
70 | - } | 60 | + super(APP_DATA_REQ); |
61 | + } | ||
71 | 62 | ||
72 | - private void processManagementCommand(ObjectNode message) { | 63 | + @Override |
73 | - ObjectNode payload = payload(message); | 64 | + public void process(long sid, ObjectNode payload) { |
74 | - String action = string(payload, "action"); | 65 | + RowComparator rc = TableUtils.createRowComparator(payload); |
75 | - String name = string(payload, "name"); | 66 | + |
76 | - if (action != null && name != null) { | 67 | + ApplicationService service = get(ApplicationService.class); |
77 | - ApplicationAdminService service = get(ApplicationAdminService.class); | 68 | + TableRow[] rows = generateTableRows(service); |
78 | - ApplicationId appId = service.getId(name); | 69 | + Arrays.sort(rows, rc); |
79 | - if (action.equals("activate")) { | 70 | + ObjectNode rootNode = MAPPER.createObjectNode(); |
80 | - service.activate(appId); | 71 | + rootNode.set("apps", TableUtils.generateArrayNode(rows)); |
81 | - } else if (action.equals("deactivate")) { | 72 | + |
82 | - service.deactivate(appId); | 73 | + sendMessage("appDataResponse", 0, rootNode); |
83 | - } else if (action.equals("uninstall")) { | 74 | + } |
84 | - service.uninstall(appId); | 75 | + |
85 | - } | 76 | + private TableRow[] generateTableRows(ApplicationService service) { |
86 | - sendAppList(message); | 77 | + List<TableRow> list = service.getApplications().stream() |
78 | + .map(application -> new ApplicationTableRow(service, application)) | ||
79 | + .collect(Collectors.toList()); | ||
80 | + return list.toArray(new TableRow[list.size()]); | ||
87 | } | 81 | } |
88 | } | 82 | } |
83 | + // ====================================================================== | ||
89 | 84 | ||
90 | - private TableRow[] generateTableRows(ApplicationService service) { | 85 | + private final class AppMgmtRequest extends RequestHandler { |
91 | - List<TableRow> list = service.getApplications().stream() | 86 | + |
92 | - .map(application -> new ApplicationTableRow(service, application)) | 87 | + private AppMgmtRequest() { |
93 | - .collect(Collectors.toList()); | 88 | + super(APP_MGMT_REQ); |
94 | - return list.toArray(new TableRow[list.size()]); | 89 | + } |
90 | + | ||
91 | + @Override | ||
92 | + public void process(long sid, ObjectNode payload) { | ||
93 | + String action = string(payload, "action"); | ||
94 | + String name = string(payload, "name"); | ||
95 | + if (action != null && name != null) { | ||
96 | + ApplicationAdminService service = get(ApplicationAdminService.class); | ||
97 | + ApplicationId appId = service.getId(name); | ||
98 | + if (action.equals("activate")) { | ||
99 | + service.activate(appId); | ||
100 | + } else if (action.equals("deactivate")) { | ||
101 | + service.deactivate(appId); | ||
102 | + } else if (action.equals("uninstall")) { | ||
103 | + service.uninstall(appId); | ||
104 | + } | ||
105 | + chain(APP_DATA_REQ, sid, payload); | ||
106 | + } | ||
107 | + } | ||
95 | } | 108 | } |
109 | + // ====================================================================== | ||
96 | 110 | ||
97 | /** | 111 | /** |
98 | * TableRow implementation for | 112 | * TableRow implementation for | ... | ... |
... | @@ -23,58 +23,62 @@ import org.joda.time.format.DateTimeFormat; | ... | @@ -23,58 +23,62 @@ import org.joda.time.format.DateTimeFormat; |
23 | import org.onosproject.cluster.ClusterService; | 23 | import org.onosproject.cluster.ClusterService; |
24 | import org.onosproject.cluster.ControllerNode; | 24 | import org.onosproject.cluster.ControllerNode; |
25 | import org.onosproject.cluster.NodeId; | 25 | import org.onosproject.cluster.NodeId; |
26 | -import org.onosproject.ui.UiMessageHandler; | 26 | +import org.onosproject.ui.RequestHandler; |
27 | +import org.onosproject.ui.UiMessageHandlerTwo; | ||
27 | import org.onosproject.ui.table.AbstractTableRow; | 28 | import org.onosproject.ui.table.AbstractTableRow; |
28 | import org.onosproject.ui.table.RowComparator; | 29 | import org.onosproject.ui.table.RowComparator; |
29 | import org.onosproject.ui.table.TableRow; | 30 | import org.onosproject.ui.table.TableRow; |
30 | import org.onosproject.ui.table.TableUtils; | 31 | import org.onosproject.ui.table.TableUtils; |
31 | 32 | ||
32 | -import java.util.ArrayList; | ||
33 | import java.util.Arrays; | 33 | import java.util.Arrays; |
34 | +import java.util.Collection; | ||
34 | import java.util.List; | 35 | import java.util.List; |
36 | +import java.util.stream.Collectors; | ||
35 | 37 | ||
36 | 38 | ||
37 | /** | 39 | /** |
38 | * Message handler for cluster view related messages. | 40 | * Message handler for cluster view related messages. |
39 | */ | 41 | */ |
40 | -public class ClusterViewMessageHandler extends UiMessageHandler { | 42 | +public class ClusterViewMessageHandler extends UiMessageHandlerTwo { |
41 | 43 | ||
42 | - /** | 44 | + private static final String CLUSTER_DATA_REQ = "clusterDataRequest"; |
43 | - * Creates a new message handler for the cluster messages. | ||
44 | - */ | ||
45 | - protected ClusterViewMessageHandler() { | ||
46 | - super(ImmutableSet.of("clusterDataRequest")); | ||
47 | - } | ||
48 | 45 | ||
49 | @Override | 46 | @Override |
50 | - public void process(ObjectNode message) { | 47 | + protected Collection<RequestHandler> getHandlers() { |
51 | - String type = eventType(message); | 48 | + return ImmutableSet.of(new ClusterDataRequest()); |
52 | - if (type.equals("clusterDataRequest")) { | ||
53 | - sendClusterList(message); | ||
54 | - } | ||
55 | } | 49 | } |
56 | 50 | ||
57 | - private void sendClusterList(ObjectNode message) { | 51 | + // ====================================================================== |
58 | - ObjectNode payload = payload(message); | ||
59 | - RowComparator rc = TableUtils.createRowComparator(payload); | ||
60 | 52 | ||
61 | - ClusterService service = get(ClusterService.class); | 53 | + private final class ClusterDataRequest extends RequestHandler { |
62 | - TableRow[] rows = generateTableRows(service); | ||
63 | - Arrays.sort(rows, rc); | ||
64 | - ObjectNode rootNode = mapper.createObjectNode(); | ||
65 | - rootNode.set("clusters", TableUtils.generateArrayNode(rows)); | ||
66 | 54 | ||
67 | - connection().sendMessage("clusterDataResponse", 0, rootNode); | 55 | + private ClusterDataRequest() { |
68 | - } | 56 | + super(CLUSTER_DATA_REQ); |
57 | + } | ||
69 | 58 | ||
70 | - private TableRow[] generateTableRows(ClusterService service) { | 59 | + @Override |
71 | - List<TableRow> list = new ArrayList<>(); | 60 | + public void process(long sid, ObjectNode payload) { |
72 | - for (ControllerNode node : service.getNodes()) { | 61 | + RowComparator rc = TableUtils.createRowComparator(payload); |
73 | - list.add(new ControllerNodeTableRow(service, node)); | 62 | + |
63 | + ClusterService service = get(ClusterService.class); | ||
64 | + TableRow[] rows = generateTableRows(service); | ||
65 | + Arrays.sort(rows, rc); | ||
66 | + ObjectNode rootNode = MAPPER.createObjectNode(); | ||
67 | + rootNode.set("clusters", TableUtils.generateArrayNode(rows)); | ||
68 | + | ||
69 | + sendMessage("clusterDataResponse", 0, rootNode); | ||
70 | + } | ||
71 | + | ||
72 | + private TableRow[] generateTableRows(ClusterService service) { | ||
73 | + List<TableRow> list = service.getNodes().stream() | ||
74 | + .map(node -> new ControllerNodeTableRow(service, node)) | ||
75 | + .collect(Collectors.toList()); | ||
76 | + return list.toArray(new TableRow[list.size()]); | ||
74 | } | 77 | } |
75 | - return list.toArray(new TableRow[list.size()]); | ||
76 | } | 78 | } |
77 | 79 | ||
80 | + // ====================================================================== | ||
81 | + | ||
78 | /** | 82 | /** |
79 | * TableRow implementation for {@link ControllerNode controller nodes}. | 83 | * TableRow implementation for {@link ControllerNode controller nodes}. |
80 | */ | 84 | */ | ... | ... |
... | @@ -27,7 +27,8 @@ import org.onosproject.net.Link; | ... | @@ -27,7 +27,8 @@ import org.onosproject.net.Link; |
27 | import org.onosproject.net.Port; | 27 | import org.onosproject.net.Port; |
28 | import org.onosproject.net.device.DeviceService; | 28 | import org.onosproject.net.device.DeviceService; |
29 | import org.onosproject.net.link.LinkService; | 29 | import org.onosproject.net.link.LinkService; |
30 | -import org.onosproject.ui.UiMessageHandler; | 30 | +import org.onosproject.ui.RequestHandler; |
31 | +import org.onosproject.ui.UiMessageHandlerTwo; | ||
31 | import org.onosproject.ui.table.AbstractTableRow; | 32 | import org.onosproject.ui.table.AbstractTableRow; |
32 | import org.onosproject.ui.table.RowComparator; | 33 | import org.onosproject.ui.table.RowComparator; |
33 | import org.onosproject.ui.table.TableRow; | 34 | import org.onosproject.ui.table.TableRow; |
... | @@ -35,6 +36,7 @@ import org.onosproject.ui.table.TableUtils; | ... | @@ -35,6 +36,7 @@ import org.onosproject.ui.table.TableUtils; |
35 | 36 | ||
36 | import java.util.ArrayList; | 37 | import java.util.ArrayList; |
37 | import java.util.Arrays; | 38 | import java.util.Arrays; |
39 | +import java.util.Collection; | ||
38 | import java.util.Collections; | 40 | import java.util.Collections; |
39 | import java.util.List; | 41 | import java.util.List; |
40 | import java.util.Set; | 42 | import java.util.Set; |
... | @@ -42,7 +44,10 @@ import java.util.Set; | ... | @@ -42,7 +44,10 @@ import java.util.Set; |
42 | /** | 44 | /** |
43 | * Message handler for device view related messages. | 45 | * Message handler for device view related messages. |
44 | */ | 46 | */ |
45 | -public class DeviceViewMessageHandler extends UiMessageHandler { | 47 | +public class DeviceViewMessageHandler extends UiMessageHandlerTwo { |
48 | + | ||
49 | + private static final String DEV_DATA_REQ = "deviceDataRequest"; | ||
50 | + private static final String DEV_DETAIL_REQ = "deviceDetailRequest"; | ||
46 | 51 | ||
47 | private static final String ID = "id"; | 52 | private static final String ID = "id"; |
48 | private static final String TYPE = "type"; | 53 | private static final String TYPE = "type"; |
... | @@ -65,110 +70,120 @@ public class DeviceViewMessageHandler extends UiMessageHandler { | ... | @@ -65,110 +70,120 @@ public class DeviceViewMessageHandler extends UiMessageHandler { |
65 | private static final String NAME = "name"; | 70 | private static final String NAME = "name"; |
66 | 71 | ||
67 | 72 | ||
68 | - /** | 73 | + @Override |
69 | - * Creates a new message handler for the device messages. | 74 | + protected Collection<RequestHandler> getHandlers() { |
70 | - */ | 75 | + return ImmutableSet.of( |
71 | - protected DeviceViewMessageHandler() { | 76 | + new DataRequestHandler(), |
72 | - super(ImmutableSet.of("deviceDataRequest", "deviceDetailsRequest")); | 77 | + new DetailRequestHandler() |
78 | + ); | ||
73 | } | 79 | } |
74 | 80 | ||
75 | - @Override | 81 | + // ====================================================================== |
76 | - public void process(ObjectNode message) { | 82 | + |
77 | - String type = eventType(message); | 83 | + private final class DataRequestHandler extends RequestHandler { |
78 | - if (type.equals("deviceDataRequest")) { | 84 | + |
79 | - dataRequest(message); | 85 | + private DataRequestHandler() { |
80 | - } else if (type.equals("deviceDetailsRequest")) { | 86 | + super(DEV_DATA_REQ); |
81 | - detailsRequest(message); | ||
82 | } | 87 | } |
83 | - } | ||
84 | 88 | ||
85 | - private void dataRequest(ObjectNode message) { | 89 | + @Override |
86 | - ObjectNode payload = payload(message); | 90 | + public void process(long sid, ObjectNode payload) { |
87 | - RowComparator rc = TableUtils.createRowComparator(payload); | 91 | + RowComparator rc = TableUtils.createRowComparator(payload); |
92 | + | ||
93 | + DeviceService service = get(DeviceService.class); | ||
94 | + MastershipService mastershipService = get(MastershipService.class); | ||
95 | + TableRow[] rows = generateTableRows(service, mastershipService); | ||
96 | + Arrays.sort(rows, rc); | ||
97 | + ObjectNode rootNode = MAPPER.createObjectNode(); | ||
98 | + rootNode.set("devices", TableUtils.generateArrayNode(rows)); | ||
88 | 99 | ||
89 | - DeviceService service = get(DeviceService.class); | 100 | + sendMessage("deviceDataResponse", 0, rootNode); |
90 | - MastershipService mastershipService = get(MastershipService.class); | 101 | + } |
91 | - TableRow[] rows = generateTableRows(service, mastershipService); | ||
92 | - Arrays.sort(rows, rc); | ||
93 | - ObjectNode rootNode = mapper.createObjectNode(); | ||
94 | - rootNode.set("devices", TableUtils.generateArrayNode(rows)); | ||
95 | 102 | ||
96 | - connection().sendMessage("deviceDataResponse", 0, rootNode); | 103 | + private TableRow[] generateTableRows(DeviceService service, |
104 | + MastershipService mastershipService) { | ||
105 | + List<TableRow> list = new ArrayList<>(); | ||
106 | + for (Device dev : service.getDevices()) { | ||
107 | + list.add(new DeviceTableRow(service, mastershipService, dev)); | ||
108 | + } | ||
109 | + return list.toArray(new TableRow[list.size()]); | ||
110 | + } | ||
97 | } | 111 | } |
98 | 112 | ||
99 | - private void detailsRequest(ObjectNode message) { | 113 | + // ====================================================================== |
100 | - ObjectNode payload = payload(message); | 114 | + |
101 | - String id = string(payload, "id", "of:0000000000000000"); | 115 | + private final class DetailRequestHandler extends RequestHandler { |
102 | - | 116 | + private DetailRequestHandler() { |
103 | - DeviceId deviceId = DeviceId.deviceId(id); | 117 | + super(DEV_DETAIL_REQ); |
104 | - DeviceService service = get(DeviceService.class); | ||
105 | - MastershipService ms = get(MastershipService.class); | ||
106 | - Device device = service.getDevice(deviceId); | ||
107 | - ObjectNode data = mapper.createObjectNode(); | ||
108 | - | ||
109 | - data.put(ID, deviceId.toString()); | ||
110 | - data.put(TYPE, device.type().toString()); | ||
111 | - data.put(TYPE_IID, getTypeIconId(device)); | ||
112 | - data.put(MFR, device.manufacturer()); | ||
113 | - data.put(HW, device.hwVersion()); | ||
114 | - data.put(SW, device.swVersion()); | ||
115 | - data.put(SERIAL, device.serialNumber()); | ||
116 | - data.put(CHASSIS_ID, device.chassisId().toString()); | ||
117 | - data.put(MASTER_ID, ms.getMasterFor(deviceId).toString()); | ||
118 | - data.put(PROTOCOL, device.annotations().value(PROTOCOL)); | ||
119 | - | ||
120 | - ArrayNode ports = mapper.createArrayNode(); | ||
121 | - | ||
122 | - List<Port> portList = new ArrayList<>(service.getPorts(deviceId)); | ||
123 | - Collections.sort(portList, (p1, p2) -> { | ||
124 | - long delta = p1.number().toLong() - p2.number().toLong(); | ||
125 | - return delta == 0 ? 0 : (delta < 0 ? -1 : +1); | ||
126 | - }); | ||
127 | - | ||
128 | - for (Port p : portList) { | ||
129 | - ports.add(portData(p, deviceId)); | ||
130 | } | 118 | } |
131 | - data.set(PORTS, ports); | ||
132 | 119 | ||
133 | - ObjectNode rootNode = mapper.createObjectNode(); | 120 | + @Override |
134 | - rootNode.set("details", data); | 121 | + public void process(long sid, ObjectNode payload) { |
135 | - connection().sendMessage("deviceDetailsResponse", 0, rootNode); | 122 | + String id = string(payload, "id", "of:0000000000000000"); |
136 | - } | 123 | + |
124 | + DeviceId deviceId = DeviceId.deviceId(id); | ||
125 | + DeviceService service = get(DeviceService.class); | ||
126 | + MastershipService ms = get(MastershipService.class); | ||
127 | + Device device = service.getDevice(deviceId); | ||
128 | + ObjectNode data = MAPPER.createObjectNode(); | ||
129 | + | ||
130 | + data.put(ID, deviceId.toString()); | ||
131 | + data.put(TYPE, device.type().toString()); | ||
132 | + data.put(TYPE_IID, getTypeIconId(device)); | ||
133 | + data.put(MFR, device.manufacturer()); | ||
134 | + data.put(HW, device.hwVersion()); | ||
135 | + data.put(SW, device.swVersion()); | ||
136 | + data.put(SERIAL, device.serialNumber()); | ||
137 | + data.put(CHASSIS_ID, device.chassisId().toString()); | ||
138 | + data.put(MASTER_ID, ms.getMasterFor(deviceId).toString()); | ||
139 | + data.put(PROTOCOL, device.annotations().value(PROTOCOL)); | ||
140 | + | ||
141 | + ArrayNode ports = MAPPER.createArrayNode(); | ||
142 | + | ||
143 | + List<Port> portList = new ArrayList<>(service.getPorts(deviceId)); | ||
144 | + Collections.sort(portList, (p1, p2) -> { | ||
145 | + long delta = p1.number().toLong() - p2.number().toLong(); | ||
146 | + return delta == 0 ? 0 : (delta < 0 ? -1 : +1); | ||
147 | + }); | ||
148 | + | ||
149 | + for (Port p : portList) { | ||
150 | + ports.add(portData(p, deviceId)); | ||
151 | + } | ||
152 | + data.set(PORTS, ports); | ||
137 | 153 | ||
138 | - private TableRow[] generateTableRows(DeviceService service, | 154 | + ObjectNode rootNode = MAPPER.createObjectNode(); |
139 | - MastershipService mastershipService) { | 155 | + rootNode.set("details", data); |
140 | - List<TableRow> list = new ArrayList<>(); | 156 | + sendMessage("deviceDetailsResponse", 0, rootNode); |
141 | - for (Device dev : service.getDevices()) { | ||
142 | - list.add(new DeviceTableRow(service, mastershipService, dev)); | ||
143 | } | 157 | } |
144 | - return list.toArray(new TableRow[list.size()]); | ||
145 | - } | ||
146 | 158 | ||
147 | - private ObjectNode portData(Port p, DeviceId id) { | 159 | + private ObjectNode portData(Port p, DeviceId id) { |
148 | - ObjectNode port = mapper.createObjectNode(); | 160 | + ObjectNode port = MAPPER.createObjectNode(); |
149 | - LinkService ls = get(LinkService.class); | 161 | + LinkService ls = get(LinkService.class); |
150 | - String name = p.annotations().value(AnnotationKeys.PORT_NAME); | 162 | + String name = p.annotations().value(AnnotationKeys.PORT_NAME); |
151 | - | 163 | + |
152 | - port.put(ID, p.number().toString()); | 164 | + port.put(ID, p.number().toString()); |
153 | - port.put(TYPE, p.type().toString()); | 165 | + port.put(TYPE, p.type().toString()); |
154 | - port.put(SPEED, p.portSpeed()); | 166 | + port.put(SPEED, p.portSpeed()); |
155 | - port.put(ENABLED, p.isEnabled()); | 167 | + port.put(ENABLED, p.isEnabled()); |
156 | - port.put(NAME, name != null ? name : ""); | 168 | + port.put(NAME, name != null ? name : ""); |
157 | - | 169 | + |
158 | - Set<Link> links = ls.getEgressLinks(new ConnectPoint(id, p.number())); | 170 | + Set<Link> links = ls.getEgressLinks(new ConnectPoint(id, p.number())); |
159 | - if (!links.isEmpty()) { | 171 | + if (!links.isEmpty()) { |
160 | - StringBuilder egressLinks = new StringBuilder(); | 172 | + StringBuilder egressLinks = new StringBuilder(); |
161 | - for (Link l : links) { | 173 | + for (Link l : links) { |
162 | - ConnectPoint dest = l.dst(); | 174 | + ConnectPoint dest = l.dst(); |
163 | - egressLinks.append(dest.elementId()).append("/") | 175 | + egressLinks.append(dest.elementId()).append("/") |
164 | - .append(dest.port()).append(" "); | 176 | + .append(dest.port()).append(" "); |
177 | + } | ||
178 | + port.put(LINK_DEST, egressLinks.toString()); | ||
165 | } | 179 | } |
166 | - port.put(LINK_DEST, egressLinks.toString()); | 180 | + |
181 | + return port; | ||
167 | } | 182 | } |
168 | 183 | ||
169 | - return port; | ||
170 | } | 184 | } |
171 | 185 | ||
186 | + | ||
172 | private static String getTypeIconId(Device d) { | 187 | private static String getTypeIconId(Device d) { |
173 | return DEV_ICON_PREFIX + d.type().toString(); | 188 | return DEV_ICON_PREFIX + d.type().toString(); |
174 | } | 189 | } | ... | ... |
... | @@ -26,7 +26,8 @@ import org.onosproject.net.flow.TrafficSelector; | ... | @@ -26,7 +26,8 @@ import org.onosproject.net.flow.TrafficSelector; |
26 | import org.onosproject.net.flow.TrafficTreatment; | 26 | import org.onosproject.net.flow.TrafficTreatment; |
27 | import org.onosproject.net.flow.criteria.Criterion; | 27 | import org.onosproject.net.flow.criteria.Criterion; |
28 | import org.onosproject.net.flow.instructions.Instruction; | 28 | import org.onosproject.net.flow.instructions.Instruction; |
29 | -import org.onosproject.ui.UiMessageHandler; | 29 | +import org.onosproject.ui.RequestHandler; |
30 | +import org.onosproject.ui.UiMessageHandlerTwo; | ||
30 | import org.onosproject.ui.table.AbstractTableRow; | 31 | import org.onosproject.ui.table.AbstractTableRow; |
31 | import org.onosproject.ui.table.RowComparator; | 32 | import org.onosproject.ui.table.RowComparator; |
32 | import org.onosproject.ui.table.TableRow; | 33 | import org.onosproject.ui.table.TableRow; |
... | @@ -34,6 +35,7 @@ import org.onosproject.ui.table.TableUtils; | ... | @@ -34,6 +35,7 @@ import org.onosproject.ui.table.TableUtils; |
34 | 35 | ||
35 | import java.util.ArrayList; | 36 | import java.util.ArrayList; |
36 | import java.util.Arrays; | 37 | import java.util.Arrays; |
38 | +import java.util.Collection; | ||
37 | import java.util.List; | 39 | import java.util.List; |
38 | import java.util.Set; | 40 | import java.util.Set; |
39 | 41 | ||
... | @@ -41,55 +43,58 @@ import java.util.Set; | ... | @@ -41,55 +43,58 @@ import java.util.Set; |
41 | /** | 43 | /** |
42 | * Message handler for flow view related messages. | 44 | * Message handler for flow view related messages. |
43 | */ | 45 | */ |
44 | -public class FlowViewMessageHandler extends UiMessageHandler { | 46 | +public class FlowViewMessageHandler extends UiMessageHandlerTwo { |
45 | 47 | ||
46 | - private static final String NO_DEV = "none"; | 48 | + private static final String FLOW_DATA_REQ = "flowDataRequest"; |
47 | 49 | ||
48 | - /** | 50 | + private static final String NO_DEV = "none"; |
49 | - * Creates a new message handler for the flow messages. | ||
50 | - */ | ||
51 | - protected FlowViewMessageHandler() { | ||
52 | - super(ImmutableSet.of("flowDataRequest")); | ||
53 | - } | ||
54 | 51 | ||
55 | @Override | 52 | @Override |
56 | - public void process(ObjectNode message) { | 53 | + protected Collection<RequestHandler> getHandlers() { |
57 | - String type = eventType(message); | 54 | + return ImmutableSet.of(new FlowDataRequest()); |
58 | - if (type.equals("flowDataRequest")) { | ||
59 | - sendFlowList(message); | ||
60 | - } | ||
61 | } | 55 | } |
62 | 56 | ||
63 | - private void sendFlowList(ObjectNode message) { | 57 | + // ====================================================================== |
64 | - ObjectNode payload = payload(message); | 58 | + |
65 | - RowComparator rc = TableUtils.createRowComparator(payload); | 59 | + private final class FlowDataRequest extends RequestHandler { |
66 | - String uri = string(payload, "devId", NO_DEV); | 60 | + |
67 | - | 61 | + private FlowDataRequest() { |
68 | - ObjectNode rootNode; | 62 | + super(FLOW_DATA_REQ); |
69 | - if (uri.equals(NO_DEV)) { | ||
70 | - rootNode = mapper.createObjectNode(); | ||
71 | - rootNode.set("flows", mapper.createArrayNode()); | ||
72 | - } else { | ||
73 | - DeviceId deviceId = DeviceId.deviceId(uri); | ||
74 | - FlowRuleService service = get(FlowRuleService.class); | ||
75 | - TableRow[] rows = generateTableRows(service, deviceId); | ||
76 | - Arrays.sort(rows, rc); | ||
77 | - rootNode = mapper.createObjectNode(); | ||
78 | - rootNode.set("flows", TableUtils.generateArrayNode(rows)); | ||
79 | } | 63 | } |
80 | 64 | ||
81 | - connection().sendMessage("flowDataResponse", 0, rootNode); | 65 | + @Override |
82 | - } | 66 | + public void process(long sid, ObjectNode payload) { |
67 | + RowComparator rc = TableUtils.createRowComparator(payload); | ||
68 | + String uri = string(payload, "devId", NO_DEV); | ||
69 | + | ||
70 | + ObjectNode rootNode; | ||
71 | + if (uri.equals(NO_DEV)) { | ||
72 | + rootNode = MAPPER.createObjectNode(); | ||
73 | + rootNode.set("flows", MAPPER.createArrayNode()); | ||
74 | + } else { | ||
75 | + DeviceId deviceId = DeviceId.deviceId(uri); | ||
76 | + FlowRuleService service = get(FlowRuleService.class); | ||
77 | + TableRow[] rows = generateTableRows(service, deviceId); | ||
78 | + Arrays.sort(rows, rc); | ||
79 | + rootNode = MAPPER.createObjectNode(); | ||
80 | + rootNode.set("flows", TableUtils.generateArrayNode(rows)); | ||
81 | + } | ||
83 | 82 | ||
84 | - private TableRow[] generateTableRows(FlowRuleService service, | 83 | + sendMessage("flowDataResponse", 0, rootNode); |
85 | - DeviceId deviceId) { | 84 | + } |
86 | - List<TableRow> list = new ArrayList<>(); | 85 | + |
87 | - for (FlowEntry flow : service.getFlowEntries(deviceId)) { | 86 | + private TableRow[] generateTableRows(FlowRuleService service, |
88 | - list.add(new FlowTableRow(flow)); | 87 | + DeviceId deviceId) { |
88 | + List<TableRow> list = new ArrayList<>(); | ||
89 | + for (FlowEntry flow : service.getFlowEntries(deviceId)) { | ||
90 | + list.add(new FlowTableRow(flow)); | ||
91 | + } | ||
92 | + return list.toArray(new TableRow[list.size()]); | ||
89 | } | 93 | } |
90 | - return list.toArray(new TableRow[list.size()]); | ||
91 | } | 94 | } |
92 | 95 | ||
96 | + // ====================================================================== | ||
97 | + | ||
93 | /** | 98 | /** |
94 | * TableRow implementation for {@link org.onosproject.net.flow.FlowRule flows}. | 99 | * TableRow implementation for {@link org.onosproject.net.flow.FlowRule flows}. |
95 | */ | 100 | */ | ... | ... |
... | @@ -21,7 +21,8 @@ import org.onosproject.net.AnnotationKeys; | ... | @@ -21,7 +21,8 @@ import org.onosproject.net.AnnotationKeys; |
21 | import org.onosproject.net.Host; | 21 | import org.onosproject.net.Host; |
22 | import org.onosproject.net.HostLocation; | 22 | import org.onosproject.net.HostLocation; |
23 | import org.onosproject.net.host.HostService; | 23 | import org.onosproject.net.host.HostService; |
24 | -import org.onosproject.ui.UiMessageHandler; | 24 | +import org.onosproject.ui.RequestHandler; |
25 | +import org.onosproject.ui.UiMessageHandlerTwo; | ||
25 | import org.onosproject.ui.table.AbstractTableRow; | 26 | import org.onosproject.ui.table.AbstractTableRow; |
26 | import org.onosproject.ui.table.RowComparator; | 27 | import org.onosproject.ui.table.RowComparator; |
27 | import org.onosproject.ui.table.TableRow; | 28 | import org.onosproject.ui.table.TableRow; |
... | @@ -29,6 +30,7 @@ import org.onosproject.ui.table.TableUtils; | ... | @@ -29,6 +30,7 @@ import org.onosproject.ui.table.TableUtils; |
29 | 30 | ||
30 | import java.util.ArrayList; | 31 | import java.util.ArrayList; |
31 | import java.util.Arrays; | 32 | import java.util.Arrays; |
33 | +import java.util.Collection; | ||
32 | import java.util.List; | 34 | import java.util.List; |
33 | 35 | ||
34 | import static com.google.common.base.Strings.isNullOrEmpty; | 36 | import static com.google.common.base.Strings.isNullOrEmpty; |
... | @@ -36,44 +38,48 @@ import static com.google.common.base.Strings.isNullOrEmpty; | ... | @@ -36,44 +38,48 @@ import static com.google.common.base.Strings.isNullOrEmpty; |
36 | /** | 38 | /** |
37 | * Message handler for host view related messages. | 39 | * Message handler for host view related messages. |
38 | */ | 40 | */ |
39 | -public class HostViewMessageHandler extends UiMessageHandler { | 41 | +public class HostViewMessageHandler extends UiMessageHandlerTwo { |
42 | + | ||
43 | + private static final String HOST_DATA_REQ = "hostDataRequest"; | ||
40 | 44 | ||
41 | - /** | ||
42 | - * Creates a new message handler for the host messages. | ||
43 | - */ | ||
44 | - protected HostViewMessageHandler() { | ||
45 | - super(ImmutableSet.of("hostDataRequest")); | ||
46 | - } | ||
47 | 45 | ||
48 | @Override | 46 | @Override |
49 | - public void process(ObjectNode message) { | 47 | + protected Collection<RequestHandler> getHandlers() { |
50 | - String type = eventType(message); | 48 | + return ImmutableSet.of(new HostDataRequest()); |
51 | - if (type.equals("hostDataRequest")) { | ||
52 | - sendHostList(message); | ||
53 | - } | ||
54 | } | 49 | } |
55 | 50 | ||
56 | - private void sendHostList(ObjectNode message) { | 51 | + // ====================================================================== |
57 | - ObjectNode payload = payload(message); | ||
58 | - RowComparator rc = TableUtils.createRowComparator(payload); | ||
59 | 52 | ||
60 | - HostService service = get(HostService.class); | 53 | + private final class HostDataRequest extends RequestHandler { |
61 | - TableRow[] rows = generateTableRows(service); | ||
62 | - Arrays.sort(rows, rc); | ||
63 | - ObjectNode rootNode = mapper.createObjectNode(); | ||
64 | - rootNode.set("hosts", TableUtils.generateArrayNode(rows)); | ||
65 | 54 | ||
66 | - connection().sendMessage("hostDataResponse", 0, rootNode); | 55 | + private HostDataRequest() { |
67 | - } | 56 | + super(HOST_DATA_REQ); |
57 | + } | ||
68 | 58 | ||
69 | - private TableRow[] generateTableRows(HostService service) { | 59 | + @Override |
70 | - List<TableRow> list = new ArrayList<>(); | 60 | + public void process(long sid, ObjectNode payload) { |
71 | - for (Host host : service.getHosts()) { | 61 | + RowComparator rc = TableUtils.createRowComparator(payload); |
72 | - list.add(new HostTableRow(host)); | 62 | + |
63 | + HostService service = get(HostService.class); | ||
64 | + TableRow[] rows = generateTableRows(service); | ||
65 | + Arrays.sort(rows, rc); | ||
66 | + ObjectNode rootNode = MAPPER.createObjectNode(); | ||
67 | + rootNode.set("hosts", TableUtils.generateArrayNode(rows)); | ||
68 | + | ||
69 | + sendMessage("hostDataResponse", 0, rootNode); | ||
70 | + } | ||
71 | + | ||
72 | + private TableRow[] generateTableRows(HostService service) { | ||
73 | + List<TableRow> list = new ArrayList<>(); | ||
74 | + for (Host host : service.getHosts()) { | ||
75 | + list.add(new HostTableRow(host)); | ||
76 | + } | ||
77 | + return list.toArray(new TableRow[list.size()]); | ||
73 | } | 78 | } |
74 | - return list.toArray(new TableRow[list.size()]); | ||
75 | } | 79 | } |
76 | 80 | ||
81 | + // ====================================================================== | ||
82 | + | ||
77 | /** | 83 | /** |
78 | * TableRow implementation for {@link Host hosts}. | 84 | * TableRow implementation for {@link Host hosts}. |
79 | */ | 85 | */ | ... | ... |
... | @@ -31,7 +31,8 @@ import org.onosproject.net.intent.MultiPointToSinglePointIntent; | ... | @@ -31,7 +31,8 @@ import org.onosproject.net.intent.MultiPointToSinglePointIntent; |
31 | import org.onosproject.net.intent.PathIntent; | 31 | import org.onosproject.net.intent.PathIntent; |
32 | import org.onosproject.net.intent.PointToPointIntent; | 32 | import org.onosproject.net.intent.PointToPointIntent; |
33 | import org.onosproject.net.intent.SinglePointToMultiPointIntent; | 33 | import org.onosproject.net.intent.SinglePointToMultiPointIntent; |
34 | -import org.onosproject.ui.UiMessageHandler; | 34 | +import org.onosproject.ui.RequestHandler; |
35 | +import org.onosproject.ui.UiMessageHandlerTwo; | ||
35 | import org.onosproject.ui.table.AbstractTableRow; | 36 | import org.onosproject.ui.table.AbstractTableRow; |
36 | import org.onosproject.ui.table.RowComparator; | 37 | import org.onosproject.ui.table.RowComparator; |
37 | import org.onosproject.ui.table.TableRow; | 38 | import org.onosproject.ui.table.TableRow; |
... | @@ -39,50 +40,55 @@ import org.onosproject.ui.table.TableUtils; | ... | @@ -39,50 +40,55 @@ import org.onosproject.ui.table.TableUtils; |
39 | 40 | ||
40 | import java.util.ArrayList; | 41 | import java.util.ArrayList; |
41 | import java.util.Arrays; | 42 | import java.util.Arrays; |
43 | +import java.util.Collection; | ||
42 | import java.util.List; | 44 | import java.util.List; |
43 | import java.util.Set; | 45 | import java.util.Set; |
44 | 46 | ||
45 | /** | 47 | /** |
46 | * Message handler for intent view related messages. | 48 | * Message handler for intent view related messages. |
47 | */ | 49 | */ |
48 | -public class IntentViewMessageHandler extends UiMessageHandler { | 50 | +public class IntentViewMessageHandler extends UiMessageHandlerTwo { |
51 | + | ||
52 | + private static final String INTENT_DATA_REQ = "intentDataRequest"; | ||
49 | 53 | ||
50 | - /** | ||
51 | - * Creates a new message handler for the intent messages. | ||
52 | - */ | ||
53 | - protected IntentViewMessageHandler() { | ||
54 | - super(ImmutableSet.of("intentDataRequest")); | ||
55 | - } | ||
56 | 54 | ||
57 | @Override | 55 | @Override |
58 | - public void process(ObjectNode message) { | 56 | + protected Collection<RequestHandler> getHandlers() { |
59 | - String type = eventType(message); | 57 | + return ImmutableSet.of(new IntentDataRequest()); |
60 | - if (type.equals("intentDataRequest")) { | ||
61 | - sendIntentList(message); | ||
62 | - } | ||
63 | } | 58 | } |
64 | 59 | ||
65 | - private void sendIntentList(ObjectNode message) { | 60 | + // ====================================================================== |
66 | - ObjectNode payload = payload(message); | ||
67 | - RowComparator rc = TableUtils.createRowComparator(payload); | ||
68 | 61 | ||
69 | - IntentService service = get(IntentService.class); | 62 | + private final class IntentDataRequest extends RequestHandler { |
70 | - TableRow[] rows = generateTableRows(service); | ||
71 | - Arrays.sort(rows, rc); | ||
72 | - ObjectNode rootNode = mapper.createObjectNode(); | ||
73 | - rootNode.set("intents", TableUtils.generateArrayNode(rows)); | ||
74 | 63 | ||
75 | - connection().sendMessage("intentDataResponse", 0, rootNode); | 64 | + private IntentDataRequest() { |
76 | - } | 65 | + super(INTENT_DATA_REQ); |
66 | + } | ||
77 | 67 | ||
78 | - private TableRow[] generateTableRows(IntentService service) { | 68 | + @Override |
79 | - List<TableRow> list = new ArrayList<>(); | 69 | + public void process(long sid, ObjectNode payload) { |
80 | - for (Intent intent : service.getIntents()) { | 70 | + RowComparator rc = TableUtils.createRowComparator(payload); |
81 | - list.add(new IntentTableRow(intent)); | 71 | + |
72 | + IntentService service = get(IntentService.class); | ||
73 | + TableRow[] rows = generateTableRows(service); | ||
74 | + Arrays.sort(rows, rc); | ||
75 | + ObjectNode rootNode = MAPPER.createObjectNode(); | ||
76 | + rootNode.set("intents", TableUtils.generateArrayNode(rows)); | ||
77 | + | ||
78 | + sendMessage("intentDataResponse", 0, rootNode); | ||
79 | + } | ||
80 | + | ||
81 | + private TableRow[] generateTableRows(IntentService service) { | ||
82 | + List<TableRow> list = new ArrayList<>(); | ||
83 | + for (Intent intent : service.getIntents()) { | ||
84 | + list.add(new IntentTableRow(intent)); | ||
85 | + } | ||
86 | + return list.toArray(new TableRow[list.size()]); | ||
82 | } | 87 | } |
83 | - return list.toArray(new TableRow[list.size()]); | ||
84 | } | 88 | } |
85 | 89 | ||
90 | + // ====================================================================== | ||
91 | + | ||
86 | /** | 92 | /** |
87 | * TableRow implementation for {@link Intent intents}. | 93 | * TableRow implementation for {@link Intent intents}. |
88 | */ | 94 | */ | ... | ... |
... | @@ -23,7 +23,8 @@ import org.onosproject.net.ConnectPoint; | ... | @@ -23,7 +23,8 @@ import org.onosproject.net.ConnectPoint; |
23 | import org.onosproject.net.Link; | 23 | import org.onosproject.net.Link; |
24 | import org.onosproject.net.LinkKey; | 24 | import org.onosproject.net.LinkKey; |
25 | import org.onosproject.net.link.LinkService; | 25 | import org.onosproject.net.link.LinkService; |
26 | -import org.onosproject.ui.UiMessageHandler; | 26 | +import org.onosproject.ui.RequestHandler; |
27 | +import org.onosproject.ui.UiMessageHandlerTwo; | ||
27 | import org.onosproject.ui.impl.TopologyViewMessageHandlerBase.BiLink; | 28 | import org.onosproject.ui.impl.TopologyViewMessageHandlerBase.BiLink; |
28 | import org.onosproject.ui.table.AbstractTableRow; | 29 | import org.onosproject.ui.table.AbstractTableRow; |
29 | import org.onosproject.ui.table.RowComparator; | 30 | import org.onosproject.ui.table.RowComparator; |
... | @@ -32,6 +33,7 @@ import org.onosproject.ui.table.TableUtils; | ... | @@ -32,6 +33,7 @@ import org.onosproject.ui.table.TableUtils; |
32 | 33 | ||
33 | import java.util.ArrayList; | 34 | import java.util.ArrayList; |
34 | import java.util.Arrays; | 35 | import java.util.Arrays; |
36 | +import java.util.Collection; | ||
35 | import java.util.List; | 37 | import java.util.List; |
36 | import java.util.Map; | 38 | import java.util.Map; |
37 | 39 | ||
... | @@ -40,48 +42,52 @@ import static org.onosproject.ui.impl.TopologyViewMessageHandlerBase.addLink; | ... | @@ -40,48 +42,52 @@ import static org.onosproject.ui.impl.TopologyViewMessageHandlerBase.addLink; |
40 | /** | 42 | /** |
41 | * Message handler for link view related messages. | 43 | * Message handler for link view related messages. |
42 | */ | 44 | */ |
43 | -public class LinkViewMessageHandler extends UiMessageHandler { | 45 | +public class LinkViewMessageHandler extends UiMessageHandlerTwo { |
46 | + | ||
47 | + private static final String LINK_DATA_REQ = "linkDataRequest"; | ||
44 | 48 | ||
45 | - /** | ||
46 | - * Creates a new message handler for the link messages. | ||
47 | - */ | ||
48 | - protected LinkViewMessageHandler() { | ||
49 | - super(ImmutableSet.of("linkDataRequest")); | ||
50 | - } | ||
51 | 49 | ||
52 | @Override | 50 | @Override |
53 | - public void process(ObjectNode message) { | 51 | + protected Collection<RequestHandler> getHandlers() { |
54 | - String type = eventType(message); | 52 | + return ImmutableSet.of(new LinkDataRequest()); |
55 | - if (type.equals("linkDataRequest")) { | ||
56 | - sendLinkList(message); | ||
57 | - } | ||
58 | } | 53 | } |
59 | 54 | ||
60 | - private void sendLinkList(ObjectNode message) { | 55 | + // ====================================================================== |
61 | - ObjectNode payload = payload(message); | ||
62 | - RowComparator rc = TableUtils.createRowComparator(payload, "one"); | ||
63 | 56 | ||
64 | - LinkService service = get(LinkService.class); | 57 | + private final class LinkDataRequest extends RequestHandler { |
65 | - TableRow[] rows = generateTableRows(service); | ||
66 | - Arrays.sort(rows, rc); | ||
67 | - ObjectNode rootNode = mapper.createObjectNode(); | ||
68 | - rootNode.set("links", TableUtils.generateArrayNode(rows)); | ||
69 | 58 | ||
70 | - connection().sendMessage("linkDataResponse", 0, rootNode); | 59 | + private LinkDataRequest() { |
71 | - } | 60 | + super(LINK_DATA_REQ); |
61 | + } | ||
72 | 62 | ||
73 | - private TableRow[] generateTableRows(LinkService service) { | 63 | + @Override |
74 | - List<TableRow> list = new ArrayList<>(); | 64 | + public void process(long sid, ObjectNode payload) { |
65 | + RowComparator rc = TableUtils.createRowComparator(payload, "one"); | ||
66 | + | ||
67 | + LinkService service = get(LinkService.class); | ||
68 | + TableRow[] rows = generateTableRows(service); | ||
69 | + Arrays.sort(rows, rc); | ||
70 | + ObjectNode rootNode = MAPPER.createObjectNode(); | ||
71 | + rootNode.set("links", TableUtils.generateArrayNode(rows)); | ||
72 | + | ||
73 | + sendMessage("linkDataResponse", 0, rootNode); | ||
74 | + } | ||
75 | 75 | ||
76 | - // First consolidate all uni-directional links into two-directional ones. | 76 | + private TableRow[] generateTableRows(LinkService service) { |
77 | - Map<LinkKey, BiLink> biLinks = Maps.newHashMap(); | 77 | + List<TableRow> list = new ArrayList<>(); |
78 | - service.getLinks().forEach(link -> addLink(biLinks, link)); | ||
79 | 78 | ||
80 | - // Now scan over all bi-links and produce table rows from them. | 79 | + // First consolidate all uni-directional links into two-directional ones. |
81 | - biLinks.values().forEach(biLink -> list.add(new LinkTableRow(biLink))); | 80 | + Map<LinkKey, BiLink> biLinks = Maps.newHashMap(); |
82 | - return list.toArray(new TableRow[list.size()]); | 81 | + service.getLinks().forEach(link -> addLink(biLinks, link)); |
82 | + | ||
83 | + // Now scan over all bi-links and produce table rows from them. | ||
84 | + biLinks.values().forEach(biLink -> list.add(new LinkTableRow(biLink))); | ||
85 | + return list.toArray(new TableRow[list.size()]); | ||
86 | + } | ||
83 | } | 87 | } |
84 | 88 | ||
89 | + // ====================================================================== | ||
90 | + | ||
85 | /** | 91 | /** |
86 | * TableRow implementation for {@link org.onosproject.net.Link links}. | 92 | * TableRow implementation for {@link org.onosproject.net.Link links}. |
87 | */ | 93 | */ | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -63,8 +63,9 @@ import org.onosproject.net.statistic.Load; | ... | @@ -63,8 +63,9 @@ import org.onosproject.net.statistic.Load; |
63 | import org.onosproject.net.statistic.StatisticService; | 63 | import org.onosproject.net.statistic.StatisticService; |
64 | import org.onosproject.net.topology.Topology; | 64 | import org.onosproject.net.topology.Topology; |
65 | import org.onosproject.net.topology.TopologyService; | 65 | import org.onosproject.net.topology.TopologyService; |
66 | +import org.onosproject.ui.JsonUtils; | ||
66 | import org.onosproject.ui.UiConnection; | 67 | import org.onosproject.ui.UiConnection; |
67 | -import org.onosproject.ui.UiMessageHandler; | 68 | +import org.onosproject.ui.UiMessageHandlerTwo; |
68 | import org.slf4j.Logger; | 69 | import org.slf4j.Logger; |
69 | import org.slf4j.LoggerFactory; | 70 | import org.slf4j.LoggerFactory; |
70 | 71 | ||
... | @@ -100,11 +101,13 @@ import static org.onosproject.net.link.LinkEvent.Type.LINK_REMOVED; | ... | @@ -100,11 +101,13 @@ import static org.onosproject.net.link.LinkEvent.Type.LINK_REMOVED; |
100 | /** | 101 | /** |
101 | * Facility for creating messages bound for the topology viewer. | 102 | * Facility for creating messages bound for the topology viewer. |
102 | */ | 103 | */ |
103 | -public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | 104 | +public abstract class TopologyViewMessageHandlerBase extends UiMessageHandlerTwo { |
104 | 105 | ||
105 | - protected static final Logger log = LoggerFactory.getLogger(TopologyViewMessageHandlerBase.class); | 106 | + protected static final Logger log = |
107 | + LoggerFactory.getLogger(TopologyViewMessageHandlerBase.class); | ||
106 | 108 | ||
107 | - private static final ProviderId PID = new ProviderId("core", "org.onosproject.core", true); | 109 | + private static final ProviderId PID = |
110 | + new ProviderId("core", "org.onosproject.core", true); | ||
108 | private static final String COMPACT = "%s/%s-%s/%s"; | 111 | private static final String COMPACT = "%s/%s-%s/%s"; |
109 | 112 | ||
110 | private static final double KB = 1024; | 113 | private static final double KB = 1024; |
... | @@ -133,15 +136,6 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -133,15 +136,6 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
133 | private static Map<String, ObjectNode> metaUi = new ConcurrentHashMap<>(); | 136 | private static Map<String, ObjectNode> metaUi = new ConcurrentHashMap<>(); |
134 | 137 | ||
135 | /** | 138 | /** |
136 | - * Creates a new message handler for the specified set of message types. | ||
137 | - * | ||
138 | - * @param messageTypes set of message types | ||
139 | - */ | ||
140 | - protected TopologyViewMessageHandlerBase(Set<String> messageTypes) { | ||
141 | - super(messageTypes); | ||
142 | - } | ||
143 | - | ||
144 | - /** | ||
145 | * Returns read-only view of the meta-ui information. | 139 | * Returns read-only view of the meta-ui information. |
146 | * | 140 | * |
147 | * @return map of id to meta-ui mementos | 141 | * @return map of id to meta-ui mementos |
... | @@ -168,26 +162,6 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -168,26 +162,6 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
168 | version = ver.replace(".SNAPSHOT", "*").replaceFirst("~.*$", ""); | 162 | version = ver.replace(".SNAPSHOT", "*").replaceFirst("~.*$", ""); |
169 | } | 163 | } |
170 | 164 | ||
171 | - // Retrieves the payload from the specified event. | ||
172 | - protected ObjectNode payload(ObjectNode event) { | ||
173 | - return (ObjectNode) event.path("payload"); | ||
174 | - } | ||
175 | - | ||
176 | - // Returns the specified node property as a number | ||
177 | - protected long number(ObjectNode node, String name) { | ||
178 | - return node.path(name).asLong(); | ||
179 | - } | ||
180 | - | ||
181 | - // Returns the specified node property as a string. | ||
182 | - protected String string(ObjectNode node, String name) { | ||
183 | - return node.path(name).asText(); | ||
184 | - } | ||
185 | - | ||
186 | - // Returns the specified node property as a string. | ||
187 | - protected String string(ObjectNode node, String name, String defaultValue) { | ||
188 | - return node.path(name).asText(defaultValue); | ||
189 | - } | ||
190 | - | ||
191 | // Returns the specified set of IP addresses as a string. | 165 | // Returns the specified set of IP addresses as a string. |
192 | private String ip(Set<IpAddress> ipAddresses) { | 166 | private String ip(Set<IpAddress> ipAddresses) { |
193 | Iterator<IpAddress> it = ipAddresses.iterator(); | 167 | Iterator<IpAddress> it = ipAddresses.iterator(); |
... | @@ -222,21 +196,11 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -222,21 +196,11 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
222 | 196 | ||
223 | // Produces a log message event bound to the client. | 197 | // Produces a log message event bound to the client. |
224 | private ObjectNode message(String severity, long id, String message) { | 198 | private ObjectNode message(String severity, long id, String message) { |
225 | - return envelope("message", id, | 199 | + ObjectNode payload = mapper.createObjectNode() |
226 | - mapper.createObjectNode() | 200 | + .put("severity", severity) |
227 | - .put("severity", severity) | 201 | + .put("message", message); |
228 | - .put("message", message)); | ||
229 | - } | ||
230 | 202 | ||
231 | - // Puts the payload into an envelope and returns it. | 203 | + return JsonUtils.envelope("message", id, payload); |
232 | - protected ObjectNode envelope(String type, long sid, ObjectNode payload) { | ||
233 | - ObjectNode event = mapper.createObjectNode(); | ||
234 | - event.put("event", type); | ||
235 | - if (sid > 0) { | ||
236 | - event.put("sid", sid); | ||
237 | - } | ||
238 | - event.set("payload", payload); | ||
239 | - return event; | ||
240 | } | 204 | } |
241 | 205 | ||
242 | // Produces a set of all hosts listed in the specified JSON array. | 206 | // Produces a set of all hosts listed in the specified JSON array. |
... | @@ -320,7 +284,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -320,7 +284,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
320 | ((event.type() == INSTANCE_ADDED) ? "addInstance" : | 284 | ((event.type() == INSTANCE_ADDED) ? "addInstance" : |
321 | ((event.type() == INSTANCE_REMOVED ? "removeInstance" : | 285 | ((event.type() == INSTANCE_REMOVED ? "removeInstance" : |
322 | "addInstance"))); | 286 | "addInstance"))); |
323 | - return envelope(type, 0, payload); | 287 | + return JsonUtils.envelope(type, 0, payload); |
324 | } | 288 | } |
325 | 289 | ||
326 | // Produces a device event message to the client. | 290 | // Produces a device event message to the client. |
... | @@ -347,7 +311,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -347,7 +311,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
347 | 311 | ||
348 | String type = (event.type() == DEVICE_ADDED) ? "addDevice" : | 312 | String type = (event.type() == DEVICE_ADDED) ? "addDevice" : |
349 | ((event.type() == DEVICE_REMOVED) ? "removeDevice" : "updateDevice"); | 313 | ((event.type() == DEVICE_REMOVED) ? "removeDevice" : "updateDevice"); |
350 | - return envelope(type, 0, payload); | 314 | + return JsonUtils.envelope(type, 0, payload); |
351 | } | 315 | } |
352 | 316 | ||
353 | // Produces a link event message to the client. | 317 | // Produces a link event message to the client. |
... | @@ -364,7 +328,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -364,7 +328,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
364 | .put("dstPort", link.dst().port().toString()); | 328 | .put("dstPort", link.dst().port().toString()); |
365 | String type = (event.type() == LINK_ADDED) ? "addLink" : | 329 | String type = (event.type() == LINK_ADDED) ? "addLink" : |
366 | ((event.type() == LINK_REMOVED) ? "removeLink" : "updateLink"); | 330 | ((event.type() == LINK_REMOVED) ? "removeLink" : "updateLink"); |
367 | - return envelope(type, 0, payload); | 331 | + return JsonUtils.envelope(type, 0, payload); |
368 | } | 332 | } |
369 | 333 | ||
370 | // Produces a host event message to the client. | 334 | // Produces a host event message to the client. |
... | @@ -385,7 +349,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -385,7 +349,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
385 | 349 | ||
386 | String type = (event.type() == HOST_ADDED) ? "addHost" : | 350 | String type = (event.type() == HOST_ADDED) ? "addHost" : |
387 | ((event.type() == HOST_REMOVED) ? "removeHost" : "updateHost"); | 351 | ((event.type() == HOST_REMOVED) ? "removeHost" : "updateHost"); |
388 | - return envelope(type, 0, payload); | 352 | + return JsonUtils.envelope(type, 0, payload); |
389 | } | 353 | } |
390 | 354 | ||
391 | // Encodes the specified host location into a JSON object. | 355 | // Encodes the specified host location into a JSON object. |
... | @@ -447,15 +411,15 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -447,15 +411,15 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
447 | } | 411 | } |
448 | 412 | ||
449 | // Updates meta UI information for the specified object. | 413 | // Updates meta UI information for the specified object. |
450 | - protected void updateMetaUi(ObjectNode event) { | 414 | + protected void updateMetaUi(ObjectNode payload) { |
451 | - ObjectNode payload = payload(event); | 415 | + metaUi.put(JsonUtils.string(payload, "id"), |
452 | - metaUi.put(string(payload, "id"), (ObjectNode) payload.path("memento")); | 416 | + JsonUtils.node(payload, "memento")); |
453 | } | 417 | } |
454 | 418 | ||
455 | // Returns summary response. | 419 | // Returns summary response. |
456 | protected ObjectNode summmaryMessage(long sid) { | 420 | protected ObjectNode summmaryMessage(long sid) { |
457 | Topology topology = topologyService.currentTopology(); | 421 | Topology topology = topologyService.currentTopology(); |
458 | - return envelope("showSummary", sid, | 422 | + return JsonUtils.envelope("showSummary", sid, |
459 | json("ONOS Summary", "node", | 423 | json("ONOS Summary", "node", |
460 | new Prop("Devices", format(topology.deviceCount())), | 424 | new Prop("Devices", format(topology.deviceCount())), |
461 | new Prop("Links", format(topology.linkCount())), | 425 | new Prop("Links", format(topology.linkCount())), |
... | @@ -474,7 +438,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -474,7 +438,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
474 | String name = annot.value(AnnotationKeys.NAME); | 438 | String name = annot.value(AnnotationKeys.NAME); |
475 | int portCount = deviceService.getPorts(deviceId).size(); | 439 | int portCount = deviceService.getPorts(deviceId).size(); |
476 | int flowCount = getFlowCount(deviceId); | 440 | int flowCount = getFlowCount(deviceId); |
477 | - return envelope("showDetails", sid, | 441 | + return JsonUtils.envelope("showDetails", sid, |
478 | json(isNullOrEmpty(name) ? deviceId.toString() : name, | 442 | json(isNullOrEmpty(name) ? deviceId.toString() : name, |
479 | device.type().toString().toLowerCase(), | 443 | device.type().toString().toLowerCase(), |
480 | new Prop("URI", deviceId.toString()), | 444 | new Prop("URI", deviceId.toString()), |
... | @@ -552,7 +516,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -552,7 +516,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
552 | String type = annot.value(AnnotationKeys.TYPE); | 516 | String type = annot.value(AnnotationKeys.TYPE); |
553 | String name = annot.value(AnnotationKeys.NAME); | 517 | String name = annot.value(AnnotationKeys.NAME); |
554 | String vlan = host.vlan().toString(); | 518 | String vlan = host.vlan().toString(); |
555 | - return envelope("showDetails", sid, | 519 | + return JsonUtils.envelope("showDetails", sid, |
556 | json(isNullOrEmpty(name) ? hostId.toString() : name, | 520 | json(isNullOrEmpty(name) ? hostId.toString() : name, |
557 | isNullOrEmpty(type) ? "endstation" : type, | 521 | isNullOrEmpty(type) ? "endstation" : type, |
558 | new Prop("MAC", host.mac().toString()), | 522 | new Prop("MAC", host.mac().toString()), |
... | @@ -565,7 +529,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -565,7 +529,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
565 | 529 | ||
566 | 530 | ||
567 | // Produces JSON message to trigger traffic overview visualization | 531 | // Produces JSON message to trigger traffic overview visualization |
568 | - protected ObjectNode trafficSummaryMessage(long sid) { | 532 | + protected ObjectNode trafficSummaryMessage() { |
569 | ObjectNode payload = mapper.createObjectNode(); | 533 | ObjectNode payload = mapper.createObjectNode(); |
570 | ArrayNode paths = mapper.createArrayNode(); | 534 | ArrayNode paths = mapper.createArrayNode(); |
571 | payload.set("paths", paths); | 535 | payload.set("paths", paths); |
... | @@ -603,7 +567,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -603,7 +567,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
603 | } | 567 | } |
604 | } | 568 | } |
605 | } | 569 | } |
606 | - return envelope("showTraffic", sid, payload); | 570 | + return JsonUtils.envelope("showTraffic", 0, payload); |
607 | } | 571 | } |
608 | 572 | ||
609 | private Collection<BiLink> consolidateLinks(Iterable<Link> links) { | 573 | private Collection<BiLink> consolidateLinks(Iterable<Link> links) { |
... | @@ -615,7 +579,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -615,7 +579,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
615 | } | 579 | } |
616 | 580 | ||
617 | // Produces JSON message to trigger flow overview visualization | 581 | // Produces JSON message to trigger flow overview visualization |
618 | - protected ObjectNode flowSummaryMessage(long sid, Set<Device> devices) { | 582 | + protected ObjectNode flowSummaryMessage(Set<Device> devices) { |
619 | ObjectNode payload = mapper.createObjectNode(); | 583 | ObjectNode payload = mapper.createObjectNode(); |
620 | ArrayNode paths = mapper.createArrayNode(); | 584 | ArrayNode paths = mapper.createArrayNode(); |
621 | payload.set("paths", paths); | 585 | payload.set("paths", paths); |
... | @@ -626,7 +590,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -626,7 +590,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
626 | addLinkFlows(link, paths, counts.get(link)); | 590 | addLinkFlows(link, paths, counts.get(link)); |
627 | } | 591 | } |
628 | } | 592 | } |
629 | - return envelope("showTraffic", sid, payload); | 593 | + return JsonUtils.envelope("showTraffic", 0, payload); |
630 | } | 594 | } |
631 | 595 | ||
632 | private void addLinkFlows(Link link, ArrayNode paths, Integer count) { | 596 | private void addLinkFlows(Link link, ArrayNode paths, Integer count) { |
... | @@ -644,7 +608,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -644,7 +608,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
644 | 608 | ||
645 | 609 | ||
646 | // Produces JSON message to trigger traffic visualization | 610 | // Produces JSON message to trigger traffic visualization |
647 | - protected ObjectNode trafficMessage(long sid, TrafficClass... trafficClasses) { | 611 | + protected ObjectNode trafficMessage(TrafficClass... trafficClasses) { |
648 | ObjectNode payload = mapper.createObjectNode(); | 612 | ObjectNode payload = mapper.createObjectNode(); |
649 | ArrayNode paths = mapper.createArrayNode(); | 613 | ArrayNode paths = mapper.createArrayNode(); |
650 | payload.set("paths", paths); | 614 | payload.set("paths", paths); |
... | @@ -670,7 +634,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { | ... | @@ -670,7 +634,7 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler { |
670 | ((ArrayNode) pathNode.path("labels")).add(hasTraffic ? formatBytes(biLink.bytes) : ""); | 634 | ((ArrayNode) pathNode.path("labels")).add(hasTraffic ? formatBytes(biLink.bytes) : ""); |
671 | } | 635 | } |
672 | 636 | ||
673 | - return envelope("showTraffic", sid, payload); | 637 | + return JsonUtils.envelope("showTraffic", 0, payload); |
674 | } | 638 | } |
675 | 639 | ||
676 | // Classifies the link traffic according to the specified classes. | 640 | // Classifies the link traffic according to the specified classes. | ... | ... |
... | @@ -24,8 +24,8 @@ import org.onosproject.cluster.ClusterService; | ... | @@ -24,8 +24,8 @@ import org.onosproject.cluster.ClusterService; |
24 | import org.onosproject.cluster.ControllerNode; | 24 | import org.onosproject.cluster.ControllerNode; |
25 | import org.onosproject.ui.UiConnection; | 25 | import org.onosproject.ui.UiConnection; |
26 | import org.onosproject.ui.UiExtensionService; | 26 | import org.onosproject.ui.UiExtensionService; |
27 | -import org.onosproject.ui.UiMessageHandler; | ||
28 | import org.onosproject.ui.UiMessageHandlerFactory; | 27 | import org.onosproject.ui.UiMessageHandlerFactory; |
28 | +import org.onosproject.ui.UiMessageHandlerTwo; | ||
29 | import org.slf4j.Logger; | 29 | import org.slf4j.Logger; |
30 | import org.slf4j.LoggerFactory; | 30 | import org.slf4j.LoggerFactory; |
31 | 31 | ||
... | @@ -56,7 +56,7 @@ public class UiWebSocket | ... | @@ -56,7 +56,7 @@ public class UiWebSocket |
56 | 56 | ||
57 | private long lastActive = System.currentTimeMillis(); | 57 | private long lastActive = System.currentTimeMillis(); |
58 | 58 | ||
59 | - private Map<String, UiMessageHandler> handlers; | 59 | + private Map<String, UiMessageHandlerTwo> handlers; |
60 | 60 | ||
61 | /** | 61 | /** |
62 | * Creates a new web-socket for serving data to GUI. | 62 | * Creates a new web-socket for serving data to GUI. |
... | @@ -123,7 +123,7 @@ public class UiWebSocket | ... | @@ -123,7 +123,7 @@ public class UiWebSocket |
123 | try { | 123 | try { |
124 | ObjectNode message = (ObjectNode) mapper.reader().readTree(data); | 124 | ObjectNode message = (ObjectNode) mapper.reader().readTree(data); |
125 | String type = message.path("event").asText("unknown"); | 125 | String type = message.path("event").asText("unknown"); |
126 | - UiMessageHandler handler = handlers.get(type); | 126 | + UiMessageHandlerTwo handler = handlers.get(type); |
127 | if (handler != null) { | 127 | if (handler != null) { |
128 | handler.process(message); | 128 | handler.process(message); |
129 | } else { | 129 | } else { | ... | ... |
-
Please register or login to post a comment