Enhancement of tetopology implementation

To support regualar network and TE topology

Change-Id: Ib8319212d775c78f49a86a7b7685759099189967
diff --git a/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeMgrUtil.java b/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeMgrUtil.java
new file mode 100644
index 0000000..5781663
--- /dev/null
+++ b/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeMgrUtil.java
@@ -0,0 +1,231 @@
+/*
+ * 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.tetopology.management.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections.MapUtils;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.tetopology.management.api.DefaultNetwork;
+import org.onosproject.tetopology.management.api.KeyId;
+import org.onosproject.tetopology.management.api.Network;
+import org.onosproject.tetopology.management.api.TeTopology;
+import org.onosproject.tetopology.management.api.TeTopologyId;
+import org.onosproject.tetopology.management.api.TeTopologyKey;
+import org.onosproject.tetopology.management.api.link.DefaultNetworkLink;
+import org.onosproject.tetopology.management.api.link.NetworkLink;
+import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
+import org.onosproject.tetopology.management.api.link.TeLink;
+import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey;
+import org.onosproject.tetopology.management.api.link.TeLinkTpKey;
+import org.onosproject.tetopology.management.api.node.DefaultNetworkNode;
+import org.onosproject.tetopology.management.api.node.DefaultTerminationPoint;
+import org.onosproject.tetopology.management.api.node.NetworkNode;
+import org.onosproject.tetopology.management.api.node.NetworkNodeKey;
+import org.onosproject.tetopology.management.api.node.NodeTpKey;
+import org.onosproject.tetopology.management.api.node.TeNode;
+import org.onosproject.tetopology.management.api.node.TeNodeKey;
+import org.onosproject.tetopology.management.api.node.TerminationPoint;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+/**
+ * TE Topology Manager utility functions.
+ */
+public final class TeMgrUtil {
+    private static final String TENODE_ID = "teNodeId/";
+    private static final String TELINK_ID = "/teLinkId/";
+    private static final String PROVIDER_ID = "providerId/";
+    private static final String CLIENT_ID = "/clientId/";
+    private static final String TOPOLOGY_ID = "/topologyId/";
+
+    // no instantiation
+    private TeMgrUtil() {
+    }
+
+    /**
+     * Returns the network link id for a TE link local key.
+     *
+     * @param  key TE link local key
+     * @return value of network link id
+     */
+    public static KeyId toNetworkLinkId(TeLinkTpKey key) {
+        return KeyId.keyId(new StringBuilder()
+                .append(TENODE_ID)
+                .append(Ip4Address.valueOf((int) key.teNodeId()).toString())
+                .append(TELINK_ID)
+                .append(key.teLinkTpId()).toString());
+    }
+
+    /**
+     * Returns the network id for a TE topology id.
+     *
+     * @param  teTopologyId TE topology id
+     * @return value of network id
+     */
+    public static KeyId toNetworkId(TeTopologyId teTopologyId) {
+        return KeyId.keyId(new StringBuilder()
+                .append(PROVIDER_ID)
+                .append(teTopologyId.providerId())
+                .append(CLIENT_ID)
+                .append(teTopologyId.clientId())
+                .append(TOPOLOGY_ID)
+                .append(teTopologyId.topologyId()).toString());
+    }
+
+    /**
+     * Returns the network id for a TE topology key.
+     *
+     * @param  teTopologyKey TE topology key
+     * @return value of network id
+     */
+    public static KeyId toNetworkId(TeTopologyKey teTopologyKey) {
+        return KeyId.keyId(new StringBuilder()
+                .append(PROVIDER_ID)
+                .append(teTopologyKey.providerId())
+                .append(CLIENT_ID)
+                .append(teTopologyKey.clientId())
+                .append(TOPOLOGY_ID)
+                .append(teTopologyKey.topologyId()).toString());
+    }
+
+    /**
+     * Returns the network node key for a TE node global key.
+     *
+     * @param  teNodeKey TE node global key
+     * @return value of network node key
+     */
+    public static NetworkNodeKey networkNodeKey(TeNodeKey teNodeKey) {
+        return new NetworkNodeKey(toNetworkId(teNodeKey.teTopologyKey()),
+                                  KeyId.keyId(Long.toString(teNodeKey.teNodeId())));
+    }
+
+    /**
+     * Returns the network link key for a TE link global key.
+     *
+     * @param  teLinkKey TE link global key
+     * @return value of network link key
+     */
+    public static NetworkLinkKey networkLinkKey(TeLinkTpGlobalKey teLinkKey) {
+        return new NetworkLinkKey(toNetworkId(teLinkKey.teTopologyKey()),
+                                  toNetworkLinkId(teLinkKey.teLinkTpKey()));
+    }
+
+    /**
+     * Returns the TE topology id for a TE topology.
+     *
+     * @param  teTopology an instance of TE topology
+     * @return value of TE topology id
+     */
+    public static TeTopologyId teTopologyId(TeTopology teTopology) {
+        return new TeTopologyId(teTopology.teTopologyId().providerId(),
+                                teTopology.teTopologyId().clientId(),
+                                teTopology.teTopologyIdStringValue());
+    }
+
+    /**
+     * Returns a default instance of termination point for a TE termination point id.
+     *
+     * @param  teTpId TE termination point id
+     * @return an instance of termination point
+     */
+    private static TerminationPoint tpBuilder(long teTpId) {
+        return new DefaultTerminationPoint(KeyId.keyId(Long.toString(teTpId)), null, teTpId);
+    }
+
+    /**
+     * Returns an instance of network node for a TE node.
+     *
+     * @param id     value of the network node id
+     * @param teNode value of TE node
+     * @return an instance of network node
+     */
+    public static NetworkNode nodeBuilder(KeyId id, TeNode teNode) {
+        List<NetworkNodeKey> supportingNodeIds = null;
+        if (teNode.supportingTeNodeId() != null) {
+            supportingNodeIds = Lists.newArrayList(networkNodeKey(teNode.supportingTeNodeId()));
+        }
+        Map<KeyId, TerminationPoint> tps = Maps.newConcurrentMap();
+        for (Long teTpid : teNode.teTerminationPointIds()) {
+            tps.put(KeyId.keyId(Long.toString(teTpid)), tpBuilder(teTpid));
+        }
+        return new DefaultNetworkNode(id, supportingNodeIds, teNode, tps);
+    }
+
+    /**
+     * Returns the network node termination point key for a TE link end point key.
+     *
+     * @param  teLinkKey TE link end point key
+     * @return value of network node termination point key
+     */
+    public static NodeTpKey nodeTpKey(TeLinkTpKey teLinkKey) {
+        return new NodeTpKey(KeyId.keyId(Long.toString(teLinkKey.teNodeId())),
+                             KeyId.keyId(Long.toString(teLinkKey.teLinkTpId())));
+    }
+
+    /**
+     * Returns an instance of network link for a TE link.
+     *
+     * @param id     value of the network link id
+     * @param teLink value of TE link
+     * @return an instance of network link
+     */
+    public static NetworkLink linkBuilder(KeyId id, TeLink teLink) {
+        NodeTpKey source = nodeTpKey(teLink.teLinkKey());
+        NodeTpKey destination = null;
+        if (teLink.peerTeLinkKey() != null) {
+            destination = nodeTpKey(teLink.peerTeLinkKey());
+        }
+        List<NetworkLinkKey> supportingLinkIds = null;
+        if (teLink.supportingTeLinkId() != null) {
+            supportingLinkIds = Lists.newArrayList(networkLinkKey(teLink.supportingTeLinkId()));
+        }
+        return new DefaultNetworkLink(id, source, destination, supportingLinkIds, teLink);
+    }
+
+    /**
+     * Returns an instance of network for a TE topology.
+     *
+     * @param  teTopology value of TE topology
+     * @return an instance of network
+     */
+    public static Network networkBuilder(TeTopology teTopology) {
+        KeyId networkId = TeMgrUtil.toNetworkId(teTopology.teTopologyId());
+        TeTopologyId topologyId = teTopologyId(teTopology);
+        Map<KeyId, NetworkNode> nodes = null;
+        if (MapUtils.isNotEmpty(teTopology.teNodes())) {
+            nodes = Maps.newHashMap();
+            for (TeNode tenode : teTopology.teNodes().values()) {
+                KeyId key = KeyId.keyId(Long.toString(tenode.teNodeId()));
+                nodes.put(key, nodeBuilder(key, tenode));
+            }
+        }
+        Map<KeyId, NetworkLink> links = null;
+        if (MapUtils.isNotEmpty(teTopology.teLinks())) {
+            links = Maps.newHashMap();
+            for (TeLink telink : teTopology.teLinks().values()) {
+                KeyId key = TeMgrUtil.toNetworkLinkId(telink.teLinkKey());
+                links.put(key, linkBuilder(key, telink));
+
+            }
+        }
+        return new DefaultNetwork(networkId, null, nodes, links,
+                                  topologyId, false, teTopology.ownerId());
+    }
+
+}