Merge "Introducing the Modification classses"
[controller.git] / opendaylight / sal / api / src / main / java / org / opendaylight / controller / sal / packet / LLDPTLV.java
index a89816ffafe0cf7aa7e8c591475042a48dd00ca7..35244ea697d871617b09db6e232da95af0d51ebf 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
  *
 package org.opendaylight.controller.sal.packet;
 
 import java.io.UnsupportedEncodingException;
-import java.util.HashMap;
-
+import java.nio.charset.Charset;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
+
 import org.apache.commons.lang3.tuple.MutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.opendaylight.controller.sal.utils.HexEncode;
@@ -31,30 +29,29 @@ public class LLDPTLV extends Packet {
     private static final String LENGTH = "Length";
     private static final String VALUE = "Value";
     private static final int LLDPTLVFields = 3;
-       public static final byte[] OFOUI = new byte[] {(byte)0x00, (byte)0x26, (byte)0xe1};     // OpenFlow OUI
-       public static final byte[] customTlvSubType = new byte[] {0};
-       public static final int customTlvOffset = OFOUI.length + customTlvSubType.length;
-       public static final byte chassisIDSubType[] = new byte[] {4};   // MAC address for the system
-       public static final byte portIDSubType[] = new byte[] {7};      // locally assigned
-
-       public enum TLVType {
-               Unknown         ((byte)0),
-               ChassisID       ((byte)1),
-               PortID          ((byte)2),
-               TTL                     ((byte)3),
-               PortDesc        ((byte)4),
-               SystemName      ((byte)5),
-               SystemDesc      ((byte)6),
-               Custom          ((byte)127);
-               
-               private byte value;
-               private TLVType(byte value) {
-                       this.value = value;
-               }
-               public byte getValue() {
-                       return value;
-               }
-       }
+    public static final byte[] OFOUI = new byte[] { (byte) 0x00, (byte) 0x26,
+        (byte) 0xe1 }; // OpenFlow OUI
+    public static final byte[] customTlvSubType = new byte[] { 0 };
+    public static final int customTlvOffset = OFOUI.length
+            + customTlvSubType.length;
+    public static final byte chassisIDSubType[] = new byte[] { 4 }; // MAC address for the system
+    public static final byte portIDSubType[] = new byte[] { 7 }; // locally assigned
+
+    public enum TLVType {
+        Unknown((byte) 0), ChassisID((byte) 1), PortID((byte) 2), TTL((byte) 3), PortDesc(
+                (byte) 4), SystemName((byte) 5), SystemDesc((byte) 6), Custom(
+                        (byte) 127);
+
+        private byte value;
+
+        private TLVType(byte value) {
+            this.value = value;
+        }
+
+        public byte getValue() {
+            return value;
+        }
+    }
 
     private static Map<String, Pair<Integer, Integer>> fieldCoordinates = new LinkedHashMap<String, Pair<Integer, Integer>>() {
         private static final long serialVersionUID = 1L;
@@ -69,8 +66,8 @@ public class LLDPTLV extends Packet {
     protected Map<String, byte[]> fieldValues;
 
     /**
-     * Default constructor that creates and sets the hash map values
-     * and sets the payload to null
+     * Default constructor that creates and sets the hash map values and sets
+     * the payload to null
      */
     public LLDPTLV() {
         payload = null;
@@ -80,8 +77,7 @@ public class LLDPTLV extends Packet {
     }
 
     /**
-     * Constructor that writes the passed LLDPTLV values to the
-     * hdrFieldsMap
+     * Constructor that writes the passed LLDPTLV values to the hdrFieldsMap
      */
     public LLDPTLV(LLDPTLV other) {
         for (Map.Entry<String, byte[]> entry : other.hdrFieldsMap.entrySet()) {
@@ -146,75 +142,123 @@ public class LLDPTLV extends Packet {
 
     @Override
     public int hashCode() {
-        return HashCodeBuilder.reflectionHashCode(this);
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result
+                + ((fieldValues == null) ? 0 : fieldValues.hashCode());
+        return result;
     }
 
     @Override
     public boolean equals(Object obj) {
-        return EqualsBuilder.reflectionEquals(this, obj);
+        if (this == obj) {
+            return true;
+        }
+        if (!super.equals(obj)) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        LLDPTLV other = (LLDPTLV) obj;
+        if (fieldValues == null) {
+            if (other.fieldValues != null) {
+                return false;
+            }
+        } else if (!fieldValues.equals(other.fieldValues)) {
+            return false;
+        }
+        return true;
     }
 
     @Override
-    public int getfieldnumBits(String fieldName) throws Exception {
+    public int getfieldnumBits(String fieldName) {
         if (fieldName.equals(VALUE)) {
-            return (NetUtils.NumBitsInAByte * (int) BitBufferHelper.getShort(
+            return (NetUtils.NumBitsInAByte * BitBufferHelper.getShort(
                     fieldValues.get(LENGTH), fieldCoordinates.get(LENGTH)
-                            .getRight().intValue()));
+                    .getRight().intValue()));
         }
         return fieldCoordinates.get(fieldName).getRight();
     }
 
     /**
      * Returns the size in bits of the whole TLV
+     *
      * @return int - size in bits of full TLV
-     * @throws Exception
      */
-    public int getTLVSize() throws Exception {
+    public int getTLVSize() {
         return (LLDPTLV.fieldCoordinates.get(TYPE).getRight() + // static
                 LLDPTLV.fieldCoordinates.get(LENGTH).getRight() + // static
-        getfieldnumBits(VALUE)); // variable
+                getfieldnumBits(VALUE)); // variable
+    }
+
+    /**
+     * Creates the SystemName TLV value
+     *
+     * @param nodeId
+     *            node identifier string
+     * @return the SystemName TLV value in byte array
+     */
+    static public byte[] createSystemNameTLVValue(String nodeId) {
+        byte[] nid = nodeId.getBytes();
+        return nid;
     }
-    
+
     /**
-     * Creates the ChassisID TLV value including the subtype and ChassisID string
-     * 
-     * @param nodeId node identifier string
+     * Creates the ChassisID TLV value including the subtype and ChassisID
+     * string
+     *
+     * @param nodeId
+     *            node identifier string
      * @return the ChassisID TLV value in byte array
      */
     static public byte[] createChassisIDTLVValue(String nodeId) {
-        byte[] cid = HexEncode.bytesFromHexString(nodeId);
+        byte[] nid = HexEncode.bytesFromHexString(nodeId);
+        byte[] cid = new byte[6];
+        int srcPos = 0, dstPos = 0;
+
+        if (nid.length > cid.length) {
+            srcPos = nid.length - cid.length;
+        } else {
+            dstPos = cid.length - nid.length;
+        }
+        System.arraycopy(nid, srcPos, cid, dstPos, cid.length);
+
         byte[] cidValue = new byte[cid.length + chassisIDSubType.length];
 
-        System.arraycopy(chassisIDSubType, 0, cidValue, 0, chassisIDSubType.length);
+        System.arraycopy(chassisIDSubType, 0, cidValue, 0,
+                chassisIDSubType.length);
         System.arraycopy(cid, 0, cidValue, chassisIDSubType.length, cid.length);
 
-       return cidValue;
+        return cidValue;
     }
 
     /**
      * Creates the PortID TLV value including the subtype and PortID string
-     * 
-     * @param portId port identifier string
+     *
+     * @param portId
+     *            port identifier string
      * @return the PortID TLV value in byte array
      */
     static public byte[] createPortIDTLVValue(String portId) {
-        byte[] pid = portId.getBytes();
+        byte[] pid = portId.getBytes(Charset.defaultCharset());
         byte[] pidValue = new byte[pid.length + portIDSubType.length];
 
         System.arraycopy(portIDSubType, 0, pidValue, 0, portIDSubType.length);
         System.arraycopy(pid, 0, pidValue, portIDSubType.length, pid.length);
 
-       return pidValue;
+        return pidValue;
     }
 
     /**
      * Creates the custom TLV value including OUI, subtype and custom string
-     * 
-     * @param portId port identifier string
+     *
+     * @param portId
+     *            port identifier string
      * @return the custom TLV value in byte array
      */
     static public byte[] createCustomTLVValue(String customString) {
-        byte[] customArray = customString.getBytes();
+        byte[] customArray = customString.getBytes(Charset.defaultCharset());
         byte[] customValue = new byte[customTlvOffset + customArray.length];
 
         System.arraycopy(OFOUI, 0, customValue, 0, OFOUI.length);
@@ -223,40 +267,56 @@ public class LLDPTLV extends Packet {
         System.arraycopy(customArray, 0, customValue, customTlvOffset,
                 customArray.length);
 
-       return customValue;
+        return customValue;
     }
 
     /**
      * Retrieves the string from TLV value and returns it in HexString format
-     * 
-     * @param tlvValue the TLV value
-     * @param tlvLen the TLV length
+     *
+     * @param tlvValue
+     *            the TLV value
+     * @param tlvLen
+     *            the TLV length
      * @return the HexString
      */
     static public String getHexStringValue(byte[] tlvValue, int tlvLen) {
-       byte[] cidBytes = new byte[tlvLen - chassisIDSubType.length];                
-        System.arraycopy(tlvValue, chassisIDSubType.length, cidBytes, 0, cidBytes.length);
-       return HexEncode.bytesToHexStringWithColumn(cidBytes);
+        byte[] cidBytes = new byte[tlvLen - chassisIDSubType.length];
+        System.arraycopy(tlvValue, chassisIDSubType.length, cidBytes, 0,
+                cidBytes.length);
+        return HexEncode.bytesToHexStringFormat(cidBytes);
     }
 
     /**
      * Retrieves the string from TLV value
-     * 
-     * @param tlvValue the TLV value
-     * @param tlvLen the TLV length
+     *
+     * @param tlvValue
+     *            the TLV value
+     * @param tlvLen
+     *            the TLV length
      * @return the string
      */
     static public String getStringValue(byte[] tlvValue, int tlvLen) {
-       byte[] pidBytes = new byte[tlvLen - portIDSubType.length];
-        System.arraycopy(tlvValue, portIDSubType.length, pidBytes, 0, pidBytes.length);
-       return (new String(pidBytes));
+        byte[] pidSubType = new byte[portIDSubType.length];
+        byte[] pidBytes = new byte[tlvLen - portIDSubType.length];
+        System.arraycopy(tlvValue, 0, pidSubType, 0,
+                pidSubType.length);
+        System.arraycopy(tlvValue, portIDSubType.length, pidBytes, 0,
+                pidBytes.length);
+        if (pidSubType[0] == (byte) 0x3) {
+            return HexEncode.bytesToHexStringFormat(pidBytes);
+        } else {
+            return (new String(pidBytes, Charset.defaultCharset()));
+        }
     }
 
     /**
-     * Retrieves the custom string from the Custom TLV value which includes OUI, subtype and custom string
-     * 
-     * @param customTlvValue the custom TLV value
-     * @param customTlvLen the custom TLV length
+     * Retrieves the custom string from the Custom TLV value which includes OUI,
+     * subtype and custom string
+     *
+     * @param customTlvValue
+     *            the custom TLV value
+     * @param customTlvLen
+     *            the custom TLV length
      * @return the custom string
      */
     static public String getCustomString(byte[] customTlvValue, int customTlvLen) {
@@ -266,14 +326,14 @@ public class LLDPTLV extends Packet {
         if (Arrays.equals(vendor, LLDPTLV.OFOUI)) {
             int customArrayLength = customTlvLen - customTlvOffset;
             byte[] customArray = new byte[customArrayLength];
-            System.arraycopy(customTlvValue, customTlvOffset,
-                    customArray, 0, customArrayLength);
+            System.arraycopy(customTlvValue, customTlvOffset, customArray, 0,
+                    customArrayLength);
             try {
-               customString = new String(customArray, "UTF-8");
+                customString = new String(customArray, "UTF-8");
             } catch (UnsupportedEncodingException e) {
             }
         }
-        
-       return customString;
-    }    
+
+        return customString;
+    }
 }