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);
}