import com.google.common.annotations.Beta;
import com.google.common.base.MoreObjects;
+import com.google.common.base.Verify;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import java.net.URI;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import org.opendaylight.yangtools.yang.model.api.stmt.ContactEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.PrefixEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionEffectiveStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension.ExtensionEffectiveStatementImpl;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.submodule.SubmoduleEffectiveStatementImpl;
import org.opendaylight.yangtools.yang.parser.spi.meta.MutableStatement;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
* for modules. In case of submodules it does not make sense because
* of possible circular chains of includes between submodules.
*/
- final Collection<StmtContext<?, ?, ?>> includedSubmodules = includedSubmodulesMap.values();
final Set<Module> submodulesInit = new HashSet<>();
final List<EffectiveStatement<?, ?>> substatementsOfSubmodulesInit = new ArrayList<>();
- for (final StmtContext<?, ?, ?> submoduleCtx : includedSubmodules) {
- final SubmoduleEffectiveStatementImpl submodule = (SubmoduleEffectiveStatementImpl) submoduleCtx
- .buildEffective();
- submodulesInit.add(submodule);
+ for (final StmtContext<?, ?, ?> submoduleCtx : includedSubmodulesMap.values()) {
+ final EffectiveStatement<?, ?> submodule = submoduleCtx.buildEffective();
+ Verify.verify(submodule instanceof SubmoduleEffectiveStatement);
+ Verify.verify(submodule instanceof Module, "Submodule statement %s is not a Module", submodule);
+ submodulesInit.add((Module) submodule);
substatementsOfSubmodulesInit.addAll(submodule.effectiveSubstatements().stream()
.filter(sub -> sub instanceof SchemaNode || sub instanceof DataNodeContainer)
.collect(Collectors.toList()));
if (effectiveStatement instanceof FeatureDefinition) {
featuresInit.add((FeatureDefinition) effectiveStatement);
}
- if (effectiveStatement instanceof ExtensionEffectiveStatementImpl) {
- extensionNodesInit.add((ExtensionEffectiveStatementImpl) effectiveStatement);
+ if (effectiveStatement instanceof ExtensionDefinition) {
+ extensionNodesInit.add((ExtensionDefinition) effectiveStatement);
}
if (effectiveStatement instanceof DataSchemaNode) {
final DataSchemaNode dataSchemaNode = (DataSchemaNode) effectiveStatement;
/**
* Create a set of substatements. This method is split out so it can be overridden in
- * {@link org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension.ExtensionEffectiveStatementImpl} to leak
- * a not-fully-initialized instance.
+ * ExtensionEffectiveStatementImpl to leak a not-fully-initialized instance.
*
* @param substatementsInit proposed substatements
* @return Filtered substatements
package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.action;
import com.google.common.base.MoreObjects;
+import com.google.common.base.Verify;
import com.google.common.collect.ImmutableSet;
import java.util.HashSet;
import java.util.LinkedHashSet;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveSchemaNode;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStmtUtils;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.input.InputEffectiveStatementImpl;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.output.OutputEffectiveStatementImpl;
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.StmtContext;
ActionEffectiveStatementImpl(
final StmtContext<QName, ActionStatement, EffectiveStatement<QName, ActionStatement>> ctx) {
super(ctx);
- this.input = firstEffective(InputEffectiveStatementImpl.class);
- this.output = firstEffective(OutputEffectiveStatementImpl.class);
+
+ input = findAsContainer(this, InputEffectiveStatement.class);
+ output = findAsContainer(this, OutputEffectiveStatement.class);
// initSubstatements
final Set<GroupingDefinition> groupingsInit = new HashSet<>();
}
}
+ private static ContainerSchemaNode findAsContainer(final EffectiveStatement<?, ?> parent,
+ final Class<? extends EffectiveStatement<QName, ?>> statementType) {
+ final EffectiveStatement<?, ?> statement = parent.findFirstEffectiveSubstatement(statementType).get();
+ Verify.verify(statement instanceof ContainerSchemaNode, "Child statement %s is not a ContainerSchemaNode");
+ return (ContainerSchemaNode) statement;
+ }
+
@Override
public ContainerSchemaNode getInput() {
return input;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveDocumentedNode;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-// FIXME: hide this class
-public final class ExtensionEffectiveStatementImpl extends AbstractEffectiveDocumentedNode<QName, ExtensionStatement>
+final class ExtensionEffectiveStatementImpl extends AbstractEffectiveDocumentedNode<QName, ExtensionStatement>
implements ExtensionDefinition, ExtensionEffectiveStatement {
private static final class RecursionDetector extends ThreadLocal<Deque<ExtensionEffectiveStatementImpl>> {
boolean check(final ExtensionEffectiveStatementImpl current) {
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveContainerSchemaNode;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-// FIXME: hide this class
-public final class InputEffectiveStatementImpl extends AbstractEffectiveContainerSchemaNode<InputStatement>
+final class InputEffectiveStatementImpl extends AbstractEffectiveContainerSchemaNode<InputStatement>
implements InputEffectiveStatement {
InputEffectiveStatementImpl(
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveContainerSchemaNode;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-// FIXME: hide this class
-public final class OutputEffectiveStatementImpl extends AbstractEffectiveContainerSchemaNode<OutputStatement>
+final class OutputEffectiveStatementImpl extends AbstractEffectiveContainerSchemaNode<OutputStatement>
implements OutputEffectiveStatement {
OutputEffectiveStatementImpl(
*/
package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.rpc;
+import com.google.common.base.Verify;
import com.google.common.collect.ImmutableSet;
import java.util.HashSet;
import java.util.LinkedHashSet;
import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveSchemaNode;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStmtUtils;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.input.InputEffectiveStatementImpl;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.output.OutputEffectiveStatementImpl;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
final class RpcEffectiveStatementImpl extends AbstractEffectiveSchemaNode<RpcStatement>
RpcEffectiveStatementImpl(final StmtContext<QName, RpcStatement,
EffectiveStatement<QName, RpcStatement>> ctx) {
super(ctx);
- this.input = firstEffective(InputEffectiveStatementImpl.class);
- this.output = firstEffective(OutputEffectiveStatementImpl.class);
+ input = findAsContainer(this, InputEffectiveStatement.class);
+ output = findAsContainer(this, OutputEffectiveStatement.class);
// initSubstatements
Set<GroupingDefinition> groupingsInit = new HashSet<>();
this.typeDefinitions = ImmutableSet.copyOf(mutableTypeDefinitions);
}
+ private static ContainerSchemaNode findAsContainer(final EffectiveStatement<?, ?> parent,
+ final Class<? extends EffectiveStatement<QName, ?>> statementType) {
+ final EffectiveStatement<?, ?> statement = parent.findFirstEffectiveSubstatement(statementType).get();
+ Verify.verify(statement instanceof ContainerSchemaNode, "Child statement %s is not a ContainerSchemaNode");
+ return (ContainerSchemaNode) statement;
+ }
+
@Override
public ContainerSchemaNode getInput() {
return input;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToModuleQName;
-// FIXME: hide this class
-public final class SubmoduleEffectiveStatementImpl extends AbstractEffectiveModule<SubmoduleStatement>
+final class SubmoduleEffectiveStatementImpl extends AbstractEffectiveModule<SubmoduleStatement>
implements SubmoduleEffectiveStatement {
private final QNameModule qnameModule;