Add "type" attributes to Topology elements

Add type attributes to Topology elements (ONOS-1575, ONOS-1391)
- add "type" as String attributes
- add "type" to JSON representation

Change-Id: I0ab790cfd18eba17e352780b336e5cd49c6fcb1e
diff --git a/src/main/java/net/onrc/onos/core/topology/DeviceImpl.java b/src/main/java/net/onrc/onos/core/topology/DeviceImpl.java
index 61de0d2..f331b49 100644
--- a/src/main/java/net/onrc/onos/core/topology/DeviceImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/DeviceImpl.java
@@ -132,6 +132,7 @@
      */
     @Override
     public String getType() {
-        throw new UnsupportedOperationException("Not implemented yet");
+        // FIXME assuming device is always in packet layer for now.
+        return TopologyElement.TYPE_PACKET;
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/LinkImpl.java b/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
index aa635ef..26c260a 100644
--- a/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
@@ -167,6 +167,6 @@
      */
     @Override
     public String getType() {
-        throw new UnsupportedOperationException("Not implemented yet");
+        return getStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET);
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/PortImpl.java b/src/main/java/net/onrc/onos/core/topology/PortImpl.java
index 8a5e783..52dbe47 100644
--- a/src/main/java/net/onrc/onos/core/topology/PortImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/PortImpl.java
@@ -205,6 +205,6 @@
      */
     @Override
     public String getType() {
-        throw new UnsupportedOperationException("Not implemented yet");
+        return getStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET);
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java b/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
index b00409e..f434e33 100644
--- a/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
@@ -199,6 +199,6 @@
      */
     @Override
     public String getType() {
-        throw new UnsupportedOperationException("Not implemented yet");
+        return getStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET);
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyElement.java b/src/main/java/net/onrc/onos/core/topology/TopologyElement.java
index ceaf0fc..fc94c0a 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyElement.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyElement.java
@@ -18,7 +18,22 @@
  *      (Required to define a method returning itself's type)
  */
 public class TopologyElement<T extends TopologyElement<T>>
-        implements StringAttributes, UpdateStringAttributes {
+        implements ITopologyElement, StringAttributes, UpdateStringAttributes {
+
+    // TODO: Where should the attribute names be defined?
+    /**
+     * Attribute name for type.
+     */
+    public static final String TYPE = "type";
+    /**
+     * Attribute "type" value representing that the object belongs to Packet layer.
+     */
+    public static final String TYPE_PACKET = "packet";
+    /**
+     * Attribute "type" value representing that the object belongs to Optical layer.
+     */
+    public static final String TYPE_OPTICAL = "optical";
+
 
     private boolean isFrozen = false;
 
@@ -151,4 +166,9 @@
 
         this.stringAttributes.remove(attr);
     }
+
+    @Override
+    public String getType() {
+        return getStringAttribute(TYPE, TYPE_PACKET);
+    }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyObject.java b/src/main/java/net/onrc/onos/core/topology/TopologyObject.java
index ccb266c..f929926 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyObject.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyObject.java
@@ -9,6 +9,7 @@
  */
 public abstract class TopologyObject implements ITopologyElement {
 
+    // XXX This will be a snapshot, thus should be replaceable
     /**
      * Topology instance this object belongs to.
      */
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
index 1d5b8a6..b82c86f 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
@@ -141,6 +141,9 @@
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
+        linkEvent.createStringAttribute(TopologyElement.TYPE,
+                                        TopologyElement.TYPE_PACKET);
+
         linkEvent.freeze();
 
         if (!registryService.hasControl(link.getDst())) {
@@ -162,6 +165,8 @@
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
+        linkEvent.createStringAttribute(TopologyElement.TYPE,
+                                        TopologyElement.TYPE_PACKET);
         linkEvent.freeze();
 
         if (!registryService.hasControl(link.getDst())) {
@@ -181,6 +186,8 @@
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
+        portEvent.createStringAttribute(TopologyElement.TYPE,
+                                        TopologyElement.TYPE_PACKET);
         portEvent.createStringAttribute("name", port.getName());
 
         portEvent.freeze();
@@ -199,6 +206,15 @@
         final Dpid dpid = new Dpid(switchId);
 
         PortEvent portEvent = new PortEvent(dpid, new PortNumber(port.getPortNumber()));
+        // FIXME should be merging, with existing attrs, etc..
+        // TODO define attr name as constant somewhere.
+        // TODO populate appropriate attributes.
+        portEvent.createStringAttribute(TopologyElement.TYPE,
+                                        TopologyElement.TYPE_PACKET);
+        portEvent.createStringAttribute("name", port.getName());
+
+        portEvent.freeze();
+
         if (registryService.hasControl(switchId)) {
             topologyDiscoveryInterface.removePortDiscoveryEvent(portEvent);
         } else {
@@ -214,6 +230,8 @@
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
+        switchEvent.createStringAttribute(TopologyElement.TYPE,
+                                          TopologyElement.TYPE_PACKET);
         switchEvent.createStringAttribute("ConnectedSince",
                 sw.getConnectedSince().toString());
 
@@ -233,6 +251,8 @@
             // TODO define attr name as constant somewhere.
             // TODO populate appropriate attributes.
             portEvent.createStringAttribute("name", port.getName());
+            portEvent.createStringAttribute(TopologyElement.TYPE,
+                                            TopologyElement.TYPE_PACKET);
 
             portEvent.freeze();
             portEvents.add(portEvent);
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/DeviceEventSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/DeviceEventSerializer.java
index 94ccce2..4ced3c3 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/DeviceEventSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/DeviceEventSerializer.java
@@ -3,6 +3,7 @@
 import java.io.IOException;
 
 import net.onrc.onos.core.topology.DeviceEvent;
+import net.onrc.onos.core.topology.TopologyElement;
 import net.onrc.onos.core.util.SwitchPort;
 
 import org.codehaus.jackson.JsonGenerator;
@@ -26,6 +27,7 @@
         //
 
         jsonGenerator.writeStartObject();
+        jsonGenerator.writeStringField(TopologyElement.TYPE, deviceEvent.getType());
         jsonGenerator.writeStringField("mac", deviceEvent.getMac().toString());
         jsonGenerator.writeFieldName("attachmentPoints");
         jsonGenerator.writeStartArray();
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/DeviceSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/DeviceSerializer.java
index 1f8676a..1445787 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/DeviceSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/DeviceSerializer.java
@@ -4,6 +4,7 @@
 
 import net.onrc.onos.core.topology.Device;
 import net.onrc.onos.core.topology.Port;
+import net.onrc.onos.core.topology.TopologyElement;
 
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.map.SerializerProvider;
@@ -26,6 +27,7 @@
         //
 
         jsonGenerator.writeStartObject();
+        jsonGenerator.writeStringField(TopologyElement.TYPE, dev.getType());
         jsonGenerator.writeStringField("mac", dev.getMacAddress().toString());
         jsonGenerator.writeFieldName("attachmentPoints");
         jsonGenerator.writeStartArray();
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkEventSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkEventSerializer.java
index 0678d49..47985b0 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkEventSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkEventSerializer.java
@@ -1,6 +1,8 @@
 package net.onrc.onos.core.topology.web.serializers;
 
 import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.TopologyElement;
+
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.map.SerializerProvider;
 import org.codehaus.jackson.map.ser.std.SerializerBase;
@@ -40,6 +42,7 @@
         //
 
         jsonGenerator.writeStartObject();
+        jsonGenerator.writeStringField(TopologyElement.TYPE, linkEvent.getType());
         jsonGenerator.writeObjectField("src", linkEvent.getSrc());
         jsonGenerator.writeObjectField("dst", linkEvent.getDst());
         jsonGenerator.writeEndObject();
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkSerializer.java
index 44f5cc3..7b06a21 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkSerializer.java
@@ -4,6 +4,7 @@
 import java.util.Map.Entry;
 
 import net.onrc.onos.core.topology.Link;
+import net.onrc.onos.core.topology.TopologyElement;
 
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.map.SerializerProvider;
@@ -26,6 +27,7 @@
         // In the future, we will use a single serializer.
         //
         jsonGenerator.writeStartObject();
+        jsonGenerator.writeStringField(TopologyElement.TYPE, link.getType());
         jsonGenerator.writeObjectField("src", link.getSrcPort().asSwitchPort());
         jsonGenerator.writeObjectField("dst", link.getDstPort().asSwitchPort());
         jsonGenerator.writeObjectFieldStart("stringAttributes");
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/PortEventSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/PortEventSerializer.java
index 84f23ac..4f2d5bf 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/PortEventSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/PortEventSerializer.java
@@ -3,6 +3,7 @@
 import java.io.IOException;
 
 import net.onrc.onos.core.topology.PortEvent;
+import net.onrc.onos.core.topology.TopologyElement;
 
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.map.SerializerProvider;
@@ -25,6 +26,7 @@
         //
 
         jsonGenerator.writeStartObject();
+        jsonGenerator.writeStringField(TopologyElement.TYPE, portEvent.getType());
         jsonGenerator.writeStringField("state", "ACTIVE");
         jsonGenerator.writeStringField("dpid", portEvent.getDpid().toString());
         //
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/PortSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/PortSerializer.java
index 69d710e..34d411f 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/PortSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/PortSerializer.java
@@ -4,6 +4,7 @@
 import java.util.Map.Entry;
 
 import net.onrc.onos.core.topology.Port;
+import net.onrc.onos.core.topology.TopologyElement;
 
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.map.SerializerProvider;
@@ -26,6 +27,7 @@
         //
 
         jsonGenerator.writeStartObject();
+        jsonGenerator.writeStringField(TopologyElement.TYPE, port.getType());
         jsonGenerator.writeStringField("state", "ACTIVE");
         jsonGenerator.writeStringField("dpid", port.getDpid().toString());
         //
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchEventSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchEventSerializer.java
index 09358c4..c4e1826 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchEventSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchEventSerializer.java
@@ -3,6 +3,7 @@
 import java.io.IOException;
 
 import net.onrc.onos.core.topology.SwitchEvent;
+import net.onrc.onos.core.topology.TopologyElement;
 
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.map.SerializerProvider;
@@ -24,6 +25,7 @@
         //
 
         jsonGenerator.writeStartObject();
+        jsonGenerator.writeStringField(TopologyElement.TYPE, switchEvent.getType());
         jsonGenerator.writeStringField("dpid",
                                        switchEvent.getDpid().toString());
         jsonGenerator.writeStringField("state", "ACTIVE");
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchSerializer.java
index 79516b4..8542641 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchSerializer.java
@@ -5,6 +5,7 @@
 
 import net.onrc.onos.core.topology.Port;
 import net.onrc.onos.core.topology.Switch;
+import net.onrc.onos.core.topology.TopologyElement;
 
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.map.SerializerProvider;
@@ -26,6 +27,7 @@
         //
 
         jsonGenerator.writeStartObject();
+        jsonGenerator.writeStringField(TopologyElement.TYPE, sw.getType());
         jsonGenerator.writeStringField("dpid", sw.getDpid().toString());
         jsonGenerator.writeStringField("state", "ACTIVE");
         jsonGenerator.writeArrayFieldStart("ports");