Centralize SchemaNode.getPath() dispatch
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / rpc / RpcEffectiveStatementImpl.java
index 97ed27877ee3b3c83ae34fdd5fa4710b2f22fb61..9de8e43ea8728bf43dd8ad3cf0b40a7d9b1e9407 100644 (file)
  */
 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 java.util.Objects;
-import java.util.Set;
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.SchemaNodeDefaults;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 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.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultWithDataTree.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.OperationDefinitionMixin;
 
-final class RpcEffectiveStatementImpl extends AbstractEffectiveSchemaNode<RpcStatement>
-        implements RpcDefinition, RpcEffectiveStatement {
-    private final ContainerSchemaNode input;
-    private final ContainerSchemaNode output;
-    private final Set<TypeDefinition<?>> typeDefinitions;
-    private final Set<GroupingDefinition> groupings;
+final class RpcEffectiveStatementImpl extends WithSubstatements<QName, RpcStatement, RpcEffectiveStatement>
+        implements RpcDefinition, RpcEffectiveStatement, OperationDefinitionMixin<RpcStatement> {
+    private final @Nullable SchemaPath path;
+    private final int flags;
 
-    RpcEffectiveStatementImpl(final StmtContext<QName, RpcStatement,
-            EffectiveStatement<QName, RpcStatement>> ctx) {
-        super(ctx);
-        input = findAsContainer(this, InputEffectiveStatement.class);
-        output = findAsContainer(this, OutputEffectiveStatement.class);
-
-        // initSubstatements
-        Set<GroupingDefinition> groupingsInit = new HashSet<>();
-        Set<TypeDefinition<?>> mutableTypeDefinitions = new LinkedHashSet<>();
-        for (EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
-            if (effectiveStatement instanceof GroupingDefinition) {
-                GroupingDefinition groupingDefinition = (GroupingDefinition) effectiveStatement;
-                groupingsInit.add(groupingDefinition);
-            }
-            if (effectiveStatement instanceof TypedefEffectiveStatement) {
-                TypedefEffectiveStatement typeDef = (TypedefEffectiveStatement) effectiveStatement;
-                TypeDefinition<?> type = typeDef.getTypeDefinition();
-                if (!mutableTypeDefinitions.contains(type)) {
-                    mutableTypeDefinitions.add(type);
-                } else {
-                    throw EffectiveStmtUtils.createNameCollisionSourceException(ctx, effectiveStatement);
-                }
-            }
-        }
-        this.groupings = ImmutableSet.copyOf(groupingsInit);
-        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;
-    }
-
-    @Override
-    public ContainerSchemaNode getOutput() {
-        return output;
-    }
-
-    @Override
-    public Set<TypeDefinition<?>> getTypeDefinitions() {
-        return typeDefinitions;
-    }
-
-    @Override
-    public Set<GroupingDefinition> getGroupings() {
-        return groupings;
+    RpcEffectiveStatementImpl(final RpcStatement declared,
+        final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final int flags, final SchemaPath path) {
+        super(declared, substatements);
+        this.path = path;
+        this.flags = flags;
     }
 
     @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + Objects.hashCode(getQName());
-        result = prime * result + Objects.hashCode(getPath());
-        return result;
+    @Deprecated
+    public SchemaPath getPath() {
+        return SchemaNodeDefaults.throwUnsupportedIfNull(this, path);
     }
 
     @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        final RpcEffectiveStatementImpl other = (RpcEffectiveStatementImpl) obj;
-        return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath());
+    public int flags() {
+        return flags;
     }
 
     @Override
-    public String toString() {
-        return RpcEffectiveStatementImpl.class.getSimpleName() + "["
-                + "qname=" + getQName()
-                + ", path=" +  getPath()
-                + ", input=" + input
-                + ", output=" + output
-                + "]";
+    public RpcEffectiveStatement asEffectiveStatement() {
+        return this;
     }
 }