blob: b3185f1c120411f3174ff271aea8b41f6870c57b [file] [log] [blame]
Simon Hunt5f6dbf82016-03-30 08:53:33 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Simon Hunt5f6dbf82016-03-30 08:53:33 -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.
15 */
16
17package org.onosproject.ui.model.topo;
18
Simon Hunt58a0dd02016-05-17 11:54:23 -070019import com.google.common.collect.ImmutableSet;
Simon Huntc0f20c12016-05-09 09:30:20 -070020import org.onosproject.net.DeviceId;
21import org.onosproject.net.HostId;
Simon Hunt23fb1352016-04-11 12:15:19 -070022import org.onosproject.net.region.Region;
Simon Hunt642bc452016-05-04 19:34:45 -070023import org.onosproject.net.region.RegionId;
Simon Hunt23fb1352016-04-11 12:15:19 -070024
Simon Huntd5b96732016-07-08 13:22:27 -070025import java.util.ArrayList;
26import java.util.Collections;
Simon Huntc0f20c12016-05-09 09:30:20 -070027import java.util.HashSet;
Simon Huntd5b96732016-07-08 13:22:27 -070028import java.util.List;
Simon Hunt23fb1352016-04-11 12:15:19 -070029import java.util.Set;
Simon Huntc0f20c12016-05-09 09:30:20 -070030
31import static com.google.common.base.MoreObjects.toStringHelper;
Simon Huntb1ce2602016-07-23 14:04:31 -070032import static org.onosproject.net.region.RegionId.regionId;
Simon Hunt23fb1352016-04-11 12:15:19 -070033
Simon Hunt5f6dbf82016-03-30 08:53:33 -070034/**
35 * Represents a region.
36 */
37public class UiRegion extends UiNode {
Simon Hunt23fb1352016-04-11 12:15:19 -070038
Simon Huntb1ce2602016-07-23 14:04:31 -070039 private static final String NULL_NAME = "<null-region>";
40
41 /**
42 * The identifier for the null-region. That is, a container for devices,
43 * hosts, and links for those that belong to no region.
44 */
45 public static final RegionId NULL_ID = regionId(NULL_NAME);
46
47 private static final String[] DEFAULT_LAYER_TAGS = {
48 UiNode.LAYER_OPTICAL,
49 UiNode.LAYER_PACKET,
50 UiNode.LAYER_DEFAULT
51 };
52
Simon Huntc0f20c12016-05-09 09:30:20 -070053 // loose bindings to things in this region
54 private final Set<DeviceId> deviceIds = new HashSet<>();
55 private final Set<HostId> hostIds = new HashSet<>();
56 private final Set<UiLinkId> uiLinkIds = new HashSet<>();
Simon Hunt23fb1352016-04-11 12:15:19 -070057
Simon Huntd5b96732016-07-08 13:22:27 -070058 private final List<String> layerOrder = new ArrayList<>();
59
Simon Huntc0f20c12016-05-09 09:30:20 -070060 private final UiTopology topology;
Simon Hunt23fb1352016-04-11 12:15:19 -070061
Simon Huntc0f20c12016-05-09 09:30:20 -070062 private final Region region;
63
Simon Hunt4f4ffc32016-08-03 18:30:47 -070064 // keep track of hierarchy (inferred from UiTopoLayoutService)
65 private RegionId parent;
66 private final Set<RegionId> kids = new HashSet<>();
67
Simon Huntc0f20c12016-05-09 09:30:20 -070068 /**
69 * Constructs a UI region, with a reference to the specified backing region.
70 *
71 * @param topology parent topology
72 * @param region backing region
73 */
74 public UiRegion(UiTopology topology, Region region) {
Simon Huntb1ce2602016-07-23 14:04:31 -070075 // Implementation Note: if region is null, this UiRegion is being used
76 // as a container for devices, hosts, links that belong to no region.
Simon Huntc0f20c12016-05-09 09:30:20 -070077 this.topology = topology;
78 this.region = region;
Simon Huntb1ce2602016-07-23 14:04:31 -070079
80 setLayerOrder(DEFAULT_LAYER_TAGS);
Simon Huntc0f20c12016-05-09 09:30:20 -070081 }
Simon Hunt23fb1352016-04-11 12:15:19 -070082
83 @Override
84 protected void destroy() {
Simon Huntc0f20c12016-05-09 09:30:20 -070085 deviceIds.clear();
86 hostIds.clear();
87 uiLinkIds.clear();
Simon Hunt23fb1352016-04-11 12:15:19 -070088 }
89
Simon Hunt642bc452016-05-04 19:34:45 -070090 /**
Simon Huntd5b96732016-07-08 13:22:27 -070091 * Sets the layer order for this region.
92 * Typically, the {@code UiNode.LAYER_*} constants will be used here.
93 *
94 * @param layers the layers
95 */
96 public void setLayerOrder(String... layers) {
97 layerOrder.clear();
98 Collections.addAll(layerOrder, layers);
99 }
100
101 /**
Simon Hunt642bc452016-05-04 19:34:45 -0700102 * Returns the identity of the region.
103 *
104 * @return region ID
105 */
106 public RegionId id() {
Simon Huntb1ce2602016-07-23 14:04:31 -0700107 return region == null ? NULL_ID : region.id();
Simon Hunt642bc452016-05-04 19:34:45 -0700108 }
109
Simon Hunt4f4ffc32016-08-03 18:30:47 -0700110 /**
111 * Returns the identity of the parent region.
112 *
113 * @return parent region ID
114 */
115 public RegionId parent() {
116 return parent;
117 }
118
119 /**
120 * Returns true if this is the root (default) region.
121 *
122 * @return true if root region
123 */
124 public boolean isRoot() {
125 return id().equals(parent);
126 }
127
128 /**
129 * Returns the identities of the child regions.
130 *
131 * @return child region IDs
132 */
133 public Set<RegionId> children() {
134 return ImmutableSet.copyOf(kids);
135 }
136
137 /**
138 * Sets the parent ID for this region.
139 *
140 * @param parentId parent ID
141 */
142 public void setParent(RegionId parentId) {
143 parent = parentId;
144 }
145
146 /**
147 * Sets the children IDs for this region.
148 *
149 * @param children children IDs
150 */
151 public void setChildren(Set<RegionId> children) {
152 kids.clear();
153 kids.addAll(children);
154 }
155
Simon Hunt642bc452016-05-04 19:34:45 -0700156 @Override
157 public String idAsString() {
158 return id().toString();
159 }
Simon Huntc0f20c12016-05-09 09:30:20 -0700160
161 @Override
162 public String name() {
Simon Huntb1ce2602016-07-23 14:04:31 -0700163 return region == null ? NULL_NAME : region.name();
Simon Huntc0f20c12016-05-09 09:30:20 -0700164 }
165
166 /**
Simon Huntb1ce2602016-07-23 14:04:31 -0700167 * Returns the region instance backing this UI region. If this instance
168 * represents the "null-region", the value returned will be null.
Simon Huntc0f20c12016-05-09 09:30:20 -0700169 *
170 * @return the backing region instance
171 */
172 public Region backingRegion() {
173 return region;
174 }
175
176 /**
177 * Make sure we have only these devices in the region.
178 *
179 * @param devices devices in the region
180 */
181 public void reconcileDevices(Set<DeviceId> devices) {
182 deviceIds.clear();
183 deviceIds.addAll(devices);
184 }
185
186 @Override
187 public String toString() {
188 return toStringHelper(this)
189 .add("id", id())
190 .add("name", name())
Simon Hunt4f4ffc32016-08-03 18:30:47 -0700191 .add("parent", parent)
192 .add("kids", kids)
Simon Huntc0f20c12016-05-09 09:30:20 -0700193 .add("devices", deviceIds)
194 .add("#hosts", hostIds.size())
195 .add("#links", uiLinkIds.size())
196 .toString();
197 }
198
199 /**
200 * Returns the region's type.
201 *
202 * @return region type
203 */
204 public Region.Type type() {
Simon Huntb1ce2602016-07-23 14:04:31 -0700205 return region == null ? null : region.type();
206 }
207
208
209 /**
210 * Returns the count of devices in this region.
211 *
212 * @return the device count
213 */
214 public int deviceCount() {
215 return deviceIds.size();
Simon Huntc0f20c12016-05-09 09:30:20 -0700216 }
217
218 /**
Simon Hunt58a0dd02016-05-17 11:54:23 -0700219 * Returns the set of device identifiers for this region.
220 *
221 * @return device identifiers for this region
222 */
223 public Set<DeviceId> deviceIds() {
224 return ImmutableSet.copyOf(deviceIds);
225 }
226
227 /**
Simon Huntc0f20c12016-05-09 09:30:20 -0700228 * Returns the devices in this region.
229 *
230 * @return the devices in this region
231 */
232 public Set<UiDevice> devices() {
233 return topology.deviceSet(deviceIds);
234 }
235
236 /**
Simon Hunt58a0dd02016-05-17 11:54:23 -0700237 * Returns the set of host identifiers for this region.
238 *
239 * @return host identifiers for this region
240 */
241 public Set<HostId> hostIds() {
242 return ImmutableSet.copyOf(hostIds);
243 }
244
245 /**
Simon Huntc0f20c12016-05-09 09:30:20 -0700246 * Returns the hosts in this region.
247 *
248 * @return the hosts in this region
249 */
250 public Set<UiHost> hosts() {
251 return topology.hostSet(hostIds);
252 }
253
254 /**
Simon Hunt58a0dd02016-05-17 11:54:23 -0700255 * Returns the set of link identifiers for this region.
256 *
257 * @return link identifiers for this region
258 */
259 public Set<UiLinkId> linkIds() {
260 return ImmutableSet.copyOf(uiLinkIds);
261 }
262
263 /**
Simon Huntc0f20c12016-05-09 09:30:20 -0700264 * Returns the links in this region.
265 *
266 * @return the links in this region
267 */
268 public Set<UiLink> links() {
269 return topology.linkSet(uiLinkIds);
270 }
Simon Huntd5b96732016-07-08 13:22:27 -0700271
272 /**
273 * Returns the order in which layers should be rendered. Lower layers
274 * come earlier in the list. For example, to indicate that nodes in the
275 * optical layer should be rendered "below" nodes in the packet layer,
276 * this method should return:
277 * <pre>
Simon Huntb1ce2602016-07-23 14:04:31 -0700278 * [UiNode.LAYER_OPTICAL, UiNode.LAYER_PACKET, UiNode.LAYER_DEFAULT]
Simon Huntd5b96732016-07-08 13:22:27 -0700279 * </pre>
280 *
281 * @return layer ordering
282 */
283 public List<String> layerOrder() {
284 return Collections.unmodifiableList(layerOrder);
285 }
Simon Hunt5f6dbf82016-03-30 08:53:33 -0700286}