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;
* 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));
+ }
}
/**
* @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.
* @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)}
* @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);
* @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
* @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);
/**
* @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.
* @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);
/**
* @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.
* @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.
* @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);
}