| /* |
| * Copyright 2016-present Open Networking Laboratory |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.onosproject.ui.model.topo; |
| |
| import com.google.common.base.MoreObjects; |
| import org.onosproject.net.region.Region; |
| import org.onosproject.net.region.RegionId; |
| |
| import static com.google.common.base.Preconditions.checkArgument; |
| import static com.google.common.base.Preconditions.checkNotNull; |
| |
| /** |
| * Represents a specific "subset" of the UI model of the network topology |
| * that a user might wish to view. Backed by a {@link Region}. |
| * <p> |
| * These instances include information about which geo-map or grid-layout |
| * should be displayed, along with zoom and offset parameters. |
| */ |
| public class UiTopoLayout { |
| |
| // package private for unit test access |
| static final double SCALE_MIN = 0.01; |
| static final double SCALE_MAX = 100.0; |
| static final double SCALE_DEFAULT = 1.0; |
| static final double OFFSET_DEFAULT = 0.0; |
| |
| static final String E_ROOT_PARENT = "Cannot change parent ID of root layout"; |
| static final String E_ROOT_REGION = "Cannot set region on root layout"; |
| static final String E_SPRITES_SET = "Cannot set geomap if sprites is set"; |
| static final String E_GEOMAP_SET = "Cannot set sprites if geomap is set"; |
| static final String E_SCALE_OOB = |
| "Scale out of bounds; expected [" + SCALE_MIN + ".." + SCALE_MAX + "]"; |
| |
| private final UiTopoLayoutId id; |
| |
| private Region region; |
| private UiTopoLayoutId parent; |
| private String geomap; |
| private String sprites; |
| private double scale = SCALE_DEFAULT; |
| private double offsetX = OFFSET_DEFAULT; |
| private double offsetY = OFFSET_DEFAULT; |
| |
| /** |
| * Created a new UI topology layout. |
| * |
| * @param id layout identifier |
| */ |
| public UiTopoLayout(UiTopoLayoutId id) { |
| checkNotNull(id, "layout ID cannot be null"); |
| this.id = id; |
| |
| // NOTE: root layout is its own parent... |
| if (isRoot()) { |
| parent = id; |
| } |
| } |
| |
| /** |
| * Returns true if this layout instance is at the top of the |
| * hierarchy tree. |
| * |
| * @return true if this is the root layout |
| */ |
| public boolean isRoot() { |
| return UiTopoLayoutId.DEFAULT_ID.equals(id); |
| } |
| |
| /** |
| * Returns the UI layout identifier. |
| * |
| * @return identifier of the layout |
| */ |
| public UiTopoLayoutId id() { |
| return id; |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(this) |
| .add("id", id) |
| .add("region", region) |
| .add("parent", parent) |
| .add("geomap", geomap) |
| .add("sprites", sprites) |
| .add("scale", scale) |
| .add("offsetX", offsetX) |
| .add("offsetY", offsetY) |
| .toString(); |
| } |
| |
| /** |
| * Sets the backing region for this layout. Note that an exception will |
| * be thrown if this is the root layout. |
| * |
| * @param region the backing region |
| * @return self, for chaining |
| * @throws IllegalArgumentException if this is the root layout |
| */ |
| public UiTopoLayout region(Region region) { |
| if (isRoot()) { |
| throw new IllegalArgumentException(E_ROOT_REGION); |
| } |
| |
| this.region = region; |
| return this; |
| } |
| |
| /** |
| * Returns the backing region with which this layout is associated. Note |
| * that this may be null (for the root layout). |
| * |
| * @return backing region |
| */ |
| public Region region() { |
| return region; |
| } |
| |
| /** |
| * Returns the identifier of the backing region. If this is the default |
| * layout, the null-region ID will be returned, otherwise the ID of the |
| * backing region for this layout will be returned; null in the case that |
| * there is no backing region. |
| * |
| * @return backing region identifier |
| */ |
| public RegionId regionId() { |
| return isRoot() ? UiRegion.NULL_ID : |
| (region == null ? null : region.id()); |
| } |
| |
| /** |
| * Sets the identity of this layout's parent. May be null to unset. |
| * Note that an exception will be thrown if this is the root layout, |
| * since the parent of the root is always itself, and cannot be changed. |
| * |
| * @param parentId parent layout identifier |
| * @return self, for chaining |
| * @throws IllegalArgumentException if this instance is the root layout |
| */ |
| public UiTopoLayout parent(UiTopoLayoutId parentId) { |
| if (isRoot()) { |
| throw new IllegalArgumentException(E_ROOT_PARENT); |
| } |
| // TODO: consider checking ancestry chain to prevent loops |
| |
| parent = parentId; |
| return this; |
| } |
| |
| /** |
| * Returns the parent layout identifier. |
| * |
| * @return parent layout identifier |
| */ |
| public UiTopoLayoutId parent() { |
| return parent; |
| } |
| |
| /** |
| * Sets the name of the geomap for this layout. This is the symbolic |
| * name for a "topojson" file containing a geographic map projection, |
| * to be displayed in the topology view, for this layout. |
| * <p> |
| * Since the geomap and sprites fields are mutually exclusive, this |
| * method will throw an exception if the sprites field is already set. |
| * |
| * @param geomap the geomap name |
| * @return self, for chaining |
| * @throws IllegalArgumentException if the sprites field is not null |
| */ |
| public UiTopoLayout geomap(String geomap) { |
| if (sprites != null) { |
| throw new IllegalArgumentException(E_SPRITES_SET); |
| } |
| this.geomap = geomap; |
| return this; |
| } |
| |
| /** |
| * Returns the symbolic name for the geomap for this layout. |
| * |
| * @return name of geomap |
| */ |
| public String geomap() { |
| return geomap; |
| } |
| |
| /** |
| * Sets the name of the sprites definition for this layout. This is the |
| * symbolic name for a definition of sprites, |
| * which render as a symbolic background (e.g. a campus, or floor plan), |
| * to be displayed in the topology view, for this layout. |
| * <p> |
| * Since the geomap and sprites fields are mutually exclusive, this |
| * method will throw an exception if the geomap field is already set. |
| * |
| * @param sprites the sprites definition name |
| * @return self, for chaining |
| * @throws IllegalArgumentException if the geomap field is not null |
| */ |
| public UiTopoLayout sprites(String sprites) { |
| if (geomap != null) { |
| throw new IllegalArgumentException(E_GEOMAP_SET); |
| } |
| this.sprites = sprites; |
| return this; |
| } |
| |
| /** |
| * Returns the symbolic name for the sprites definition for this layout. |
| * |
| * @return name of sprites definition |
| */ |
| public String sprites() { |
| return sprites; |
| } |
| |
| private boolean scaleWithinBounds(double scale) { |
| return scale >= SCALE_MIN && scale <= SCALE_MAX; |
| } |
| |
| /** |
| * Sets the scale for the geomap / sprite image. Note that the |
| * acceptable bounds are from {@value #SCALE_MIN} to {@value #SCALE_MAX}. |
| * |
| * @param scale the scale |
| * @return self for chaining |
| * @throws IllegalArgumentException if the value is out of bounds |
| */ |
| public UiTopoLayout scale(double scale) { |
| checkArgument(scaleWithinBounds(scale), E_SCALE_OOB); |
| this.scale = scale; |
| return this; |
| } |
| |
| /** |
| * Returns the scale for the geomap / sprite image. |
| * |
| * @return the scale |
| */ |
| public double scale() { |
| return scale; |
| } |
| |
| /** |
| * Sets the x-offset value. |
| * |
| * @param offsetX x-offset |
| * @return self, for chaining |
| */ |
| public UiTopoLayout offsetX(double offsetX) { |
| this.offsetX = offsetX; |
| return this; |
| } |
| |
| /** |
| * Returns the x-offset value. |
| * |
| * @return the x-offset |
| */ |
| public double offsetX() { |
| return offsetX; |
| } |
| |
| /** |
| * Sets the y-offset value. |
| * |
| * @param offsetY y-offset |
| * @return self, for chaining |
| */ |
| public UiTopoLayout offsetY(double offsetY) { |
| this.offsetY = offsetY; |
| return this; |
| } |
| |
| /** |
| * Returns the y-offset value. |
| * |
| * @return the y-offset |
| */ |
| public double offsetY() { |
| return offsetY; |
| } |
| |
| } |