Network topology and inventory init
[transportpce.git] / networkmodel / src / main / java / org / opendaylight / transportpce / networkmodel / util / LinkIdUtil.java
diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/LinkIdUtil.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/LinkIdUtil.java
new file mode 100644 (file)
index 0000000..cf6eed3
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright © 2016 AT&T and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.networkmodel.util;
+
+import java.text.MessageFormat;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.LinkId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRoadmNodesInput;
+
+public final class LinkIdUtil {
+
+    private static final String NETWORK = "-NETWORK";
+    private static final String TRANSMIT = "-TX";
+    private static final String RECEIVE = "-RX";
+    private static final String BIDIRECTIONAL = "-TXRX";
+    private static final MessageFormat LINK_ID_FORMAT = new MessageFormat("{0}-{1}to{2}-{3}");
+
+    private LinkIdUtil() {
+        // utility class
+    }
+
+    /**
+     * Builds the Link id in format {@link LinkIdUtil#LINK_ID_FORMAT}.
+     *
+     * @param srcNode source node id string
+     * @param srcTp source termination point
+     * @param destNode destination node id
+     * @param destTp destination termination point
+     * @return {@link LinkId}
+     */
+    public static LinkId buildLinkId(String srcNode, String srcTp, String destNode, String destTp) {
+        return new LinkId(LINK_ID_FORMAT
+                .format(new Object[] {srcNode, srcTp, destNode, destTp}, new StringBuffer(), null).toString());
+    }
+
+    /**
+     * Builds the opposite {@link LinkId} from the {@link InitRoadmNodesInput}.
+     *
+     * @param input an init link for ROADM nodes
+     * @return opposite {@link LinkId}
+     */
+    public static LinkId getRdm2RdmOppositeLinkId(InitRoadmNodesInput input) {
+        String srcNode = new StringBuilder(input.getRdmANode()).append("-DEG").append(input.getDegANum()).toString();
+        String srcTp = input.getTerminationPointA();
+        String destNode = new StringBuilder(input.getRdmZNode()).append("-DEG").append(input.getDegZNum()).toString();
+        String destTp = input.getTerminationPointZ();
+
+        Object[] params = buildParams(srcNode, srcTp, destNode, destTp, false);
+
+        return new LinkId(LINK_ID_FORMAT.format(params, new StringBuffer(), null).toString());
+    }
+
+    /**
+     * Builds the opposite {@link LinkId} from string descriptors.
+     *
+     * @param srcNode a source node
+     * @param srcTp a source termination point
+     * @param destNode a destination node
+     * @param destTp a destination termination point
+     * @return LinkId a link identifier
+     */
+    public static LinkId getOppositeLinkId(String srcNode, String srcTp, String destNode, String destTp) {
+        return getOppositeLinkId(srcNode, srcTp, destNode, destTp, true);
+    }
+
+    /**
+     * Builds the opposite {@link LinkId} from string descriptors.
+     *
+     * @param srcNode a source node
+     * @param srcTp a source termination point
+     * @param destNode a destination node
+     * @param destTp a destination termination point
+     * @return LinkId a link identifier
+     */
+    public static LinkId getOppositeLinkId(String srcNode, String srcTp, String destNode, String destTp,
+        boolean checkNode) {
+        Object[] params = buildParams(srcNode, srcTp, destNode, destTp, checkNode);
+        return new LinkId(LINK_ID_FORMAT.format(params, new StringBuffer(), null).toString());
+    }
+
+    private static Object[] buildParams(String srcNode, String srcTp, String destNode, String destTp,
+            boolean checkForNetwork) {
+        Object[] params = null;
+        if (checkBidirectional(checkForNetwork, srcTp)) {
+            if (checkBidirectional(checkForNetwork, destTp)) {
+                params = new Object[] {destNode, destTp, srcNode, srcTp};
+            } else if (destTp.contains(RECEIVE)) {
+                params = new Object[] {destNode, destTp.replace("RX", "TX"), srcNode, srcTp};
+            } else {
+                throw new IllegalArgumentException("Dest Termination Point is either RX/TX_RX ! Check TP");
+            }
+        } else if (srcTp.contains(TRANSMIT)) {
+            String replacedSrcTp = srcTp.replace("TX", "RX");
+            if (checkBidirectional(checkForNetwork, destTp)) {
+                params = new Object[] {destNode, destTp, srcNode, replacedSrcTp};
+            } else if (destTp.contains(RECEIVE)) {
+                params = new Object[] {destNode, destTp.replace("RX", "TX"), srcNode, replacedSrcTp};
+            } else {
+                throw new IllegalArgumentException("Dest Termination Point is either RX/TX_RX ! Check TP");
+            }
+        } else {
+            throw new IllegalArgumentException("SRC Termination Point is either TX/TXRX ! Check TP");
+        }
+        return params;
+    }
+
+    private static boolean checkBidirectional(boolean check, String tp) {
+        return tp.contains(BIDIRECTIONAL) || (check && tp.contains(NETWORK));
+    }
+}