Deprecate StmtContext.getSchemaPath()
[yangtools.git] / yang / yang-parser-reactor / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / SubstatementContext.java
index ea4fa1b91e142a21dd5234c5742eb11bff9c184f..12605eddfb50c1ca2d67b3ce32d66bd3fb3d6250 100644 (file)
@@ -9,27 +9,13 @@ package org.opendaylight.yangtools.yang.parser.stmt.reactor;
 
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.base.Verify;
 import java.util.Optional;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.common.YangVersion;
 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.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.model.repo.api.SourceIdentifier;
 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
-import org.opendaylight.yangtools.yang.parser.spi.meta.MutableStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode;
-import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.StorageNodeType;
-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.StatementSourceReference;
 
 final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>> extends
@@ -37,7 +23,12 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
     private final StatementContextBase<?, ?, ?> parent;
     private final A argument;
 
-    private volatile SchemaPath schemaPath;
+    private SubstatementContext(final SubstatementContext<A, D, E> original,
+            final StatementContextBase<?, ?, ?> parent) {
+        super(original);
+        this.parent = requireNonNull(parent, "Parent must not be null");
+        this.argument = original.argument;
+    }
 
     SubstatementContext(final StatementContextBase<?, ?, ?> parent, final StatementDefinitionContext<A, D, E> def,
             final StatementSourceReference ref, final String rawArgument) {
@@ -46,26 +37,35 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
         this.argument = def.parseArgumentValue(this, rawStatementArgument());
     }
 
+    // FIXME: YANGTOOLS-784: this constructor is only called in contexts where a different implementation
+    //                       would be more appropriate
     SubstatementContext(final StatementContextBase<?, ?, ?> parent, final StatementDefinitionContext<A, D, E> def,
-        final StatementSourceReference ref, final String rawArgument, final A argument, final CopyType copyType) {
+            final StatementSourceReference ref, final String rawArgument, final A argument, final CopyType copyType) {
         super(def, ref, rawArgument, copyType);
         this.parent = requireNonNull(parent, "Parent must not be null");
         this.argument = argument;
     }
 
-    SubstatementContext(final StatementContextBase<A, D, E> original, final StatementContextBase<?, ?, ?> parent,
-            final CopyType copyType, final QNameModule targetModule) {
-        super(original, copyType);
-        this.parent = requireNonNull(parent, "Parent must not be null");
-        this.argument = targetModule == null ? original.getStatementArgument()
-                : original.definition().adaptArgumentValue(original, targetModule);
+    @Override
+    SubstatementContext<A, D, E> reparent(final StatementContextBase<?, ?, ?> newParent) {
+        return new SubstatementContext<>(this, newParent);
     }
 
-    private SubstatementContext(final SubstatementContext<A, D, E> original,
-            final StatementContextBase<?, ?, ?> parent) {
-        super(original);
-        this.parent = requireNonNull(parent, "Parent must not be null");
-        this.argument = original.argument;
+    /*
+     * KEEP THINGS ORGANIZED!
+     *
+     * below methods exist in the same form in InferredStatementContext. If any adjustment is made here, make sure it is
+     * properly updated there.
+     */
+    @Override
+    @Deprecated
+    public Optional<SchemaPath> getSchemaPath() {
+        return substatementGetSchemaPath();
+    }
+
+    @Override
+    public A getStatementArgument() {
+        return argument;
     }
 
     @Override
@@ -83,106 +83,16 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
         return parent;
     }
 
-    @Override
-    public Registry getBehaviourRegistry() {
-        return parent.getBehaviourRegistry();
-    }
-
     @Override
     public RootStatementContext<?, ?, ?> getRoot() {
         return parent.getRoot();
     }
 
-    @Override
-    public A getStatementArgument() {
-        return argument;
-    }
-
-    private SchemaPath createSchemaPath() {
-        final Optional<SchemaPath> maybeParentPath = parent.getSchemaPath();
-        Verify.verify(maybeParentPath.isPresent(), "Parent %s does not have a SchemaPath", parent);
-        final SchemaPath parentPath = maybeParentPath.get();
-
-        if (StmtContextUtils.isUnknownStatement(this)) {
-            return parentPath.createChild(getPublicDefinition().getStatementName());
-        }
-        if (argument instanceof QName) {
-            final QName qname = (QName) argument;
-            if (StmtContextUtils.producesDeclared(this, UsesStatement.class)) {
-                return maybeParentPath.orElse(null);
-            }
-
-            return parentPath.createChild(qname);
-        }
-        if (argument instanceof String) {
-            // FIXME: This may yield illegal argument exceptions
-            final Optional<StmtContext<?, ?, ?>> originalCtx = getOriginalCtx();
-            final QName qname = StmtContextUtils.qnameFromArgument(originalCtx.orElse(this), (String) argument);
-            return parentPath.createChild(qname);
-        }
-        if (argument instanceof SchemaNodeIdentifier
-                && (StmtContextUtils.producesDeclared(this, AugmentStatement.class)
-                        || StmtContextUtils.producesDeclared(this, RefineStatement.class)
-                        || StmtContextUtils.producesDeclared(this, DeviationStatement.class))) {
-
-            return parentPath.createChild(((SchemaNodeIdentifier) argument).getPathFromRoot());
-        }
-
-        // FIXME: this does not look right
-        return maybeParentPath.orElse(null);
-    }
-
-    @Override
-    public Optional<SchemaPath> getSchemaPath() {
-        SchemaPath local = schemaPath;
-        if (local == null) {
-            synchronized (this) {
-                local = schemaPath;
-                if (local == null) {
-                    local = createSchemaPath();
-                    schemaPath = local;
-                }
-            }
-        }
-
-        return Optional.ofNullable(local);
-    }
-
     @Override
     public boolean isConfiguration() {
         return isConfiguration(parent);
     }
 
-    @Override
-    public boolean isEnabledSemanticVersioning() {
-        return parent.isEnabledSemanticVersioning();
-    }
-
-    @Override
-    public YangVersion getRootVersion() {
-        return getRoot().getRootVersion();
-    }
-
-    @Override
-    public void setRootVersion(final YangVersion version) {
-        getRoot().setRootVersion(version);
-    }
-
-    @Override
-    public void addMutableStmtToSeal(final MutableStatement mutableStatement) {
-        getRoot().addMutableStmtToSeal(mutableStatement);
-    }
-
-    @Override
-    public void addRequiredSource(final SourceIdentifier dependency) {
-        getRoot().addRequiredSource(dependency);
-    }
-
-    @Override
-    public void setRootIdentifier(final SourceIdentifier identifier) {
-        getRoot().setRootIdentifier(identifier);
-    }
-
     @Override
     protected boolean isIgnoringIfFeatures() {
         return isIgnoringIfFeatures(parent);
@@ -197,9 +107,4 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
     protected boolean isParentSupportedByFeatures() {
         return parent.isSupportedByFeatures();
     }
-
-    @Override
-    SubstatementContext<A, D, E> reparent(final StatementContextBase<?, ?, ?> newParent) {
-        return new SubstatementContext<>(this, newParent);
-    }
 }