--- /dev/null
+/*
+ * 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));
+ }
+}