| /* |
| * 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 org.onosproject.net.DeviceId; |
| import org.onosproject.net.Link; |
| import org.onosproject.net.PortNumber; |
| |
| /** |
| * Represents a link between two devices; that is, an infrastructure link. |
| */ |
| public class UiDeviceLink extends UiLink { |
| |
| private static final String E_UNASSOC = |
| "backing link not associated with this UI device link: "; |
| |
| // devices and ports at either end of this link |
| private DeviceId deviceA; |
| private DeviceId deviceB; |
| private PortNumber portA; |
| private PortNumber portB; |
| |
| // two unidirectional links underlying this link... |
| private Link linkAtoB; |
| private Link linkBtoA; |
| |
| |
| /** |
| * Creates a device to device UI link. |
| * |
| * @param topology parent topology |
| * @param id canonicalized link identifier |
| */ |
| public UiDeviceLink(UiTopology topology, UiLinkId id) { |
| super(topology, id); |
| } |
| |
| @Override |
| public String endPointA() { |
| return deviceA + UiLinkId.ID_PORT_DELIMITER + portA; |
| } |
| |
| @Override |
| public String endPointB() { |
| return deviceB + UiLinkId.ID_PORT_DELIMITER + portB; |
| } |
| |
| @Override |
| public String endPortA() { |
| return portA == null ? null : portA.toString(); |
| } |
| |
| @Override |
| public String endPortB() { |
| return portB == null ? null : portB.toString(); |
| } |
| |
| |
| @Override |
| protected void destroy() { |
| deviceA = null; |
| deviceB = null; |
| portA = null; |
| portB = null; |
| linkAtoB = null; |
| linkBtoA = null; |
| } |
| |
| |
| /** |
| * Attaches the given backing link to this UI link. This method will |
| * throw an exception if this UI link is not representative of the |
| * supplied link. |
| * |
| * @param link backing link to attach |
| * @throws IllegalArgumentException if the link is not appropriate |
| */ |
| public void attachBackingLink(Link link) { |
| UiLinkId.Direction d = id.directionOf(link); |
| |
| if (d == UiLinkId.Direction.A_TO_B) { |
| linkAtoB = link; |
| deviceA = link.src().deviceId(); |
| portA = link.src().port(); |
| deviceB = link.dst().deviceId(); |
| portB = link.dst().port(); |
| |
| } else if (d == UiLinkId.Direction.B_TO_A) { |
| linkBtoA = link; |
| deviceB = link.src().deviceId(); |
| portB = link.src().port(); |
| deviceA = link.dst().deviceId(); |
| portA = link.dst().port(); |
| |
| } else { |
| throw new IllegalArgumentException(E_UNASSOC + link); |
| } |
| } |
| |
| /** |
| * Detaches the given backing link from this UI link, returning true if the |
| * reverse link is still attached, or false otherwise. |
| * |
| * @param link the backing link to detach |
| * @return true if other link still attached, false otherwise |
| * @throws IllegalArgumentException if the link is not appropriate |
| */ |
| public boolean detachBackingLink(Link link) { |
| UiLinkId.Direction d = id.directionOf(link); |
| if (d == UiLinkId.Direction.A_TO_B) { |
| linkAtoB = null; |
| return linkBtoA != null; |
| } |
| if (d == UiLinkId.Direction.B_TO_A) { |
| linkBtoA = null; |
| return linkAtoB != null; |
| } |
| throw new IllegalArgumentException(E_UNASSOC + link); |
| } |
| |
| |
| /** |
| * Returns the identity of device A. |
| * |
| * @return device A ID |
| */ |
| public DeviceId deviceA() { |
| return deviceA; |
| } |
| |
| /** |
| * Returns the port number of device A. |
| * |
| * @return port A |
| */ |
| public PortNumber portA() { |
| return portA; |
| } |
| |
| /** |
| * Returns the identity of device B. |
| * |
| * @return device B ID |
| */ |
| public DeviceId deviceB() { |
| return deviceB; |
| } |
| |
| /** |
| * Returns the port number of device B. |
| * |
| * @return port B |
| */ |
| public PortNumber portB() { |
| return portB; |
| } |
| |
| /** |
| * Returns backing link from A to B. |
| * |
| * @return backing link A to B |
| */ |
| public Link linkAtoB() { |
| return linkAtoB; |
| } |
| |
| /** |
| * Returns backing link from B to A. |
| * |
| * @return backing link B to A |
| */ |
| public Link linkBtoA() { |
| return linkBtoA; |
| } |
| |
| } |