Use concrete types instead of abstract types

- ResourceId -> DiscreteResourceId/ContinuousResourceId
- Resource -> DiscreteResource/ContinuousResource

In addition, stop sharing the implementations in the super classes

Change-Id: I44662f6b7c23a23c30844a5b693e1cabab2cc091
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 93c4472..7638f64 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
@@ -21,11 +21,8 @@
 import org.onosproject.net.PortNumber;
 
 import java.util.Arrays;
-import java.util.Objects;
 
 import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
 
 /**
  * Represents identifier of resource.
@@ -33,18 +30,16 @@
  */
 @Beta
 public abstract class ResourceId {
-    static final ResourceId ROOT = new DiscreteResourceId();
+    static final DiscreteResourceId ROOT = new DiscreteResourceId();
 
-    final ImmutableList<Object> components;
-
-    static ResourceId discrete(DeviceId device, Object... components) {
+    static DiscreteResourceId discrete(DeviceId device, Object... components) {
         return new DiscreteResourceId(ImmutableList.builder()
                 .add(device)
                 .add(components)
                 .build());
     }
 
-    static ResourceId discrete(DeviceId device, PortNumber port, Object... components) {
+    static DiscreteResourceId discrete(DeviceId device, PortNumber port, Object... components) {
         return new DiscreteResourceId(ImmutableList.builder()
                 .add(device)
                 .add(port)
@@ -52,92 +47,41 @@
                 .build());
     }
 
-    static ResourceId continuous(DeviceId device, Object... components) {
+    static ContinuousResourceId continuous(DeviceId device, Object... components) {
         Object last = components[components.length - 1];
         checkArgument(last instanceof Class<?>);
 
-        return continuous(ImmutableList.builder()
+        return new ContinuousResourceId(ImmutableList.builder()
                 .add(device)
                 .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last);
     }
 
-    static ResourceId continuous(DeviceId device, PortNumber port, Object... components) {
+    static ContinuousResourceId continuous(DeviceId device, PortNumber port, Object... components) {
         Object last = components[components.length - 1];
         checkArgument(last instanceof Class<?>);
 
-        return continuous(ImmutableList.builder()
+        return new ContinuousResourceId(ImmutableList.builder()
                 .add(device)
                 .add(port)
                 .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last);
     }
 
-    private static ResourceId continuous(ImmutableList.Builder<Object> parentComponents, Class<?> last) {
-        return new ContinuousResourceId(parentComponents
-                .add(last.getCanonicalName())
-                .build(), last.getSimpleName());
-    }
-
-    protected ResourceId(ImmutableList<Object> components) {
-        this.components = checkNotNull(components);
-    }
-
-    // for serializer
-    protected ResourceId() {
-        this.components = ImmutableList.of();
-    }
-
-    // IndexOutOfBoundsException is raised when the instance is equal to ROOT
-    ResourceId parent() {
-        if (components.size() == 1) {
-            return ROOT;
-        } else {
-            return new DiscreteResourceId(components.subList(0, components.size() - 1));
-        }
-    }
+    abstract DiscreteResourceId parent();
 
     /**
      * Returns a resource ID of a child of this resource based on the specified object.
-     * If the argument is an instance of {@link Class}, this method returns an instance of
-     * {@link ContinuousResourceId}. Otherwise, it returns an instance of {@link DiscreteResourceId}
-     * This method only work when the receiver is {@link DiscreteResourceId}. Otherwise,
-     * this method throws an exception.
+     * If the given object is a {@link Class} instance, {@link IllegalArgumentException} is thrown.
      *
      * @param child the last component of the child
      * @return a child resource ID
      */
-    public ResourceId child(Object child) {
-        checkState(this instanceof DiscreteResourceId);
+    public abstract DiscreteResourceId child(Object child);
 
-        if (child instanceof Class<?>) {
-            return continuous(ImmutableList.builder().addAll(components), (Class<?>) child);
-        } else {
-            return new DiscreteResourceId(ImmutableList.builder()
-                    .addAll(components)
-                    .add(child)
-                    .build());
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return components.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final ResourceId other = (ResourceId) obj;
-        return Objects.equals(this.components, other.components);
-    }
-
-    @Override
-    public String toString() {
-        return components.toString();
-    }
-
+    /**
+     * Returns a resource ID of a child of this resource based on the specified object.
+     *
+     * @param child the last component of the child
+     * @return a child resource ID
+     */
+    public abstract ContinuousResourceId child(Class<?> child);
 }