implement OchPort,OduCltPort,OmsPort

Change-Id: I26425c87a52d2d6d3f7d64357d728e475ef6b10d
diff --git a/apps/pcep-api/src/main/java/org/onosproject/pcep/api/PcepLink.java b/apps/pcep-api/src/main/java/org/onosproject/pcep/api/PcepLink.java
index d36317f..e4f9a2c 100644
--- a/apps/pcep-api/src/main/java/org/onosproject/pcep/api/PcepLink.java
+++ b/apps/pcep-api/src/main/java/org/onosproject/pcep/api/PcepLink.java
@@ -15,6 +15,8 @@
  */
 package org.onosproject.pcep.api;
 
+import org.onosproject.net.Port;
+
 /**
  * Abstraction of a network infrastructure link.
  */
@@ -118,17 +120,17 @@
     public PcepDpid linkDstDeviceId();
 
     /**
-     * Returns the source port number of a link.
+     * Returns the source port of a link.
      *
      * @return port number
      */
-    public long linkSrcPort();
+    public Port linkSrcPort();
 
     /**
-     * Returns the destination port number of a link.
+     * Returns the destination port of a link.
      *
      * @return port number
      */
-    public long linkDstPort();
+    public Port linkDstPort();
 
 }
diff --git a/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java b/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
index b43a912..38eaf1f 100644
--- a/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
+++ b/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
@@ -15,15 +15,6 @@
  */
 package org.onosproject.provider.pcep.topology.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.net.DeviceId.deviceId;
-import static org.onosproject.pcep.api.PcepDpid.uri;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -37,10 +28,12 @@
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
-import org.onosproject.net.Link;
 import org.onosproject.net.Link.Type;
 import org.onosproject.net.MastershipRole;
-import org.onosproject.net.PortNumber;
+import org.onosproject.net.OchPort;
+import org.onosproject.net.OduCltPort;
+import org.onosproject.net.OmsPort;
+import org.onosproject.net.Port;
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DefaultPortDescription;
 import org.onosproject.net.device.DeviceDescription;
@@ -48,6 +41,9 @@
 import org.onosproject.net.device.DeviceProviderRegistry;
 import org.onosproject.net.device.DeviceProviderService;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.device.OchPortDescription;
+import org.onosproject.net.device.OduCltPortDescription;
+import org.onosproject.net.device.OmsPortDescription;
 import org.onosproject.net.device.PortDescription;
 import org.onosproject.net.link.DefaultLinkDescription;
 import org.onosproject.net.link.LinkDescription;
@@ -68,6 +64,14 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.net.DeviceId.deviceId;
+import static org.onosproject.pcep.api.PcepDpid.uri;
+
 /**
  * Provider which uses an PCEP controller to detect network infrastructure
  * topology.
@@ -109,8 +113,8 @@
 
     private DeviceProviderService deviceProviderService;
     private LinkProviderService linkProviderService;
-    // List<Long> srcportList = new ArrayList<Long>();
-    HashSet<Long> portSet = new HashSet<>();
+
+    private HashMap<Long, List<PortDescription>> portMap = new HashMap<>();
     private InternalLinkProvider listener = new InternalLinkProvider();
 
     @Activate
@@ -129,36 +133,50 @@
         controller.removeLinkListener(listener);
     }
 
-    private List<PortDescription> buildPortDescriptions(List<Long> ports,
+    private List<PortDescription> buildPortDescriptions(PcepDpid dpid,
+                                                        Port port,
                                                         PortType portType) {
-        final List<PortDescription> portDescs = new ArrayList<>();
-        for (long port : ports) {
-            portDescs.add(buildPortDescription(port, portType));
+
+        List<PortDescription> portList;
+
+        if (portMap.containsKey(dpid.value())) {
+            portList = portMap.get(dpid.value());
+        } else {
+            portList = new ArrayList<>();
         }
-        return portDescs;
+        if (port != null && portType != null) {
+            portList.add(buildPortDescription(port, portType));
+        }
+
+        portMap.put(dpid.value(), portList);
+        return portList;
     }
 
-    private PortDescription buildPortDescription(long port, PortType portType) {
-        final PortNumber portNo = PortNumber.portNumber(port);
-        final boolean enabled = true;
-        DefaultAnnotations extendedAttributes = DefaultAnnotations.builder()
-                .set("portType", String.valueOf(portType)).build();
-        return new DefaultPortDescription(portNo, enabled, extendedAttributes);
-    }
+    private PortDescription buildPortDescription(Port port, PortType portType) {
+        PortDescription portDescription;
 
-    private DefaultAnnotations buildLinkAnnotations(PcepLink linkDesc) {
-        DefaultAnnotations extendedAttributes = DefaultAnnotations
-                .builder()
-                .set("subType", String.valueOf(linkDesc.linkSubType()))
-                .set("workState", linkDesc.linkState())
-                .set("distance", String.valueOf(linkDesc.linkDistance()))
-                .set("capType", linkDesc.linkCapacityType().toLowerCase())
-                .set("avail_" + linkDesc.linkCapacityType().toLowerCase(),
-                     String.valueOf(linkDesc.linkAvailValue()))
-                .set("max_" + linkDesc.linkCapacityType().toLowerCase(),
-                     String.valueOf(linkDesc.linkMaxValue())).build();
-
-        return extendedAttributes;
+        switch (portType) {
+            case OCH_PORT:
+                OchPort ochp = (OchPort) port;
+                portDescription = new OchPortDescription(ochp.number(), ochp.isEnabled(),
+                        ochp.signalType(), ochp.isTunable(),
+                        ochp.lambda());
+                break;
+            case ODU_PORT:
+                OduCltPort odup = (OduCltPort) port;
+                portDescription = new OduCltPortDescription(odup.number(), odup.isEnabled(),
+                        odup.signalType());
+                break;
+            case OMS_PORT:
+                OmsPort op = (OmsPort) port;
+                portDescription = new OmsPortDescription(op.number(), op.isEnabled(), op.minFrequency(),
+                        op.maxFrequency(), op.grid());
+                break;
+            default:
+                portDescription = new DefaultPortDescription(port.number(), port.isEnabled());
+                break;
+        }
+        return portDescription;
     }
 
     /**
@@ -169,109 +187,82 @@
      */
     private LinkDescription buildLinkDescription(PcepLink pceLink) {
         LinkDescription ld;
-
+        checkNotNull(pceLink);
         DeviceId srcDeviceID = deviceId(uri(pceLink.linkSrcDeviceID()));
         DeviceId dstDeviceID = deviceId(uri(pceLink.linkDstDeviceId()));
 
-        if (deviceService.getDevice(srcDeviceID) == null
-                || deviceService.getDevice(dstDeviceID) == null) {
-            log.info("the device of the link is not exited" + srcDeviceID
-                    + dstDeviceID);
-            return null;
-        }
-        // update port info
-        long srcPort = pceLink.linkSrcPort();
-        portSet.add(srcPort);
-        List<Long> srcportList = new ArrayList<Long>();
-        srcportList.addAll(portSet);
         deviceProviderService
                 .updatePorts(srcDeviceID,
-                             buildPortDescriptions(srcportList,
-                                                   pceLink.portType()));
+                        buildPortDescriptions(pceLink.linkSrcDeviceID(),
+                                pceLink.linkSrcPort(), pceLink.portType()));
 
-        ConnectPoint src = new ConnectPoint(srcDeviceID,
-                                            PortNumber.portNumber(pceLink
-                                                    .linkSrcPort()));
+        deviceProviderService
+                .updatePorts(dstDeviceID,
+                        buildPortDescriptions(pceLink.linkDstDeviceId(),
+                                pceLink.linkDstPort(), pceLink.portType()));
 
-        ConnectPoint dst = new ConnectPoint(dstDeviceID,
-                                            PortNumber.portNumber(pceLink
-                                                    .linkDstPort()));
-        DefaultAnnotations extendedAttributes = buildLinkAnnotations(pceLink);
+        ConnectPoint src = new ConnectPoint(srcDeviceID, pceLink.linkSrcPort().number());
 
+        ConnectPoint dst = new ConnectPoint(dstDeviceID, pceLink.linkDstPort().number());
+
+        DefaultAnnotations extendedAttributes = DefaultAnnotations
+                .builder()
+                .set("subType", String.valueOf(pceLink.linkSubType()))
+                .set("workState", pceLink.linkState())
+                .set("distance", String.valueOf(pceLink.linkDistance()))
+                .set("capType", pceLink.linkCapacityType().toLowerCase())
+                .set("avail_" + pceLink.linkCapacityType().toLowerCase(),
+                        String.valueOf(pceLink.linkAvailValue()))
+                .set("max_" + pceLink.linkCapacityType().toLowerCase(),
+                        String.valueOf(pceLink.linkMaxValue())).build();
         // construct the link
-        ld = new DefaultLinkDescription(src, dst, Type.OPTICAL,
-                                        extendedAttributes);
+        ld = new DefaultLinkDescription(src, dst, Type.OPTICAL, extendedAttributes);
         return ld;
     }
 
-    private void processLinkUpdate(LinkDescription linkDescription) {
-
-        // dst changed, delete the original link,if the dst device is not in
-        // other links ,delete it.
-        if (linkService.getLink(linkDescription.src(), linkDescription.dst()) == null) {
-            // in face,one src one link
-            Set<Link> links = linkService
-                    .getIngressLinks(linkDescription.src());
-            for (Link link : links) {
-                linkProviderService.linkVanished((LinkDescription) link);
-                if (linkService.getDeviceLinks(link.dst().deviceId()).size() == 0) {
-                    deviceProviderService.deviceDisconnected(link.dst()
-                            .deviceId());
-                }
-            }
-
-        }
-        linkProviderService.linkDetected(linkDescription);
-
-    }
-
     private class InternalLinkProvider
             implements PcepSwitchListener, PcepLinkListener {
 
         @Override
         public void switchAdded(PcepDpid dpid) {
-            // TODO Auto-generated method stub
-
             if (deviceProviderService == null) {
                 return;
             }
-            DeviceId devicdId = deviceId(uri(dpid));
+            DeviceId deviceId = deviceId(uri(dpid));
             PcepSwitch sw = controller.getSwitch(dpid);
             checkNotNull(sw, "device should not null.");
             // The default device type is switch.
             ChassisId cId = new ChassisId(dpid.value());
-            Device.Type deviceType = null;
+            Device.Type deviceType;
 
             switch (sw.getDeviceType()) {
-            case ROADM:
-                deviceType = Device.Type.ROADM;
-                break;
-            case OTN:
-                deviceType = Device.Type.SWITCH;
-                break;
-            case ROUTER:
-                deviceType = Device.Type.ROUTER;
-                break;
-            default:
-                deviceType = Device.Type.OTHER;
+                case ROADM:
+                    deviceType = Device.Type.ROADM;
+                    break;
+                case OTN:
+                    deviceType = Device.Type.SWITCH;
+                    break;
+                case ROUTER:
+                    deviceType = Device.Type.ROUTER;
+                    break;
+                default:
+                    deviceType = Device.Type.OTHER;
             }
 
             DeviceDescription description = new DefaultDeviceDescription(
-                                                                         devicdId.uri(),
-                                                                         deviceType,
-                                                                         sw.manufacturerDescription(),
-                                                                         sw.hardwareDescription(),
-                                                                         sw.softwareDescription(),
-                                                                         sw.serialNumber(),
-                                                                         cId);
-            deviceProviderService.deviceConnected(devicdId, description);
+                    deviceId.uri(),
+                    deviceType,
+                    sw.manufacturerDescription(),
+                    sw.hardwareDescription(),
+                    sw.softwareDescription(),
+                    sw.serialNumber(),
+                    cId);
+            deviceProviderService.deviceConnected(deviceId, description);
 
         }
 
         @Override
         public void switchRemoved(PcepDpid dpid) {
-            // TODO Auto-generated method stub
-
             if (deviceProviderService == null || linkProviderService == null) {
                 return;
             }
@@ -296,19 +287,17 @@
                 return;
             }
             switch (operType) {
-            case ADD:
-                linkProviderService.linkDetected(ld);
-                break;
-            case UPDATE:
-                processLinkUpdate(ld);
-                break;
+                case ADD:
+                case UPDATE:
+                    linkProviderService.linkDetected(ld);
+                    break;
 
-            case DELETE:
-                linkProviderService.linkVanished(ld);
-                break;
+                case DELETE:
+                    linkProviderService.linkVanished(ld);
+                    break;
 
-            default:
-                break;
+                default:
+                    break;
 
             }
         }