\r
import org.opendaylight.yangtools.concepts.Builder;\r
import org.opendaylight.yangtools.concepts.Immutable;\r
+import org.opendaylight.yangtools.concepts.Path;\r
\r
/**\r
* Uniquely identifies data location in the overall of data tree \r
* \r
* \r
*/\r
-public final class InstanceIdentifier implements Immutable {\r
+public final class InstanceIdentifier<T extends DataObject> implements Path<InstanceIdentifier<?>>,Immutable {\r
\r
private final List<PathArgument> path;\r
- private final Class<? extends DataObject> targetType;\r
-\r
- public InstanceIdentifier(Class<? extends DataObject> type) {\r
+ private final Class<T> targetType;\r
+ \r
+ public InstanceIdentifier(Class<T> type) {\r
path = Collections.<PathArgument> singletonList(new Item<>(type));\r
this.targetType = type;\r
}\r
\r
- public InstanceIdentifier(List<PathArgument> path, Class<? extends DataObject> type) {\r
+ public InstanceIdentifier(List<PathArgument> path, Class<T> type) {\r
this.path = Collections.<PathArgument> unmodifiableList(new ArrayList<>(path));\r
this.targetType = type;\r
}\r
return this.path;\r
}\r
\r
- public Class<?> getTargetType() {\r
+ public Class<T> getTargetType() {\r
return this.targetType;\r
}\r
\r
return false;\r
return true;\r
}\r
+ \r
+ @Override\r
+ public String toString() {\r
+ return type.getName();\r
+ }\r
}\r
\r
public static final class IdentifiableItem<I extends Identifiable<T> & DataObject, T extends Identifier<I>> implements\r
}\r
}\r
\r
- public interface InstanceIdentifierBuilder extends Builder<InstanceIdentifier> {\r
+ public interface InstanceIdentifierBuilder<T extends DataObject> extends Builder<InstanceIdentifier<T>> {\r
+\r
+ <N extends DataObject> InstanceIdentifierBuilder<N> node(Class<N> container);\r
\r
- <T extends DataObject> InstanceIdentifierBuilder node(Class<T> container);\r
+ <N extends Identifiable<K> & DataObject, K extends Identifier<N>> InstanceIdentifierBuilder<N> node(\r
+ Class<N> listItem, K listKey);\r
\r
- <I extends Identifiable<T> & DataObject, T extends Identifier<I>> InstanceIdentifierBuilder node(\r
- Class<I> listItem, T listKey);\r
+ <N extends ChildOf<? super T>> InstanceIdentifierBuilder<N> child(Class<N> container);\r
+ \r
+ <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>> InstanceIdentifierBuilder<N> child(\r
+ Class<N> listItem, K listKey);\r
\r
}\r
\r
- public static InstanceIdentifierBuilder builder() {\r
+ @SuppressWarnings("rawtypes")\r
+ public static InstanceIdentifierBuilder<?> builder() {\r
return new BuilderImpl();\r
}\r
\r
- public static InstanceIdentifierBuilder builder(InstanceIdentifier basePath) {\r
- return new BuilderImpl(basePath.path);\r
+ @SuppressWarnings({ "rawtypes", "unchecked" })\r
+ public static InstanceIdentifierBuilder<?> builder(InstanceIdentifier<?> basePath) {\r
+ return new BuilderImpl(basePath.path,basePath.targetType);\r
}\r
\r
- private static final class BuilderImpl implements InstanceIdentifierBuilder {\r
+ private static final class BuilderImpl<T extends DataObject> implements InstanceIdentifierBuilder<T> {\r
\r
private List<PathArgument> path;\r
private Class<? extends DataObject> target = null;\r
}\r
\r
\r
- public BuilderImpl(List<? extends PathArgument> prefix) {\r
+ public BuilderImpl(List<? extends PathArgument> prefix,Class<? extends DataObject> target) {\r
this.path = new ArrayList<>(prefix);\r
+ this.target = target;\r
}\r
\r
+ @SuppressWarnings({ "unchecked", "rawtypes" })\r
@Override\r
- public InstanceIdentifier toInstance() {\r
+ public InstanceIdentifier<T> toInstance() {\r
List<PathArgument> immutablePath = Collections.unmodifiableList(new ArrayList<PathArgument>(path));\r
return new InstanceIdentifier(immutablePath, target);\r
}\r
\r
@Override\r
- public <T extends DataObject> InstanceIdentifierBuilder node(Class<T> container) {\r
+ @SuppressWarnings("unchecked")\r
+ public <N extends DataObject> InstanceIdentifierBuilder<N> node(Class<N> container) {\r
target = container;\r
- path.add(new Item<T>(container));\r
- return this;\r
+ path.add(new Item<N>(container));\r
+ return (InstanceIdentifierBuilder<N>) this;\r
}\r
\r
@Override\r
- public <I extends Identifiable<T> & DataObject, T extends Identifier<I>> InstanceIdentifierBuilder node(\r
- Class<I> listItem, T listKey) {\r
+ @SuppressWarnings("unchecked")\r
+ public <N extends DataObject & Identifiable<K> , K extends Identifier<N>> InstanceIdentifierBuilder<N> node(\r
+ Class<N> listItem, K listKey) {\r
target = listItem;\r
- path.add(new IdentifiableItem<I, T>(listItem, listKey));\r
- return this;\r
+ path.add(new IdentifiableItem<N, K>(listItem, listKey));\r
+ return (InstanceIdentifierBuilder<N>) this;\r
+ }\r
+ \r
+ @Override\r
+ public <N extends ChildOf<? super T>> InstanceIdentifierBuilder<N> child(Class<N> container) {\r
+ return node(container);\r
+ }\r
+ \r
+ @Override\r
+ public <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>> InstanceIdentifierBuilder<N> child(\r
+ Class<N> listItem, K listKey) {\r
+ return node(listItem,listKey);\r
}\r
}\r
\r
if (getClass() != obj.getClass()) {\r
return false;\r
}\r
- InstanceIdentifier other = (InstanceIdentifier) obj;\r
+ InstanceIdentifier<?> other = (InstanceIdentifier<?>) obj;\r
if (path == null) {\r
if (other.path != null) {\r
return false;\r
}\r
return true;\r
}\r
+\r
+ @Override\r
+ public boolean contains(final InstanceIdentifier<?> other) {\r
+ if(other == null) {\r
+ throw new IllegalArgumentException("other should not be null");\r
+ }\r
+ final int localSize = this.path.size();\r
+ final List<PathArgument> otherPath = other.getPath();\r
+ if(localSize > other.path.size()) {\r
+ return false;\r
+ }\r
+ for(int i = 0;i<localSize;i++ ) {\r
+ if(!path.get(i).equals(otherPath.get(i))) {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ return true;\r
+ }\r
}\r