import java.util.stream.Stream;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
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;
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
-import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
import org.opendaylight.yangtools.yang.parser.spi.meta.CopyHistory;
import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
import org.opendaylight.yangtools.yang.parser.spi.meta.ImplicitParentAwareStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport.CopyPolicy;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
import org.opendaylight.yangtools.yang.parser.spi.source.ImplicitSubstatement;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
import org.opendaylight.yangtools.yang.parser.stmt.reactor.NamespaceBehaviourWithListeners.KeyedValueAddedListener;
private @Nullable ModelProcessingPhase completedPhase;
- // SchemaPath cache for use with SubstatementContext and InferredStatementContext. This hurts RootStatementContext
- // a bit in terms of size -- but those are only a few and SchemaPath is on its way out anyway.
- private volatile SchemaPath schemaPath;
-
// Copy constructor used by subclasses to implement reparent()
StatementContextBase(final StatementContextBase<A, D, E> original) {
super(original);
}
@Override
- public CopyHistory getCopyHistory() {
+ public final CopyHistory history() {
return copyHistory;
}
@Override
- public ModelProcessingPhase getCompletedPhase() {
+ public final ModelProcessingPhase getCompletedPhase() {
return completedPhase;
}
}
static final Collection<? extends Mutable<?, ?, ?>> mutableEffectiveSubstatements(
- final List<StatementContextBase<?, ?, ?>> effective) {
+ final List<ReactorStmtCtx<?, ?, ?>> effective) {
return effective instanceof ImmutableCollection ? effective : Collections.unmodifiableCollection(effective);
}
- private static List<StatementContextBase<?, ?, ?>> shrinkEffective(
- final List<StatementContextBase<?, ?, ?>> effective) {
+ private static List<ReactorStmtCtx<?, ?, ?>> shrinkEffective(final List<ReactorStmtCtx<?, ?, ?>> effective) {
return effective.isEmpty() ? ImmutableList.of() : effective;
}
public abstract void removeStatementFromEffectiveSubstatements(StatementDefinition statementDef);
- static final List<StatementContextBase<?, ?, ?>> removeStatementFromEffectiveSubstatements(
- final List<StatementContextBase<?, ?, ?>> effective, final StatementDefinition statementDef) {
+ static final List<ReactorStmtCtx<?, ?, ?>> removeStatementFromEffectiveSubstatements(
+ final List<ReactorStmtCtx<?, ?, ?>> effective, final StatementDefinition statementDef) {
if (effective.isEmpty()) {
return effective;
}
public abstract void removeStatementFromEffectiveSubstatements(StatementDefinition statementDef,
String statementArg);
- static final List<StatementContextBase<?, ?, ?>> removeStatementFromEffectiveSubstatements(
- final List<StatementContextBase<?, ?, ?>> effective, final StatementDefinition statementDef,
+ static final List<ReactorStmtCtx<?, ?, ?>> removeStatementFromEffectiveSubstatements(
+ final List<ReactorStmtCtx<?, ?, ?>> effective, final StatementDefinition statementDef,
final String statementArg) {
if (statementArg == null) {
return removeStatementFromEffectiveSubstatements(effective, statementDef);
return effective;
}
- final Iterator<StatementContextBase<?, ?, ?>> iterator = effective.iterator();
+ final Iterator<ReactorStmtCtx<?, ?, ?>> iterator = effective.iterator();
while (iterator.hasNext()) {
final Mutable<?, ?, ?> next = iterator.next();
if (statementDef.equals(next.publicDefinition()) && statementArg.equals(next.rawArgument())) {
*/
public abstract void addEffectiveSubstatement(Mutable<?, ?, ?> substatement);
- final List<StatementContextBase<?, ?, ?>> addEffectiveSubstatement(
- final List<StatementContextBase<?, ?, ?>> effective, final Mutable<?, ?, ?> substatement) {
+ final List<ReactorStmtCtx<?, ?, ?>> addEffectiveSubstatement(final List<ReactorStmtCtx<?, ?, ?>> effective,
+ final Mutable<?, ?, ?> substatement) {
verifyStatement(substatement);
- final List<StatementContextBase<?, ?, ?>> resized = beforeAddEffectiveStatement(effective, 1);
- final StatementContextBase<?, ?, ?> stmt = (StatementContextBase<?, ?, ?>) substatement;
+ final List<ReactorStmtCtx<?, ?, ?>> resized = beforeAddEffectiveStatement(effective, 1);
+ final ReactorStmtCtx<?, ?, ?> stmt = (ReactorStmtCtx<?, ?, ?>) substatement;
final ModelProcessingPhase phase = completedPhase;
if (phase != null) {
ensureCompletedPhase(stmt, phase);
abstract void addEffectiveSubstatementsImpl(Collection<? extends Mutable<?, ?, ?>> statements);
- final List<StatementContextBase<?, ?, ?>> addEffectiveSubstatementsImpl(
- final List<StatementContextBase<?, ?, ?>> effective,
+ final List<ReactorStmtCtx<?, ?, ?>> addEffectiveSubstatementsImpl(final List<ReactorStmtCtx<?, ?, ?>> effective,
final Collection<? extends Mutable<?, ?, ?>> statements) {
- final List<StatementContextBase<?, ?, ?>> resized = beforeAddEffectiveStatement(effective, statements.size());
+ final List<ReactorStmtCtx<?, ?, ?>> resized = beforeAddEffectiveStatement(effective, statements.size());
final Collection<? extends StatementContextBase<?, ?, ?>> casted =
(Collection<? extends StatementContextBase<?, ?, ?>>) statements;
final ModelProcessingPhase phase = completedPhase;
return resized;
}
- abstract Iterable<StatementContextBase<?, ?, ?>> effectiveChildrenToComplete();
+ abstract Iterable<ReactorStmtCtx<?, ?, ?>> effectiveChildrenToComplete();
// exposed for InferredStatementContext only
final void ensureCompletedPhase(final Mutable<?, ?, ?> stmt) {
verifyStatement(stmt);
final ModelProcessingPhase phase = completedPhase;
if (phase != null) {
- ensureCompletedPhase((StatementContextBase<?, ?, ?>) stmt, phase);
+ ensureCompletedPhase((ReactorStmtCtx<?, ?, ?>) stmt, phase);
}
}
// Make sure target statement has transitioned at least to specified phase. This method is just before we take
// allow a statement to become our substatement. This is needed to ensure that every statement tree does not contain
// any statements which did not complete the same phase as the root statement.
- private static void ensureCompletedPhase(final StatementContextBase<?, ?, ?> stmt,
- final ModelProcessingPhase phase) {
+ private static void ensureCompletedPhase(final ReactorStmtCtx<?, ?, ?> stmt, final ModelProcessingPhase phase) {
verify(stmt.tryToCompletePhase(phase), "Statement %s cannot complete phase %s", stmt, phase);
}
private static void verifyStatement(final Mutable<?, ?, ?> stmt) {
- verify(stmt instanceof StatementContextBase, "Unexpected statement %s", stmt);
+ verify(stmt instanceof ReactorStmtCtx, "Unexpected statement %s", stmt);
}
- private List<StatementContextBase<?, ?, ?>> beforeAddEffectiveStatement(
- final List<StatementContextBase<?, ?, ?>> effective, final int toAdd) {
+ private List<ReactorStmtCtx<?, ?, ?>> beforeAddEffectiveStatement(final List<ReactorStmtCtx<?, ?, ?>> effective,
+ final int toAdd) {
// We cannot allow statement to be further mutated
verify(completedPhase != ModelProcessingPhase.EFFECTIVE_MODEL, "Cannot modify finished statement at %s",
sourceReference());
return beforeAddEffectiveStatementUnsafe(effective, toAdd);
}
- final List<StatementContextBase<?, ?, ?>> beforeAddEffectiveStatementUnsafe(
- final List<StatementContextBase<?, ?, ?>> effective, final int toAdd) {
+ final List<ReactorStmtCtx<?, ?, ?>> beforeAddEffectiveStatementUnsafe(final List<ReactorStmtCtx<?, ?, ?>> effective,
+ final int toAdd) {
final ModelProcessingPhase inProgressPhase = getRoot().getSourceContext().getInProgressPhase();
checkState(inProgressPhase == ModelProcessingPhase.FULL_DECLARATION
|| inProgressPhase == ModelProcessingPhase.EFFECTIVE_MODEL,
// Exposed for ReplicaStatementContext
@Override
E createEffective() {
- return definition.getFactory().createEffective(new BaseCurrentEffectiveStmtCtx<>(this), streamDeclared(),
- streamEffective());
+ return definition.getFactory().createEffective(this, streamDeclared(), streamEffective());
}
abstract Stream<? extends StmtContext<?, ?, ?>> streamDeclared();
abstract Stream<? extends StmtContext<?, ?, ?>> streamEffective();
- /**
- * Try to execute current {@link ModelProcessingPhase} of source parsing. If the phase has already been executed,
- * this method does nothing.
- *
- * @param phase to be executed (completed)
- * @return true if phase was successfully completed
- * @throws SourceException when an error occurred in source parsing
- */
- final boolean tryToCompletePhase(final ModelProcessingPhase phase) {
- return phase.isCompletedBy(completedPhase) || doTryToCompletePhase(phase);
- }
-
- private boolean doTryToCompletePhase(final ModelProcessingPhase phase) {
+ @Override
+ final boolean doTryToCompletePhase(final ModelProcessingPhase phase) {
final boolean finished = phaseMutation.isEmpty() ? true : runMutations(phase);
if (completeChildren(phase) && finished) {
onPhaseCompleted(phase);
for (final StatementContextBase<?, ?, ?> child : mutableDeclaredSubstatements()) {
finished &= child.tryToCompletePhase(phase);
}
- for (final StatementContextBase<?, ?, ?> child : effectiveChildrenToComplete()) {
+ for (final ReactorStmtCtx<?, ?, ?> child : effectiveChildrenToComplete()) {
finished &= child.tryToCompletePhase(phase);
}
return finished;
// This statement is context-independent and has no substatements -- hence it can be freely shared.
return Optional.of(replicaAsChildOf(parent));
}
- // FIXME: YANGTOOLS-694: filter out all context-independent substatements, eliminate fall-through
+ // ascertaining substatements could be quite costly, let's just fall through to declared copy and deal
+ // shortcut it when we build the statements.
// fall through
case DECLARED_COPY:
// FIXME: YANGTOOLS-694: this is still to eager, we really want to copy as a lazily-instantiated
}
@Override
- public final StatementContextBase<A, D, E> replicaAsChildOf(final Mutable<?, ?, ?> parent) {
+ public final ReactorStmtCtx<A, D, E> replicaAsChildOf(final Mutable<?, ?, ?> parent) {
checkArgument(parent instanceof StatementContextBase, "Unsupported parent %s", parent);
return replicaAsChildOf((StatementContextBase<?, ?, ?>) parent);
}
- final @NonNull StatementContextBase<A, D, E> replicaAsChildOf(final StatementContextBase<?, ?, ?> stmt) {
+ final @NonNull ReplicaStatementContext<A, D, E> replicaAsChildOf(final StatementContextBase<?, ?, ?> stmt) {
return new ReplicaStatementContext<>(stmt, this);
}
}
final StatementDefinitionContext<?, ?, ?> def = new StatementDefinitionContext<>(optImplicit.get());
- final CopyType type = original.getCopyHistory().getLastOperation();
+ final CopyType type = original.history().getLastOperation();
final SubstatementContext<?, ?, ?> result = new SubstatementContext(original.getParentContext(), def,
original.sourceReference(), original.rawArgument(), original.argument(), type);
* @return True if {@link #allSubstatements()} and {@link #allSubstatementsStream()} would return an empty stream.
*/
abstract boolean hasEmptySubstatements();
-
- abstract @NonNull Optional<SchemaPath> schemaPath();
-
- // Exists only to support {SubstatementContext,InferredStatementContext}.schemaPath()
- @Deprecated
- final @NonNull Optional<SchemaPath> substatementGetSchemaPath() {
- SchemaPath local = schemaPath;
- if (local == null) {
- synchronized (this) {
- local = schemaPath;
- if (local == null) {
- schemaPath = local = createSchemaPath((StatementContextBase<?, ?, ?>) coerceParentContext());
- }
- }
- }
-
- return Optional.ofNullable(local);
- }
-
- @Deprecated
- private SchemaPath createSchemaPath(final StatementContextBase<?, ?, ?> parent) {
- final Optional<SchemaPath> maybeParentPath = parent.schemaPath();
- verify(maybeParentPath.isPresent(), "Parent %s does not have a SchemaPath", parent);
- final SchemaPath parentPath = maybeParentPath.get();
-
- if (StmtContextUtils.isUnknownStatement(this)) {
- return parentPath.createChild(publicDefinition().getStatementName());
- }
- final Object argument = argument();
- if (argument instanceof QName) {
- final QName qname = (QName) argument;
- if (producesDeclared(UsesStatement.class)) {
- return maybeParentPath.orElse(null);
- }
-
- return parentPath.createChild(qname);
- }
- if (argument instanceof String) {
- // FIXME: This may yield illegal argument exceptions
- final Optional<StmtContext<A, D, E>> originalCtx = getOriginalCtx();
- final QName qname = StmtContextUtils.qnameFromArgument(originalCtx.orElse(this), (String) argument);
- return parentPath.createChild(qname);
- }
- if (argument instanceof SchemaNodeIdentifier
- && (producesDeclared(AugmentStatement.class) || producesDeclared(RefineStatement.class)
- || producesDeclared(DeviationStatement.class))) {
-
- return parentPath.createChild(((SchemaNodeIdentifier) argument).getNodeIdentifiers());
- }
-
- // FIXME: this does not look right
- return maybeParentPath.orElse(null);
- }
}