Fix StmtContext.get{Original,PreviousCopy}Ctx() return type
[yangtools.git] / yang / yang-parser-spi / src / main / java / org / opendaylight / yangtools / yang / parser / spi / meta / ModelActionBuilder.java
index 08d01cb9f1b90247bab6edeef6b0ee541dae4554..011b991a67b078717915d7f3b0d6130ce326d003 100644 (file)
@@ -9,8 +9,10 @@ package org.opendaylight.yangtools.yang.parser.spi.meta;
 
 import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.EFFECTIVE_MODEL;
 
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableList;
 import java.util.Collection;
-import javax.annotation.Nonnull;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
@@ -122,6 +124,21 @@ public interface ModelActionBuilder {
          *                            the issue in sources.
          */
         void prerequisiteFailed(Collection<? extends Prerequisite<?>> failed);
+
+        /**
+         * Invoked once the prerequisite is deemed unavailable due to conformance reasons. This typically happens when
+         * a feature-dependent prerequisite does not have the appropriate feature activated.
+         *
+         * <p>
+         * The default implementation invokes {@link #prerequisiteFailed(Collection)}, implementations should override
+         * this method if they wish, for example, to ignore the missing prerequisite.
+         *
+         * @param unavail Unavailable prerequisite
+         */
+        @Beta
+        default void prerequisiteUnavailable(final Prerequisite<?> unavail) {
+            prerequisiteFailed(ImmutableList.of(unavail));
+        }
     }
 
     /**
@@ -131,7 +148,7 @@ public interface ModelActionBuilder {
      * @param context Statement context which needs to complete the transition.
      * @return A {@link Prerequisite} returning the declared statement of the requested context.
      */
-    @Nonnull <D extends DeclaredStatement<?>> Prerequisite<D> requiresDeclared(StmtContext<?, ? extends D, ?> context);
+    <D extends DeclaredStatement<?>> @NonNull Prerequisite<D> requiresDeclared(StmtContext<?, ? extends D, ?> context);
 
     /**
      * Create a requirement on specified statement to be declared.
@@ -139,8 +156,8 @@ public interface ModelActionBuilder {
      * @deprecated Undocumented method. Use at your own risk.
      */
     @Deprecated
-    @Nonnull <K, D extends DeclaredStatement<?>, N extends StatementNamespace<K, ? extends D, ?>>
-        Prerequisite<D> requiresDeclared(StmtContext<?, ?, ?> context, Class<N> namespace, K key);
+    <K, D extends DeclaredStatement<?>, N extends StatementNamespace<K, ? extends D, ?>>
+        @NonNull Prerequisite<D> requiresDeclared(StmtContext<?, ?, ?> context, Class<N> namespace, K key);
 
     /**
      * Action requires that the specified context completes specified phase before {@link #apply(InferenceAction)}
@@ -150,13 +167,13 @@ public interface ModelActionBuilder {
      * @param phase ModelProcessingPhase which must have completed
      * @return A {@link Prerequisite} returning the requested context.
      */
-    @Nonnull <A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>>
-        Prerequisite<StmtContext<A, D, E>> requiresCtx(StmtContext<A, D, E> context, ModelProcessingPhase phase);
+    <A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>> @NonNull Prerequisite<StmtContext<A, D, E>>
+        requiresCtx(StmtContext<A, D, E> context, ModelProcessingPhase phase);
 
-    @Nonnull <K, N extends StatementNamespace<K, ?, ?>> Prerequisite<StmtContext<?, ?, ?>> requiresCtx(
+    <K, N extends StatementNamespace<K, ?, ?>> @NonNull Prerequisite<StmtContext<?, ?, ?>> requiresCtx(
         StmtContext<?, ?, ?> context, Class<N> namespace, K key, ModelProcessingPhase phase);
 
-    @Nonnull <K, N extends StatementNamespace<K, ?, ?>> Prerequisite<StmtContext<?, ?, ?>> requiresCtx(
+    <K, N extends StatementNamespace<K, ?, ?>> @NonNull Prerequisite<StmtContext<?, ?, ?>> requiresCtx(
             StmtContext<?, ?, ?> context, Class<N> namespace, NamespaceKeyCriterion<K> criterion,
             ModelProcessingPhase phase);
 
@@ -167,12 +184,19 @@ public interface ModelActionBuilder {
      * @param context Target statement context
      * @return A {@link Prerequisite} returning the requested context.
      */
-    default @Nonnull <T extends Mutable<?, ?, ?>> Prerequisite<T> mutatesEffectiveCtx(final T context) {
+    default <T extends Mutable<?, ?, ?>> @NonNull Prerequisite<T> mutatesEffectiveCtx(final T context) {
         return mutatesCtx(context, EFFECTIVE_MODEL);
     }
 
-    @Nonnull <K, E extends EffectiveStatement<?, ?>, N extends IdentifierNamespace<K, ? extends StmtContext<?, ?, ?>>>
-        Prerequisite<Mutable<?, ?, E>> mutatesEffectiveCtx(StmtContext<?, ?, ?> context, Class<N> namespace, K key);
+    <K, E extends EffectiveStatement<?, ?>, N extends IdentifierNamespace<K, ? extends StmtContext<?, ?, ?>>>
+        @NonNull Prerequisite<Mutable<?, ?, E>> mutatesEffectiveCtx(StmtContext<?, ?, ?> context, Class<N> namespace,
+                K key);
+
+    default <K, E extends EffectiveStatement<?, ?>, N extends IdentifierNamespace<K, ? extends StmtContext<?, ?, ?>>>
+        @NonNull Prerequisite<Mutable<?, ?, E>> mutatesEffectiveCtxPath(final StmtContext<?, ?, ?> context,
+                final Class<N> namespace, final Iterable<K> keys) {
+        throw new UnsupportedOperationException(getClass() + " does not implement mutatesEffectiveCtxPath()");
+    }
 
     /**
      * Action mutates the specified statement in the specified phase. Target statement cannot complete specified
@@ -181,7 +205,7 @@ public interface ModelActionBuilder {
      * @param context Target statement context
      * @return A {@link Prerequisite} returning the requested context.
      */
-    @Nonnull <C extends Mutable<?, ?, ?>, T extends C> Prerequisite<C> mutatesCtx(T context,
+    <C extends Mutable<?, ?, ?>, T extends C> @NonNull Prerequisite<C> mutatesCtx(T context,
             ModelProcessingPhase phase);
 
     /**
@@ -200,8 +224,9 @@ public interface ModelActionBuilder {
      * @deprecated Undocumented method. Use at your own risk.
      */
     @Deprecated
-    @Nonnull <K, D extends DeclaredStatement<?>, N extends StatementNamespace<K, ? extends D, ?>>
-        Prerequisite<StmtContext<?, D, ?>> requiresDeclaredCtx(StmtContext<?, ?, ?> context, Class<N> namespace, K key);
+    <K, D extends DeclaredStatement<?>, N extends StatementNamespace<K, ? extends D, ?>>
+        @NonNull Prerequisite<StmtContext<?, D, ?>> requiresDeclaredCtx(StmtContext<?, ?, ?> context,
+                Class<N> namespace, K key);
 
     /**
      * Create a requirement on specified statement to become effective.
@@ -209,7 +234,7 @@ public interface ModelActionBuilder {
      * @deprecated Undocumented method. Use at your own risk.
      */
     @Deprecated
-    @Nonnull <E extends EffectiveStatement<?, ?>> Prerequisite<E> requiresEffective(
+    <E extends EffectiveStatement<?, ?>> @NonNull Prerequisite<E> requiresEffective(
             StmtContext<?, ?, ? extends E> stmt);
 
     /**
@@ -218,8 +243,8 @@ public interface ModelActionBuilder {
      * @deprecated Undocumented method. Use at your own risk.
      */
     @Deprecated
-    @Nonnull <K, E extends EffectiveStatement<?, ?>, N extends StatementNamespace<K, ?, ? extends E>>
-        Prerequisite<E> requiresEffective(StmtContext<?, ?, ?> context, Class<N> namespace, K key);
+    <K, E extends EffectiveStatement<?, ?>, N extends StatementNamespace<K, ?, ? extends E>>
+        @NonNull Prerequisite<E> requiresEffective(StmtContext<?, ?, ?> context, Class<N> namespace, K key);
 
     /**
      * Create a requirement on specified statement context to become effective.
@@ -227,9 +252,9 @@ public interface ModelActionBuilder {
      * @deprecated Undocumented method. Use at your own risk.
      */
     @Deprecated
-    @Nonnull <K, E extends EffectiveStatement<?, ?>, N extends StatementNamespace<K, ?, ? extends E>>
-    Prerequisite<StmtContext<?, ?, E>> requiresEffectiveCtx(StmtContext<?, ?, ?> context, Class<N> namespace,
-            K key);
+    <K, E extends EffectiveStatement<?, ?>, N extends StatementNamespace<K, ?, ? extends E>>
+        @NonNull Prerequisite<StmtContext<?, ?, E>> requiresEffectiveCtx(StmtContext<?, ?, ?> context,
+                Class<N> namespace, K key);
 
     /**
      * Mark the fact that this action is mutating a namespace.
@@ -237,6 +262,6 @@ public interface ModelActionBuilder {
      * @deprecated Undocumented method. Use at your own risk.
      */
     @Deprecated
-    @Nonnull <N extends IdentifierNamespace<?, ?>> Prerequisite<Mutable<?,?,?>> mutatesNs(
-            Mutable<?,?, ?> ctx, Class<N> namespace);
+    <N extends IdentifierNamespace<?, ?>> @NonNull Prerequisite<Mutable<?,?,?>> mutatesNs(Mutable<?,?, ?> ctx,
+            Class<N> namespace);
 }