Add a method to get resource type name: simpleTypeName()

last() is removed as the new method takes over its role

Change-Id: Id3737529787da5d5bb513355cdbc443f2b7b17e2
diff --git a/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java b/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
index 49a56c5..a5f6730 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
@@ -115,7 +115,7 @@
             print("ROOT");
         } else {
             if (resource instanceof ContinuousResource) {
-                String s = ((String) resource.last());
+                String s = resource.simpleTypeName();
                 String simpleName = s.substring(s.lastIndexOf('.') + 1);
                 print("%s%s: %f", Strings.repeat(" ", level),
                                   simpleName,
@@ -126,7 +126,7 @@
                 // Continuous resource is terminal node, stop here
                 return;
             } else {
-                String resourceName = resource.last().getClass().getSimpleName();
+                String resourceName = resource.simpleTypeName();
 
                 String toString = String.valueOf(resource.valueAs(Object.class).orElse(""));
                 if (toString.startsWith(resourceName)) {
@@ -161,7 +161,7 @@
                 nonAggregatable.add(r);
             } else if (Iterables.any(aggregatableTypes, r::isTypeOf)) {
                 // aggregatable & terminal node
-                String className = r.last().getClass().getSimpleName();
+                String className = r.simpleTypeName();
                 aggregatables.put(className, r);
             } else {
                 nonAggregatable.add(r);
@@ -216,8 +216,7 @@
 
         String resourceName;
         if (resource instanceof ContinuousResource) {
-            String s = (String) resource.last();
-            resourceName = s.substring(s.lastIndexOf('.') + 1);
+            resourceName = resource.simpleTypeName();
         } else if (resource instanceof DiscreteResource) {
             // TODO This distributed store access incurs overhead.
             //      This should be merged with the one in printResource()
@@ -225,7 +224,7 @@
                 // resource which has children should be printed
                 return true;
             }
-            resourceName = resource.last().getClass().getSimpleName();
+            resourceName = resource.simpleTypeName();
         } else {
             log.warn("Unexpected resource class: {}", resource.getClass().getSimpleName());
             return false;
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
index 00221ae..33e25c5 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
@@ -49,6 +49,11 @@
     }
 
     @Override
+    public String simpleTypeName() {
+        return id.simpleTypeName();
+    }
+
+    @Override
     public boolean isTypeOf(Class<?> type) {
         checkNotNull(type);
 
@@ -98,14 +103,6 @@
     }
 
     @Override
-    public Object last() {
-        if (id.components().isEmpty()) {
-            return null;
-        }
-        return id.components().get(id.components().size() - 1);
-    }
-
-    @Override
     public DiscreteResource child(Object child) {
         throw new UnsupportedOperationException();
     }
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResourceId.java
index 4c8f466..8a042c8 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResourceId.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResourceId.java
@@ -47,6 +47,11 @@
         return components;
     }
 
+    @Override
+    String simpleTypeName() {
+        return name;
+    }
+
     /**
      * {@inheritDoc}
      *
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
index beb564a..cc3b30a 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
@@ -46,6 +46,11 @@
     }
 
     @Override
+    public String simpleTypeName() {
+        return id.simpleTypeName();
+    }
+
+    @Override
     public boolean isTypeOf(Class<?> type) {
         checkNotNull(type);
 
@@ -80,14 +85,6 @@
         return Optional.of(value);
     }
 
-    @Override
-    public Object last() {
-        if (id.components().isEmpty()) {
-            return null;
-        }
-        return id.components().get(id.components().size() - 1);
-    }
-
     private boolean isRoot() {
         return id.equals(ResourceId.ROOT);
     }
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
index 0e38f5e..70e0119 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
@@ -45,6 +45,15 @@
     }
 
     @Override
+    String simpleTypeName() {
+        if (components.isEmpty()) {
+            return "Root";
+        }
+
+        return components.get(components.size() - 1).getClass().getSimpleName();
+    }
+
+    @Override
     public DiscreteResourceId child(Object child) {
         checkArgument(!(child instanceof Class<?>));
 
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/Resource.java b/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
index 5572592..1548717 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
@@ -48,6 +48,17 @@
     ResourceId id();
 
     /**
+     * Returns the simple type name of this resource.
+     *
+     * Example:<br>
+     * Resource: DeviceId:1/PortNumber:1/VlanId:200<br>
+     * Simple type name: VlanId<br>
+     *
+     * @return the simple type name of this resource
+     */
+    String simpleTypeName();
+
+    /**
      * Checks if the type of this instance is the specified type.
      *
      * @param type type of resource to be checked
@@ -75,14 +86,6 @@
     <T> Optional<T> valueAs(Class<T> type);
 
     /**
-     * Returns the last component of this instance.
-     *
-     * @return the last component of this instance.
-     * The return value is equal to the last object of {@code components()}.
-     */
-    Object last();
-
-    /**
      * Returns the parent resource of this instance.
      * E.g. if this resource is Link:1/VLAN ID:100, the return value is the resource for Link:1.
      *
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
index 8fcccb7..002dc87 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
@@ -29,6 +29,8 @@
 
     abstract ImmutableList<Object> components();
 
+    abstract String simpleTypeName();
+
     /**
      * Returns the parent resource ID of this instance.
      *
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ContinuousResourceIdTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ContinuousResourceIdTest.java
index cf6e0e8..1e79f81 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ContinuousResourceIdTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ContinuousResourceIdTest.java
@@ -21,6 +21,9 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
 /**
  * Unit test for ContinuousResourceId.
  */
@@ -42,4 +45,11 @@
         new EqualsTester()
                 .addEqualityGroup(id1, sameAsId1);
     }
+
+    @Test
+    public void testSimpleTypeName() {
+        ContinuousResourceId id1 = Resources.continuous(D1, P1, Bandwidth.class).resource(BW1.bps()).id();
+
+        assertThat(id1.simpleTypeName(), is("Bandwidth"));
+    }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/DiscreteResourceIdTest.java b/core/api/src/test/java/org/onosproject/net/newresource/DiscreteResourceIdTest.java
index 6178150..aeb950d 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/DiscreteResourceIdTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/DiscreteResourceIdTest.java
@@ -21,6 +21,9 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
 /**
  * Unit test for DiscreteResourceId.
  */
@@ -41,4 +44,15 @@
                 .addEqualityGroup(id1, sameAsId1)
                 .addEqualityGroup(id2);
     }
+
+    @Test
+    public void testSimpleTypeName() {
+        DiscreteResourceId id = Resources.discrete(D1, P1, VLAN1).id();
+        assertThat(id.simpleTypeName(), is("VlanId"));
+    }
+
+    @Test
+    public void testSimpleTypeNameOfRoot() {
+        assertThat(ResourceId.ROOT.simpleTypeName(), is("Root"));
+    }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/DiscreteResourceTest.java b/core/api/src/test/java/org/onosproject/net/newresource/DiscreteResourceTest.java
index 7333ef7..0001c70 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/DiscreteResourceTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/DiscreteResourceTest.java
@@ -91,14 +91,6 @@
     }
 
     @Test
-    public void testBase() {
-        DiscreteResource resource = Resources.discrete(D1).resource();
-
-        DeviceId child = (DeviceId) resource.last();
-        assertThat(child, is(D1));
-    }
-
-    @Test
     public void testValueAs() {
         DiscreteResource resource = Resources.discrete(D1).resource();