Jonathan Hart | 23701d1 | 2014-04-03 10:45:48 -0700 | [diff] [blame] | 1 | package net.onrc.onos.core.util; |
Pavlin Radoslavov | 5363c2a | 2013-02-18 09:55:42 -0800 | [diff] [blame] | 2 | |
Yuta HIGUCHI | 6d7ee9f | 2014-08-22 09:56:50 -0700 | [diff] [blame] | 3 | import javax.annotation.concurrent.Immutable; |
| 4 | |
Pavlin Radoslavov | ad008e0 | 2013-02-21 18:42:42 -0800 | [diff] [blame] | 5 | import org.codehaus.jackson.annotate.JsonProperty; |
Pavlin Radoslavov | ad008e0 | 2013-02-21 18:42:42 -0800 | [diff] [blame] | 6 | |
Yuta HIGUCHI | 9da3a6e | 2014-06-10 22:11:58 -0700 | [diff] [blame] | 7 | import com.google.common.primitives.UnsignedInts; |
| 8 | |
Pavlin Radoslavov | 5363c2a | 2013-02-18 09:55:42 -0800 | [diff] [blame] | 9 | /** |
Yuta HIGUCHI | fb56450 | 2014-06-16 21:29:00 -0700 | [diff] [blame] | 10 | * Immutable class representing a port number. |
Pavlin Radoslavov | 5363c2a | 2013-02-18 09:55:42 -0800 | [diff] [blame] | 11 | */ |
Yuta HIGUCHI | 6d7ee9f | 2014-08-22 09:56:50 -0700 | [diff] [blame] | 12 | @Immutable |
Yuta HIGUCHI | fb56450 | 2014-06-16 21:29:00 -0700 | [diff] [blame] | 13 | public final class PortNumber { |
Pavlin Radoslavov | 5363c2a | 2013-02-18 09:55:42 -0800 | [diff] [blame] | 14 | |
Yuta HIGUCHI | 9da3a6e | 2014-06-10 22:11:58 -0700 | [diff] [blame] | 15 | private final int value; |
Pavlin Radoslavov | 5363c2a | 2013-02-18 09:55:42 -0800 | [diff] [blame] | 16 | |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 17 | /** |
| 18 | * Default constructor. |
| 19 | */ |
Yuta HIGUCHI | fb56450 | 2014-06-16 21:29:00 -0700 | [diff] [blame] | 20 | protected PortNumber() { |
Ray Milkey | 269ffb9 | 2014-04-03 14:43:30 -0700 | [diff] [blame] | 21 | this.value = 0; |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 22 | } |
Pavlin Radoslavov | f83aa44 | 2013-02-26 14:09:01 -0800 | [diff] [blame] | 23 | |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 24 | /** |
| 25 | * Copy constructor. |
| 26 | * |
| 27 | * @param other the object to copy from. |
| 28 | */ |
Yuta HIGUCHI | fb56450 | 2014-06-16 21:29:00 -0700 | [diff] [blame] | 29 | public PortNumber(PortNumber other) { |
Yuta HIGUCHI | 9da3a6e | 2014-06-10 22:11:58 -0700 | [diff] [blame] | 30 | this.value = other.value; |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 31 | } |
Pavlin Radoslavov | 5363c2a | 2013-02-18 09:55:42 -0800 | [diff] [blame] | 32 | |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 33 | /** |
| 34 | * Constructor from a short integer value. |
| 35 | * |
| 36 | * @param value the value to use. |
| 37 | */ |
Yuta HIGUCHI | a507baf | 2014-08-22 13:42:40 -0700 | [diff] [blame^] | 38 | protected PortNumber(short value) { |
Yuta HIGUCHI | 9da3a6e | 2014-06-10 22:11:58 -0700 | [diff] [blame] | 39 | this.value = (int) shortToUnsignedLong(value); |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 40 | } |
Pavlin Radoslavov | ede9758 | 2013-03-08 18:57:28 -0800 | [diff] [blame] | 41 | |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 42 | /** |
Yuta HIGUCHI | 5865bdb | 2014-07-30 09:32:13 -0700 | [diff] [blame] | 43 | * Creates the unsigned 16 bit port number. |
| 44 | * |
| 45 | * @param number unsigned 16 bit port number. |
| 46 | * @return PortNumber instance |
| 47 | */ |
| 48 | public static PortNumber uint16(final short number) { |
| 49 | return new PortNumber(number); |
| 50 | } |
| 51 | |
| 52 | /** |
| 53 | * Creates the unsigned 32 bit port number. |
| 54 | * |
| 55 | * @param number unsigned 32 bit port number. |
| 56 | * @return PortNumber instance |
| 57 | */ |
| 58 | public static PortNumber uint32(final int number) { |
| 59 | return new PortNumber(number); |
| 60 | } |
| 61 | |
| 62 | /** |
Yuta HIGUCHI | 9da3a6e | 2014-06-10 22:11:58 -0700 | [diff] [blame] | 63 | * Constructor from an int. |
| 64 | * |
| 65 | * @param value the value to use. (Value will not be validated in any way.) |
| 66 | */ |
| 67 | PortNumber(int value) { |
| 68 | this.value = value; |
| 69 | } |
| 70 | |
| 71 | // TODO We may want a factory method version |
| 72 | // which does the range validation of parsed value. |
| 73 | /** |
| 74 | * Constructor from decimal string. |
| 75 | * |
| 76 | * @param decStr decimal string representation of a port number |
| 77 | */ |
| 78 | public PortNumber(String decStr) { |
| 79 | this(decStr, 10); |
| 80 | } |
| 81 | |
| 82 | /** |
| 83 | * Constructor from string. |
| 84 | * |
| 85 | * @param s string representation of a port number |
| 86 | * @param radix the radix to use while parsing {@code s} |
| 87 | */ |
| 88 | public PortNumber(String s, int radix) { |
| 89 | this(UnsignedInts.parseUnsignedInt(s, radix)); |
| 90 | } |
| 91 | |
| 92 | /** |
| 93 | * Convert unsigned short to unsigned long. |
| 94 | * |
| 95 | * @param portno unsigned integer representing port number |
| 96 | * @return port number as unsigned long |
| 97 | */ |
| 98 | public static long shortToUnsignedLong(short portno) { |
| 99 | return UnsignedInts.toLong(0xffff & portno); |
| 100 | } |
| 101 | |
| 102 | /** |
| 103 | * Gets the port number as short. |
| 104 | * <p/> |
| 105 | * Note: User of this method needs to be careful, handling unsigned value. |
| 106 | * @return number as short |
| 107 | */ |
| 108 | public short shortValue() { |
| 109 | return (short) value; |
| 110 | } |
| 111 | |
| 112 | /** |
| 113 | * Gets the value of the port as unsigned integer. |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 114 | * |
| 115 | * @return the value of the port. |
| 116 | */ |
| 117 | @JsonProperty("value") |
Yuta HIGUCHI | 9da3a6e | 2014-06-10 22:11:58 -0700 | [diff] [blame] | 118 | public long value() { |
Yuta HIGUCHI | 5865bdb | 2014-07-30 09:32:13 -0700 | [diff] [blame] | 119 | return 0xffffffffL & value; |
Ray Milkey | 269ffb9 | 2014-04-03 14:43:30 -0700 | [diff] [blame] | 120 | } |
Pavlin Radoslavov | 5363c2a | 2013-02-18 09:55:42 -0800 | [diff] [blame] | 121 | |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 122 | /** |
Yuta HIGUCHI | 9da3a6e | 2014-06-10 22:11:58 -0700 | [diff] [blame] | 123 | * Convert the port value as unsigned integer to a string. |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 124 | * |
| 125 | * @return the port value as a string. |
| 126 | */ |
| 127 | @Override |
| 128 | public String toString() { |
Yuta HIGUCHI | 9da3a6e | 2014-06-10 22:11:58 -0700 | [diff] [blame] | 129 | return UnsignedInts.toString(value); |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 130 | } |
Ray Milkey | 269ffb9 | 2014-04-03 14:43:30 -0700 | [diff] [blame] | 131 | |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 132 | @Override |
| 133 | public boolean equals(Object other) { |
Yuta HIGUCHI | fb56450 | 2014-06-16 21:29:00 -0700 | [diff] [blame] | 134 | if (!(other instanceof PortNumber)) { |
Ray Milkey | 269ffb9 | 2014-04-03 14:43:30 -0700 | [diff] [blame] | 135 | return false; |
| 136 | } |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 137 | |
Yuta HIGUCHI | fb56450 | 2014-06-16 21:29:00 -0700 | [diff] [blame] | 138 | PortNumber otherPort = (PortNumber) other; |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 139 | |
Ray Milkey | 269ffb9 | 2014-04-03 14:43:30 -0700 | [diff] [blame] | 140 | return value == otherPort.value; |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 141 | } |
| 142 | |
| 143 | @Override |
| 144 | public int hashCode() { |
Yuta HIGUCHI | fb56450 | 2014-06-16 21:29:00 -0700 | [diff] [blame] | 145 | return value; |
Jonathan Hart | 3edb175 | 2013-11-14 13:28:17 -0800 | [diff] [blame] | 146 | } |
Pavlin Radoslavov | 5363c2a | 2013-02-18 09:55:42 -0800 | [diff] [blame] | 147 | } |