Use StatementPolicy instead of CopyPolicy
[yangtools.git] / yang / yang-parser-spi / src / main / java / org / opendaylight / yangtools / yang / parser / spi / meta / StatementSupport.java
index 51cf20b158c7565b0500e3ebaee6599e4adfcf9b..241e208aa545cfa0c373cb1b30d27a0d2cf6b387 100644 (file)
@@ -55,7 +55,7 @@ public abstract class StatementSupport<A, D extends DeclaredStatement<A>, E exte
         }
 
         /**
-         * Return an {@link StatementPolicy} for {@link CopyPolicy#CONTEXT_INDEPENDENT}.
+         * Return a {@link StatementPolicy} for {@link CopyPolicy#CONTEXT_INDEPENDENT}.
          *
          * @param <A> Argument type
          * @param <D> Declared Statement representation
@@ -63,11 +63,11 @@ public abstract class StatementSupport<A, D extends DeclaredStatement<A>, E exte
          */
         @SuppressWarnings("unchecked")
         public static final <A, D extends DeclaredStatement<A>> @NonNull StatementPolicy<A, D> contextIndependent() {
-            return (StatementPolicy<A, D>) AlwaysReuse.CONTEXT_INDEPENDENT;
+            return (StatementPolicy<A, D>) EqualSemantics.CONTEXT_INDEPENDENT;
         }
 
         /**
-         * Return an {@link StatementPolicy} for {@link CopyPolicy#IGNORE}.
+         * Return a {@link StatementPolicy} for {@link CopyPolicy#IGNORE}.
          *
          * @param <A> Argument type
          * @param <D> Declared Statement representation
@@ -79,7 +79,7 @@ public abstract class StatementSupport<A, D extends DeclaredStatement<A>, E exte
         }
 
         /**
-         * Return an {@link StatementPolicy} for {@link CopyPolicy#REJECT}.
+         * Return a {@link StatementPolicy} for {@link CopyPolicy#REJECT}.
          *
          * @param <A> Argument type
          * @param <D> Declared Statement representation
@@ -91,68 +91,39 @@ public abstract class StatementSupport<A, D extends DeclaredStatement<A>, E exte
         }
 
         /**
-         * Return an {@link StatementPolicy} for {@link CopyPolicy#DECLARED_COPY}, deferring to a
+         * Return a {@link StatementPolicy} for {@link CopyPolicy#DECLARED_COPY}, deferring to a
          * {@link StatementEquality} for individual decisions.
          *
          * @param <A> Argument type
          * @param <D> Declared Statement representation
          * @param equality {@link StatementEquality} to apply to effective statements
-         * @return Rejecting statement policy
+         * @return Equality-based statement policy
          */
         public static final <A, D extends DeclaredStatement<A>> @NonNull StatementPolicy<A, D> copyDeclared(
                 final @NonNull StatementEquality<A, D> equality) {
             return new EqualSemantics<>(equality);
         }
 
-        abstract boolean canReuseCurrent(@NonNull Current<A, D> copy, @NonNull Current<A, D> current,
-            @NonNull Collection<? extends EffectiveStatement<?, ?>> substatements);
-
-        @Deprecated
+        /**
+         * Return a {@link StatementPolicy} for {@link CopyPolicy#DECLARED_COPY}, always performing a copy operation.
+         *
+         * @param <A> Argument type
+         * @param <D> Declared Statement representation
+         * @return Rejecting statement policy
+         */
         @SuppressWarnings("unchecked")
-        static <A, D extends DeclaredStatement<A>> StatementPolicy<A, D> compat(final CopyPolicy copyPolicy) {
-            switch (copyPolicy) {
-                case CONTEXT_INDEPENDENT:
-                    return contextIndependent();
-                case DECLARED_COPY:
-                    return (StatementPolicy<A, D>) AlwaysCopy.DECLARED_COPY;
-                case IGNORE:
-                    return ignore();
-                case REJECT:
-                    return reject();
-                default:
-                    throw new IllegalStateException("Unsupported policy " + copyPolicy);
-            }
+        public static final <A, D extends DeclaredStatement<A>> @NonNull StatementPolicy<A, D> alwaysCopyDeclared() {
+            return (StatementPolicy<A, D>) EqualSemantics.ALWAYS_COPY;
         }
 
-        private static final class AlwaysCopy<A, D extends DeclaredStatement<A>> extends StatementPolicy<A, D> {
-            @Deprecated
-            static final @NonNull AlwaysCopy<?, ?> DECLARED_COPY = new AlwaysCopy<>(CopyPolicy.DECLARED_COPY);
-
-            AlwaysCopy(final CopyPolicy copyPolicy) {
-                super(copyPolicy);
-            }
-
-            @Override
-            boolean canReuseCurrent(final Current<A, D> copy, final Current<A, D> current,
-                    final Collection<? extends EffectiveStatement<?, ?>> substatements) {
-                return false;
-            }
+        @Deprecated(forRemoval = true)
+        // FIXME: 7.0.0: remove this method
+        public static final <A, D extends DeclaredStatement<A>> @NonNull StatementPolicy<A, D> legacyDeclaredCopy() {
+            return alwaysCopyDeclared();
         }
 
-        private static final class AlwaysReuse<A, D extends DeclaredStatement<A>> extends StatementPolicy<A, D> {
-            static final @NonNull AlwaysReuse<?, ?> CONTEXT_INDEPENDENT =
-                new AlwaysReuse<>(CopyPolicy.CONTEXT_INDEPENDENT);
-
-            private AlwaysReuse(final CopyPolicy copyPolicy) {
-                super(copyPolicy);
-            }
-
-            @Override
-            boolean canReuseCurrent(final Current<A, D> copy, final Current<A, D> current,
-                    final Collection<? extends EffectiveStatement<?, ?>> substatements) {
-                return true;
-            }
-        }
+        abstract boolean canReuseCurrent(@NonNull Current<A, D> copy, @NonNull Current<A, D> current,
+            @NonNull Collection<? extends EffectiveStatement<?, ?>> substatements);
 
         private static final class AlwaysFail<A, D extends DeclaredStatement<A>> extends StatementPolicy<A, D> {
             static final @NonNull AlwaysFail<?, ?> IGNORE = new AlwaysFail<>(CopyPolicy.IGNORE);
@@ -170,13 +141,22 @@ public abstract class StatementSupport<A, D extends DeclaredStatement<A>, E exte
         }
 
         private static final class EqualSemantics<A, D extends DeclaredStatement<A>> extends StatementPolicy<A, D> {
+            static final @NonNull EqualSemantics<?, ?> ALWAYS_COPY =
+                new EqualSemantics<>((copy, stmt, substatements) -> false);
+            static final @NonNull EqualSemantics<?, ?> CONTEXT_INDEPENDENT =
+                new EqualSemantics<>(CopyPolicy.CONTEXT_INDEPENDENT, (copy, stmt, substatements) -> true);
+
             private final @NonNull StatementEquality<A, D> equality;
 
-            EqualSemantics(final @NonNull StatementEquality<A, D> equality) {
-                super(CopyPolicy.DECLARED_COPY);
+            private EqualSemantics(final CopyPolicy copyPolicy, final StatementEquality<A, D> equality) {
+                super(copyPolicy);
                 this.equality = requireNonNull(equality);
             }
 
+            EqualSemantics(final StatementEquality<A, D> equality) {
+                this(CopyPolicy.DECLARED_COPY, equality);
+            }
+
             @Override
             boolean canReuseCurrent(final Current<A, D> copy, final Current<A, D> current,
                     final Collection<? extends EffectiveStatement<?, ?>> substatements) {
@@ -211,6 +191,14 @@ public abstract class StatementSupport<A, D extends DeclaredStatement<A>, E exte
     private final @NonNull StatementDefinition def;
     private final @NonNull CopyPolicy copyPolicy;
 
+    @Beta
+    protected StatementSupport(final StatementSupport<A, D, E> delegate) {
+        checkArgument(delegate != this);
+        this.def = delegate.def;
+        this.policy = delegate.policy;
+        this.copyPolicy = delegate.copyPolicy;
+    }
+
     @Beta
     protected StatementSupport(final StatementDefinition publicDefinition, final StatementPolicy<A, D> policy) {
         checkArgument(publicDefinition != this);
@@ -219,13 +207,6 @@ public abstract class StatementSupport<A, D extends DeclaredStatement<A>, E exte
         this.copyPolicy = policy.copyPolicy;
     }
 
-    @Beta
-    @Deprecated
-    // FIXME: remove this constructor
-    protected StatementSupport(final StatementDefinition publicDefinition, final CopyPolicy copyPolicy) {
-        this(publicDefinition, StatementPolicy.compat(copyPolicy));
-    }
-
     /**
      * Returns public statement definition, which will be present in built statements.
      *