Refactor AbstractIdentifiable 20/93820/3
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 13 Nov 2020 06:59:47 +0000 (07:59 +0100)
committerRobert Varga <nite@hq.sk>
Fri, 13 Nov 2020 08:07:49 +0000 (08:07 +0000)
There are cases when we specify Identifiable<T>, but really want
to stack that definition to provide a subclass of T as the identifier.

Redefine AbstractIdentifiable to allow that, with the simple case
of exact match being handled by AbstractSimpleIdentifiable.

Change-Id: Ieb88f2185fa9c83749dfec0c5114c2a67868230a
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
16 files changed:
common/concepts/src/main/java/org/opendaylight/yangtools/concepts/AbstractIdentifiable.java
common/concepts/src/main/java/org/opendaylight/yangtools/concepts/AbstractSimpleIdentifiable.java [new file with mode: 0644]
common/util/src/main/java/org/opendaylight/yangtools/util/concurrent/AbstractBatchingExecutor.java
plugin/plugin-generator-api/src/main/java/org/opendaylight/yangtools/plugin/generator/api/AbstractFileGeneratorFactory.java
yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/ImmutableNormalizedMetadata.java
yang/rfc8528-data-util/src/main/java/org/opendaylight/yangtools/rcf8528/data/util/AbstractDynamicMountPointContextFactory.java
yang/rfc8528-data-util/src/main/java/org/opendaylight/yangtools/rcf8528/data/util/AbstractMountPointContextFactory.java
yang/rfc8528-data-util/src/main/java/org/opendaylight/yangtools/rcf8528/data/util/ImmutableMountPointNode.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/InstanceIdToNodes.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedNode.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextNode.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/MountPointData.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/IRSchemaSource.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YangStatementStreamSource.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YinStatementStreamSource.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/NamespaceBehaviour.java

index 2d33dc18d236f43d22d90e45b0283ad1f353f8ca..9dbe50f52d73ac828f72eecce52062eaec81990f 100644 (file)
@@ -17,15 +17,15 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 
 @Beta
 @NonNullByDefault
-public abstract class AbstractIdentifiable<T> implements Identifiable<T> {
-    private final @NonNull T identifier;
+public abstract class AbstractIdentifiable<T, I extends T> implements Identifiable<T> {
+    private final @NonNull I identifier;
 
-    protected AbstractIdentifiable(final T identifier) {
+    protected AbstractIdentifiable(final I identifier) {
         this.identifier = requireNonNull(identifier);
     }
 
     @Override
-    public final T getIdentifier() {
+    public final I getIdentifier() {
         return identifier;
     }
 
diff --git a/common/concepts/src/main/java/org/opendaylight/yangtools/concepts/AbstractSimpleIdentifiable.java b/common/concepts/src/main/java/org/opendaylight/yangtools/concepts/AbstractSimpleIdentifiable.java
new file mode 100644 (file)
index 0000000..0057632
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.concepts;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+
+@Beta
+@NonNullByDefault
+public abstract class AbstractSimpleIdentifiable<T> extends AbstractIdentifiable<T, T> {
+    protected AbstractSimpleIdentifiable(final T identifier) {
+        super(identifier);
+    }
+}
index 7b40ea38be0ee50d8fff51e457d3338c17043513..358bbad5ff3052bc01101e07ff9399f5fffa9512 100644 (file)
@@ -25,7 +25,7 @@ import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Stream;
 import org.checkerframework.checker.lock.qual.GuardedBy;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,7 +45,7 @@ import org.slf4j.LoggerFactory;
  * @param <K> worker key type
  * @param <T> task type
  */
-abstract class AbstractBatchingExecutor<K, T> extends AbstractIdentifiable<String> {
+abstract class AbstractBatchingExecutor<K, T> extends AbstractSimpleIdentifiable<String> {
     private static final Logger LOG = LoggerFactory.getLogger(AbstractBatchingExecutor.class);
 
     /**
index e83ecf7cc39494c79be2f7ff8939d0f7aaa6082a..4f422a06359e6b1d32aa00cc2fef609415648ab9 100644 (file)
@@ -11,7 +11,7 @@ import static com.google.common.base.Preconditions.checkArgument;
 
 import com.google.common.annotations.Beta;
 import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 
 /**
  * Abstract base class for {@link FileGeneratorFactory} implementations. Its constructor enforces no spaces in
@@ -19,7 +19,7 @@ import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
  */
 @Beta
 @NonNullByDefault
-public abstract class AbstractFileGeneratorFactory extends AbstractIdentifiable<String>
+public abstract class AbstractFileGeneratorFactory extends AbstractSimpleIdentifiable<String>
         implements FileGeneratorFactory {
     protected AbstractFileGeneratorFactory(final String identifier) {
         super(identifier);
index 21801e8c56ce3b71689f181ff69b52fd16f5449a..4d5b0491adc29f0a1a41a964fd9f917530948890 100644 (file)
@@ -16,7 +16,7 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
@@ -25,7 +25,8 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgum
  * Immutable implementation of {@link NormalizedMetadata}.
  */
 @Beta
-public class ImmutableNormalizedMetadata extends AbstractIdentifiable<PathArgument> implements NormalizedMetadata {
+public class ImmutableNormalizedMetadata extends AbstractSimpleIdentifiable<PathArgument>
+        implements NormalizedMetadata {
     private static final class Container extends ImmutableNormalizedMetadata {
         private final @NonNull ImmutableMap<PathArgument, NormalizedMetadata> children;
 
index 2eee5690c20cddf13819c95001e75653a8d1dd8f..ed2d3e0e205390fe498b698160938645d2db8ad0 100644 (file)
@@ -13,7 +13,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.opendaylight.yangtools.rfc8528.data.api.MountPointChild;
 import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
 import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory;
@@ -31,7 +31,7 @@ import org.slf4j.LoggerFactory;
  */
 @Beta
 // FIXME: 7.0.0: consider integrating into AbstractMountPointContextFactory
-public abstract class AbstractDynamicMountPointContextFactory extends AbstractIdentifiable<MountPointIdentifier>
+public abstract class AbstractDynamicMountPointContextFactory extends AbstractSimpleIdentifiable<MountPointIdentifier>
         implements MountPointContextFactory {
     private static final Logger LOG = LoggerFactory.getLogger(AbstractDynamicMountPointContextFactory.class);
 
index 217e968c7ab8e659bf144b8086b065af2665ea3b..bbe4f560fbd53245fde192e7be1fc58f8f2abaf1 100644 (file)
@@ -17,7 +17,7 @@ import java.util.Iterator;
 import java.util.Optional;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
 import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory;
@@ -45,7 +45,7 @@ public abstract class AbstractMountPointContextFactory extends AbstractDynamicMo
     /**
      * Definition of a MountPoint, as known to RFC8528.
      */
-    protected static final class MountPointDefinition extends AbstractIdentifiable<MountPointIdentifier>
+    protected static final class MountPointDefinition extends AbstractSimpleIdentifiable<MountPointIdentifier>
             implements Immutable {
         private final ImmutableSet<String> parentReferences;
         private final boolean config;
@@ -147,10 +147,10 @@ public abstract class AbstractMountPointContextFactory extends AbstractDynamicMo
 
         return schemaRef.getChild(SHARED_SCHEMA).map(sharedSchema -> {
             checkArgument(sharedSchema instanceof ContainerNode, "Unexpected shared-schema container %s", sharedSchema);
-            return ((ContainerNode) sharedSchema).getChild(PARENT_REFERENCE).map(parentRef -> {
+            return ((ContainerNode) sharedSchema).getChild(PARENT_REFERENCE)
                 // FIXME: 7.0.0: parse XPaths. Do we have enough context for that?
-                return ImmutableSet.<String>of();
-            }).orElseGet(ImmutableSet::of);
+                .map(parentRef -> ImmutableSet.<String>of())
+                .orElseGet(ImmutableSet::of);
         }).orElseGet(() -> {
             checkArgument(schemaRef.getChild(INLINE).isPresent(), "Unhandled schema-ref type in %s", schemaRef);
             return ImmutableSet.of();
index d9744713418b1be53ae80f8a0ae321768e38f2ff..794421dbe8a003195d4ed859712513b679e7e8a8 100644 (file)
@@ -14,7 +14,7 @@ import com.google.common.base.MoreObjects.ToStringHelper;
 import java.util.Collection;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
 import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier;
@@ -24,7 +24,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 
 @Beta
-public final class ImmutableMountPointNode extends AbstractIdentifiable<MountPointIdentifier>
+public final class ImmutableMountPointNode extends AbstractSimpleIdentifiable<MountPointIdentifier>
         implements MountPointNode, Immutable {
 
     private final @NonNull MountPointContext mountCtx;
index f867c5ab85ab16d269e9ef85b17447755ac5c551..e852dd1de06eab4ad764fa5fca47dda74df9a805 100644 (file)
@@ -16,7 +16,7 @@ import java.util.List;
 import java.util.Optional;
 import javax.xml.transform.dom.DOMSource;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
@@ -44,7 +44,7 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
  * Base strategy for converting an instance identifier into a normalized node structure.
  * Use provided static methods for generic YangInstanceIdentifier -> NormalizedNode translation in ImmutableNodes.
  */
-abstract class InstanceIdToNodes<T extends PathArgument> extends AbstractIdentifiable<T> {
+abstract class InstanceIdToNodes<T extends PathArgument> extends AbstractSimpleIdentifiable<T> {
     InstanceIdToNodes(final T identifier) {
         super(identifier);
     }
index 848982521b507a3ff62d9bf0606fd6bb4ff530dc..9359831c0c186fb4f5689c241bc0d6d30beb30aa 100644 (file)
@@ -8,13 +8,13 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.nodes;
 
 import com.google.common.base.MoreObjects.ToStringHelper;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
-public abstract class AbstractImmutableNormalizedNode<K extends PathArgument, V> extends AbstractIdentifiable<K>
+public abstract class AbstractImmutableNormalizedNode<K extends PathArgument, V> extends AbstractSimpleIdentifiable<K>
         implements NormalizedNode<K, V>, Immutable {
     protected AbstractImmutableNormalizedNode(final K nodeIdentifier) {
         super(nodeIdentifier);
index 216bf478604cd5f8837e20e93963726acf21915c..dd5730d07aa0a7c76216f426e4d99f303d24a6a4 100644 (file)
@@ -15,7 +15,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
@@ -42,7 +42,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode;
  *
  * @param <T> Path Argument type
  */
-public abstract class DataSchemaContextNode<T extends PathArgument> extends AbstractIdentifiable<T> {
+public abstract class DataSchemaContextNode<T extends PathArgument> extends AbstractSimpleIdentifiable<T> {
     private final DataSchemaNode dataSchemaNode;
 
     protected DataSchemaContextNode(final T identifier, final SchemaNode schema) {
index aaae6bc213e2ee05e1980e265023df04b84890b0..1844e4b0d6081c8033cdacd1cfa582075ebabec1 100644 (file)
@@ -17,7 +17,7 @@ import java.util.EnumMap;
 import java.util.List;
 import java.util.Map;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.opendaylight.yangtools.rfc8528.data.api.MountPointChild;
 import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
 import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory;
@@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory;
  * YANG Schema Mount-supported data attached to either a {@code list} item or a {@code container}.
  */
 @Beta
-public final class MountPointData extends AbstractIdentifiable<MountPointIdentifier> {
+public final class MountPointData extends AbstractSimpleIdentifiable<MountPointIdentifier> {
     private static final Logger LOG = LoggerFactory.getLogger(MountPointData.class);
 
     private final Map<ContainerName, MountPointChild> yangLib = new EnumMap<>(ContainerName.class);
index 961c381ce3bc1430379bdc3f6219828e2502332a..e457254af10692e3c41e00b8331e8f6d652bc10f 100644 (file)
@@ -14,13 +14,14 @@ import com.google.common.annotations.Beta;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation;
 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRKeyword.Unqualified;
 
 @Beta
-public final class IRSchemaSource extends AbstractIdentifiable<SourceIdentifier> implements SchemaSourceRepresentation {
+public final class IRSchemaSource extends AbstractSimpleIdentifiable<SourceIdentifier>
+        implements SchemaSourceRepresentation {
     private final @NonNull IRStatement rootStatement;
     private final @Nullable String symbolicName;
 
index 911831d402e4200d6303dc349abd1261e00cb7fe..bf123ba36178e3b8bc7b9ba4301f43439d0882a8 100644 (file)
@@ -15,7 +15,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import org.antlr.v4.runtime.CharStreams;
 import org.antlr.v4.runtime.CommonTokenStream;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.common.YangVersion;
@@ -46,7 +46,7 @@ import org.opendaylight.yangtools.yang.parser.spi.source.StatementWriter;
  * @author Robert Varga
  */
 @Beta
-public final class YangStatementStreamSource extends AbstractIdentifiable<SourceIdentifier>
+public final class YangStatementStreamSource extends AbstractSimpleIdentifiable<SourceIdentifier>
         implements StatementStreamSource {
     private final IRStatement rootStatement;
     private final String sourceName;
index f00fdd28b237836c07b4b41ea4069f18415cc373..88055adcf1306408e2b2e1777c87a24ded1c7aae 100644 (file)
@@ -19,7 +19,7 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Optional;
 import javax.xml.transform.TransformerException;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.YangVersion;
 import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition;
@@ -50,7 +50,7 @@ import org.w3c.dom.NodeList;
  * @author Robert Varga
  */
 @Beta
-public final class YinStatementStreamSource extends AbstractIdentifiable<SourceIdentifier>
+public final class YinStatementStreamSource extends AbstractSimpleIdentifiable<SourceIdentifier>
         implements StatementStreamSource {
     private static final Logger LOG = LoggerFactory.getLogger(YinStatementStreamSource.class);
     private static final LoadingCache<String, URI> URI_CACHE = CacheBuilder.newBuilder().weakValues().build(
index 25d440954780cc5cd9b2f7105718d9ea7d6f62ac..29c33572136f8a51122b7080dd205eedec69a6f0 100644 (file)
@@ -17,7 +17,7 @@ import java.util.Map.Entry;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
@@ -39,7 +39,7 @@ import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace;
  * @param <N> Namespace Type
  */
 public abstract class NamespaceBehaviour<K, V, N extends IdentifierNamespace<K, V>>
-        extends AbstractIdentifiable<Class<N>> {
+        extends AbstractSimpleIdentifiable<Class<N>> {
 
     public enum StorageNodeType {
         /**