blob: 46598c0726a326872e41c1976da3f2e6396aa1ea [file] [log] [blame]
Jonathan Hart472062d2014-04-03 10:56:48 -07001package net.onrc.onos.core.topology;
Yuta HIGUCHI54ab8cd2014-02-11 09:43:34 -08002
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07003import net.onrc.onos.core.topology.web.serializers.SwitchDataSerializer;
Sho SHIMIZU83e3c1f2014-06-13 15:57:26 -07004import net.onrc.onos.core.util.Dpid;
5
Yuta HIGUCHIb5107282014-02-14 17:18:24 -08006import java.nio.ByteBuffer;
Sho SHIMIZUf34f1502014-06-13 13:48:00 -07007import java.util.Objects;
Yuta HIGUCHIdac4caa2014-02-11 18:51:35 -08008
Pavlin Radoslavova5637c02014-07-30 15:55:11 -07009import static com.google.common.base.Preconditions.checkNotNull;
Pavlin Radoslavov5cf1fe02014-07-03 22:52:25 -070010import org.codehaus.jackson.map.annotate.JsonSerialize;
11
Yuta HIGUCHI54ab8cd2014-02-11 09:43:34 -080012/**
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070013 * Self-contained Switch object.
Yuta HIGUCHI54ab8cd2014-02-11 09:43:34 -080014 */
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070015@JsonSerialize(using = SwitchDataSerializer.class)
16public class SwitchData extends TopologyElement<SwitchData> {
Pavlin Radoslavov5317ac92014-08-18 12:59:33 -070017 public static final int SWITCHID_BYTES = 2 + 8;
18
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070019 private final Dpid dpid;
Yuta HIGUCHI54ab8cd2014-02-11 09:43:34 -080020
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -080021 /**
Yuta HIGUCHI9cc421b2014-02-24 15:34:44 -080022 * Default constructor for Serializer to use.
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -080023 */
Yuta HIGUCHI9cc421b2014-02-24 15:34:44 -080024 @Deprecated
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070025 protected SwitchData() {
Ray Milkey269ffb92014-04-03 14:43:30 -070026 dpid = null;
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -080027 }
28
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070029 /**
Pavlin Radoslavov5317ac92014-08-18 12:59:33 -070030 * Constructor for given switch DPID.
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070031 *
Pavlin Radoslavov5317ac92014-08-18 12:59:33 -070032 * @param dpid the switch DPID to identify the switch
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070033 */
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070034 public SwitchData(Dpid dpid) {
Pavlin Radoslavova5637c02014-07-30 15:55:11 -070035 this.dpid = checkNotNull(dpid);
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070036 }
37
38 /**
Pavlin Radoslavov5317ac92014-08-18 12:59:33 -070039 * Copy constructor.
40 * <p>
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070041 * Creates an unfrozen copy of the given SwitchData object.
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070042 *
Pavlin Radoslavov5317ac92014-08-18 12:59:33 -070043 * @param original the object to make copy of
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070044 */
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070045 public SwitchData(SwitchData original) {
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070046 super(original);
47 this.dpid = original.dpid;
48 }
49
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070050 /**
51 * Gets the DPID identifying this switch.
52 *
Pavlin Radoslavov5317ac92014-08-18 12:59:33 -070053 * @return the DPID identifying this switch
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070054 */
Yuta HIGUCHI8f3dfa32014-06-25 00:14:25 -070055 public Dpid getDpid() {
56 return dpid;
Yuta HIGUCHI54ab8cd2014-02-11 09:43:34 -080057 }
58
Pavlin Radoslavov5317ac92014-08-18 12:59:33 -070059 /**
60 * Computes the switch ID for a given switch DPID.
61 *
62 * @param dpid the switch DPID to use
63 * @return the switch ID as a ByteBuffer
64 */
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070065 public static ByteBuffer getSwitchID(Dpid dpid) {
66 return getSwitchID(dpid.value());
67 }
68
Pavlin Radoslavov5317ac92014-08-18 12:59:33 -070069 /**
70 * Computes the switch ID for a given switch DPID.
71 * <p>
72 * TODO: This method should be removed and replaced with the corresponding
73 * getSwitchID(Dpid) method.
74 *
75 * @param dpid the switch DPID to use
76 * @return the switch ID as a ByteBuffer
77 */
Yuta HIGUCHIa341b112014-02-23 15:42:00 -080078 public static ByteBuffer getSwitchID(Long dpid) {
Ray Milkey269ffb92014-04-03 14:43:30 -070079 if (dpid == null) {
80 throw new IllegalArgumentException("dpid cannot be null");
81 }
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070082 return (ByteBuffer) ByteBuffer.allocate(SwitchData.SWITCHID_BYTES)
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070083 .putChar('S').putLong(dpid).flip();
Yuta HIGUCHIb5107282014-02-14 17:18:24 -080084 }
85
Pavlin Radoslavov31f85102014-08-15 13:55:44 -070086 @Override
87 public Dpid getOriginDpid() {
88 return this.dpid;
Yuta HIGUCHIa341b112014-02-23 15:42:00 -080089 }
90
Pavlin Radoslavov31f85102014-08-15 13:55:44 -070091 @Override
Yuta HIGUCHIa341b112014-02-23 15:42:00 -080092 public ByteBuffer getIDasByteBuffer() {
Sho SHIMIZU83e3c1f2014-06-13 15:57:26 -070093 return getSwitchID(dpid.value());
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -080094 }
Pavlin Radoslavov31f85102014-08-15 13:55:44 -070095
96 @Override
97 public int hashCode() {
98 return 31 * super.hashCode() + Objects.hashCode(dpid);
99 }
100
101 @Override
102 public boolean equals(Object o) {
103 if (this == o) {
104 return true;
105 }
106
107 if (o == null || getClass() != o.getClass()) {
108 return false;
109 }
110
111 // Compare attributes
112 if (!super.equals(o)) {
113 return false;
114 }
115
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700116 SwitchData other = (SwitchData) o;
Pavlin Radoslavov31f85102014-08-15 13:55:44 -0700117 return Objects.equals(this.dpid, other.dpid);
118 }
119
120 @Override
121 public String toString() {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700122 return "[SwitchData " + dpid + "]";
Pavlin Radoslavov31f85102014-08-15 13:55:44 -0700123 }
Yuta HIGUCHI54ab8cd2014-02-11 09:43:34 -0800124}