*/
package org.opendaylight.controller.sal.core;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.Set;
-import java.math.BigInteger;
-
import java.io.Serializable;
-import java.lang.String;
+import java.math.BigInteger;
+import java.util.Set;
import java.util.UUID;
-import java.lang.Long;
-import java.lang.Class;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.opendaylight.controller.sal.utils.HexEncode;
+import java.util.concurrent.ConcurrentHashMap;
-import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.opendaylight.controller.sal.utils.HexEncode;
+import org.opendaylight.controller.sal.utils.INodeFactory;
+import org.opendaylight.controller.sal.utils.ServiceHelper;
/**
* Describe a generic network element in multiple SDNs technologies. A
*
*/
@XmlAccessorType(XmlAccessType.NONE)
+@XmlRootElement
public class Node implements Serializable {
private static final long serialVersionUID = 1L;
* surround.
*/
public static final class NodeIDType {
- private static final ConcurrentHashMap<String, Class> compatibleType =
- new ConcurrentHashMap<String, Class>();
+ private static final ConcurrentHashMap<String, Class<? extends Object>> compatibleType =
+ new ConcurrentHashMap<String, Class<? extends Object>>();
/**
* Identifier for an OpenFlow node
*/
* @return true if registered, false otherwise
*/
public static boolean registerIDType(String type,
- Class compatibleID) {
+ Class<? extends Object> compatibleID) {
if (compatibleType.get(type) != null) {
return false;
} else {
*
* @return The node Type for this Node object
*/
- @XmlAttribute(name = "type")
+ @XmlElement(name = "type")
public String getType() {
return this.nodeType;
}
} else if (typeStr.equals(NodeIDType.PRODUCTION)) {
this.nodeID = IDStr;
} else {
- // We need to lookup via OSGi service registry for an
- // handler for this
+ //Use plugin's method to get appropriate conversion from IDStr to nodeID
+ INodeFactory f = (INodeFactory) ServiceHelper
+ .getGlobalInstance(INodeFactory.class, new Node(), "(protocolName="+typeStr+")");
+ if(f!=null){
+ Node n = f.fromString(typeStr, IDStr);
+ this.nodeID = n.nodeID;
+ }
}
}
- /**
+ /**
* Private setter for nodeType to be called by JAXB not by anyone
* else, Node is immutable
- *
+ *
* @param type of node to be set
*/
+ @SuppressWarnings("unused")
private void setType(String type) {
this.nodeType = type;
if (this.nodeIDString != null) {
*
* @return The nodeID in string format
*/
- @XmlAttribute(name = "id")
+ @XmlElement(name = "id")
public String getNodeIDString() {
if (this.nodeType.equals(NodeIDType.OPENFLOW)) {
return HexEncode.longToHexString((Long) this.nodeID);
return this.nodeID.toString();
}
}
-
- /**
+
+ /**
* private setter to be used by JAXB
- *
+ *
* @param nodeIDString String representation for NodeID
*/
+ @SuppressWarnings("unused")
private void setNodeIDString(String nodeIDString) {
this.nodeIDString = nodeIDString;
if (this.nodeType != null) {
@Override
public int hashCode() {
- return new HashCodeBuilder(163841, 56473)
- .append(nodeType)
- .append(nodeID)
- .hashCode();
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((nodeID == null) ? 0 : nodeID.hashCode());
+ result = prime * result
+ + ((nodeType == null) ? 0 : nodeType.hashCode());
+ return result;
}
@Override
public boolean equals(Object obj) {
- if (obj == null) { return false; }
- if (obj == this) { return true; }
- if (obj.getClass() != getClass()) {
+ if (this == obj)
+ return true;
+ if (obj == null)
return false;
- }
- Node rhs = (Node)obj;
- return new EqualsBuilder()
- .append(this.getType(), rhs.getType())
- .append(this.getID(), rhs.getID())
- .isEquals();
+ if (getClass() != obj.getClass())
+ return false;
+ Node other = (Node) obj;
+ if (nodeID == null) {
+ if (other.nodeID != null)
+ return false;
+ } else if (!nodeID.equals(other.nodeID))
+ return false;
+ if (nodeType == null) {
+ if (other.nodeType != null)
+ return false;
+ } else if (!nodeType.equals(other.nodeType))
+ return false;
+ return true;
}
@Override
public String toString() {
if (this.nodeType.equals(NodeIDType.OPENFLOW)) {
- return this.nodeType.toString() + "|"
+ return this.nodeType + "|"
+ HexEncode.longToHexString((Long) this.nodeID);
} else {
- return this.nodeType.toString() + "|" + this.nodeID.toString();
+ return this.nodeType + "|" + this.nodeID.toString();
}
}
return null;
}
} else {
- // We need to lookup via OSGi service registry for an
- // handler for this
+ //Use INodeFactory to create a Node of registered Node type.
+ //The protocol plugin being used depends on typeStr.
+ INodeFactory f = (INodeFactory) ServiceHelper
+ .getGlobalInstance(INodeFactory.class, new Node(), "(protocolName="+typeStr+")");
+ if(f==null)
+ return null;
+ return f.fromString(typeStr, IDStr);
}
- return null;
}
}