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/DiscreteResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
index cf9d334..035561d 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
@@ -18,6 +18,11 @@
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
 
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * ResourceId for {@link DiscreteResource}.
  *
@@ -25,13 +30,65 @@
  * implementation only. It is not for resource API user.
  */
 @Beta
-// TODO: consider how to restrict the visibility
 public final class DiscreteResourceId extends ResourceId {
+    final ImmutableList<Object> components;
+
     DiscreteResourceId(ImmutableList<Object> components) {
-        super(components);
+        this.components = components;
     }
 
     DiscreteResourceId() {
-        super();
+        this.components = ImmutableList.of();
+    }
+
+    @Override
+    public DiscreteResourceId child(Object child) {
+        checkArgument(!(child instanceof Class<?>));
+
+        return new DiscreteResourceId(ImmutableList.builder()
+                .addAll(components)
+                .add(child)
+                .build());
+    }
+
+    @Override
+    public ContinuousResourceId child(Class<?> child) {
+        checkNotNull(child);
+
+        return new ContinuousResourceId(ImmutableList.builder().addAll(components), child);
+    }
+
+    @Override
+    DiscreteResourceId parent() {
+        if (components.size() == 0) {
+            return null;
+        }
+        if (components.size() == 1) {
+            return ROOT;
+        } else {
+            return new DiscreteResourceId(components.subList(0, components.size() - 1));
+        }
+    }
+
+    @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 DiscreteResourceId other = (DiscreteResourceId) obj;
+        return Objects.equals(this.components, other.components);
+    }
+
+    @Override
+    public String toString() {
+        return components.toString();
     }
 }