Bug 2361: Added prototype implementation using new SPI. 67/15167/11
authorMartin Ciglan <mciglan@cisco.com>
Fri, 20 Mar 2015 12:08:03 +0000 (13:08 +0100)
committerMartin Ciglan <mciglan@cisco.com>
Fri, 20 Mar 2015 12:08:03 +0000 (13:08 +0100)
This prototype level implementation of module, namespace,
import, uses and container statement shows usage
of meta-level SPI in order to introduce support for
concrete statements.

Note that this is same SPI, which is to be used
to introduce new statement or extension support
directly to the YANG parser.

Change-Id: I5124a06669d48d3a32d585c4c75de5b2228f2eac
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
Signed-off-by: Martin Ciglan <mciglan@cisco.com>
20 files changed:
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/ExtensionNamespace.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/FeatureNamespace.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/GroupingNamespace.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/IdentityNamespace.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/ModuleNamespace.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/NamespaceToModule.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SchemaNodeIdentifierNamespace.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SubmoduleNamespace.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/TypeNamespace.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AbstractRootStatement.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ContainerStatementImpl.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementDefinition.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementImpl.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportedModuleContext.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementImpl.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NamespaceStatementImpl.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PrefixStatementImpl.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java [new file with mode: 0644]

diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/ExtensionNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/ExtensionNamespace.java
new file mode 100644 (file)
index 0000000..c7c8bb2
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.spi;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace;
+/**
+ * Extension namespace
+ *
+ * All extension names defined in a module and its submodules share
+ * the same extension identifier namespace.
+ *
+ */
+public interface ExtensionNamespace extends StatementNamespace<QName, ExtensionStatement, EffectiveStatement<QName, ExtensionStatement>> {
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/FeatureNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/FeatureNamespace.java
new file mode 100644 (file)
index 0000000..781c62f
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.spi;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace;
+/**
+ *
+ * Feature namespace
+ *
+ * All feature names defined in a module and its submodules share the
+ * same feature identifier namespace.
+ *
+ */
+public interface FeatureNamespace extends StatementNamespace<QName, FeatureStatement, EffectiveStatement<QName,FeatureStatement>> {
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/GroupingNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/GroupingNamespace.java
new file mode 100644 (file)
index 0000000..ade35f1
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.spi;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace;
+
+/**
+ * Grouping namespace
+ *
+ * All grouping names defined within a parent node or at the top level of the
+ * module or its submodules share the same grouping identifier namespace. This
+ * namespace is scoped to all descendant nodes of the parent node or module.
+ * This means that any descendant node may use that grouping, and it MUST NOT
+ * define a grouping with the same name.
+ */
+public interface GroupingNamespace extends StatementNamespace.TreeScoped<QName, GroupingStatement,EffectiveStatement<QName,GroupingStatement>> {
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/IdentityNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/IdentityNamespace.java
new file mode 100644 (file)
index 0000000..fc0e378
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.spi;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
+import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
+
+/**
+ *
+ * Identity namespace
+ *
+ * All identity names defined in a module and its submodules share the same
+ * identity identifier namespace.
+ *
+ */
+public interface IdentityNamespace extends IdentifierNamespace<QName, IdentityStatement> {
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/ModuleNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/ModuleNamespace.java
new file mode 100644 (file)
index 0000000..16add17
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.spi;
+
+import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace;
+
+public interface ModuleNamespace extends StatementNamespace<ModuleIdentifier, ModuleStatement, EffectiveStatement<String, ModuleStatement>> {
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/NamespaceToModule.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/NamespaceToModule.java
new file mode 100644 (file)
index 0000000..f5b00f7
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.spi;
+
+import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace;
+
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
+
+public interface NamespaceToModule extends StatementNamespace<QNameModule, ModuleStatement, EffectiveStatement<String, ModuleStatement>> {
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SchemaNodeIdentifierNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SchemaNodeIdentifierNamespace.java
new file mode 100644 (file)
index 0000000..6b482dd
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.spi;
+
+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.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace;
+
+/**
+ * Schema node identifier namespace
+ *
+ * All leafs, leaf-lists, lists, containers, choices, rpcs, notifications, and
+ * anyxmls defined (directly or through a uses statement) within a parent node
+ * or at the top level of the module or its submodules share the same identifier
+ * namespace. This namespace is scoped to the parent node or module, unless the
+ * parent node is a case node. In that case, the namespace is scoped to the
+ * closest ancestor node that is not a case or choice node.
+ */
+public interface SchemaNodeIdentifierNamespace extends StatementNamespace.TreeBased<SchemaNodeIdentifier, DeclaredStatement<?>,EffectiveStatement<?,DeclaredStatement<?>>> {
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SubmoduleNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SubmoduleNamespace.java
new file mode 100644 (file)
index 0000000..24584a1
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.spi;
+
+import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace;
+
+public interface SubmoduleNamespace extends StatementNamespace<ModuleIdentifier, SubmoduleStatement, EffectiveStatement<String, SubmoduleStatement>> {
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/TypeNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/TypeNamespace.java
new file mode 100644 (file)
index 0000000..4e061d6
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.spi;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace;
+
+/**
+ * Derived types namespace
+ *
+ * All derived type names defined within a parent node or at the top level of
+ * the module or its submodules share the same type identifier namespace. This
+ * namespace is scoped to all descendant nodes of the parent node or module.
+ * This means that any descendant node may use that typedef, and it MUST NOT
+ * define a typedef with the same name.
+ *
+ */
+public interface TypeNamespace extends StatementNamespace.TreeScoped<QName, TypedefStatement, EffectiveStatement<QName,TypedefStatement>> {
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AbstractRootStatement.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AbstractRootStatement.java
new file mode 100644 (file)
index 0000000..2cc98a8
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
+
+import java.util.Collection;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.BodyGroup;
+import org.opendaylight.yangtools.yang.model.api.stmt.ContactStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DataDefinitionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.IncludeStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.LinkageGroup;
+import org.opendaylight.yangtools.yang.model.api.stmt.MetaGroup;
+import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RevisionGroup;
+import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+
+public abstract class AbstractRootStatement<T extends DeclaredStatement<String>> extends AbstractDeclaredStatement<String>
+        implements LinkageGroup, MetaGroup, RevisionGroup, BodyGroup {
+
+    protected AbstractRootStatement(StmtContext<String, T,?> context) {
+        super(context);
+    }
+
+    @Override
+    public final Collection<? extends ImportStatement> getImports() {
+        return allDeclared(ImportStatement.class);
+    }
+
+    @Override
+    public final Collection<? extends IncludeStatement> getIncludes() {
+        return allDeclared(IncludeStatement.class);
+    }
+
+    @Override
+    public DescriptionStatement getDescription() {
+        return firstDeclared(DescriptionStatement.class);
+    }
+
+    @Override
+    public ReferenceStatement getReference() {
+        return firstDeclared(ReferenceStatement.class);
+    }
+
+    @Override
+    public final OrganizationStatement getOrganization() {
+        return firstDeclared(OrganizationStatement.class);
+    }
+
+    @Override
+    public final ContactStatement getContact() {
+        return firstDeclared(ContactStatement.class);
+    }
+
+    @Override
+    public final Collection<? extends RevisionStatement> getRevisions() {
+        return allDeclared(RevisionStatement.class);
+    }
+
+    @Override
+    public final Collection<? extends ExtensionStatement> getExtensions() {
+        return allDeclared(ExtensionStatement.class);
+    }
+
+    @Override
+    public final Collection<? extends FeatureStatement> getFeatures() {
+        return allDeclared(FeatureStatement.class);
+    }
+
+    @Override
+    public final Collection<? extends IdentityStatement> getIdentities() {
+        return allDeclared(IdentityStatement.class);
+    }
+
+    @Override
+    public Collection<? extends TypedefStatement> getTypedefs() {
+        return allDeclared(TypedefStatement.class);
+    }
+
+    @Override
+    public Collection<? extends GroupingStatement> getGroupings() {
+        return allDeclared(GroupingStatement.class);
+    }
+
+    @Override
+    public Collection<? extends DataDefinitionStatement> getDataDefinitions() {
+        return allDeclared(DataDefinitionStatement.class);
+    }
+
+    @Override
+    public final Collection<? extends AugmentStatement> getAugments() {
+        return allDeclared(AugmentStatement.class);
+    }
+
+    @Override
+    public final Collection<? extends RpcStatement> getRpcs() {
+        return allDeclared(RpcStatement.class);
+    }
+
+    @Override
+    public final Collection<? extends NotificationStatement> getNotifications() {
+        return allDeclared(NotificationStatement.class);
+    }
+
+    @Override
+    public final Collection<? extends DeviationStatement> getDeviations() {
+        return allDeclared(DeviationStatement.class);
+    }
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ContainerStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ContainerStatementImpl.java
new file mode 100644 (file)
index 0000000..da3d8bc
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
+
+import java.util.Collection;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DataDefinitionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+
+public class ContainerStatementImpl extends AbstractDeclaredStatement<QName> implements ContainerStatement {
+
+    protected ContainerStatementImpl(StmtContext<QName, ContainerStatement,?> context) {
+        super(context);
+    }
+
+    public static class Definition extends AbstractStatementSupport<QName,ContainerStatement,EffectiveStatement<QName,ContainerStatement>> {
+
+        public Definition() {
+            super(Rfc6020Mapping.Container);
+        }
+
+        @Override
+        public QName parseArgumentValue(StmtContext<?,?,?> ctx, String value) {
+            return Utils.qNameFromArgument(ctx,value);
+        }
+
+        @Override
+        public ContainerStatement createDeclared(StmtContext<QName, ContainerStatement,?> ctx) {
+            return new ContainerStatementImpl(ctx);
+        }
+
+        @Override
+        public EffectiveStatement<QName,ContainerStatement> createEffective(StmtContext<QName,ContainerStatement,EffectiveStatement<QName,ContainerStatement>> ctx) {
+           throw new UnsupportedOperationException();
+        }
+
+    }
+
+    @Override
+    public QName getName() {
+        return argument();
+    }
+
+    @Override
+    public WhenStatement getWhenStatement() {
+        return firstDeclared(WhenStatement.class);
+    }
+
+    @Override
+    public Collection<? extends IfFeatureStatement> getIfFeatures() {
+        return allDeclared(IfFeatureStatement.class);
+    }
+
+    @Override
+    public Collection<? extends MustStatement> getMusts() {
+        return allDeclared(MustStatement.class);
+    }
+
+    @Override
+    public PresenceStatement getPresence() {
+        return firstDeclared(PresenceStatement.class);
+    }
+
+    @Override
+    public ConfigStatement getConfig() {
+        return firstDeclared(ConfigStatement.class);
+    }
+
+    @Override
+    public StatusStatement getStatus() {
+        return firstDeclared(StatusStatement.class);
+    }
+
+    @Override
+    public DescriptionStatement getDescription() {
+        return firstDeclared(DescriptionStatement.class);
+    }
+
+    @Override
+    public ReferenceStatement getReference() {
+        return firstDeclared(ReferenceStatement.class);
+    }
+
+    @Override
+    public Collection<? extends TypedefStatement> getTypedefs() {
+        return allDeclared(TypedefStatement.class);
+    }
+
+    @Override
+    public Collection<? extends GroupingStatement> getGroupings() {
+        return allDeclared(GroupingStatement.class);
+    }
+
+    @Override
+    public Collection<? extends DataDefinitionStatement> getDataDefinitions() {
+        return allDeclared(DataDefinitionStatement.class);
+    }
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementDefinition.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementDefinition.java
new file mode 100644 (file)
index 0000000..221dfec
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
+
+
+import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.SourceLinkage;
+import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf;
+
+import com.google.common.base.Optional;
+import java.net.URI;
+import java.text.ParseException;
+import java.util.Collection;
+import java.util.Date;
+import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
+import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
+import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement;
+import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl;
+import org.opendaylight.yangtools.yang.parser.spi.ModuleNamespace;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceAction;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
+import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
+
+public class ImportStatementDefinition extends
+        AbstractStatementSupport<String, ImportStatement, EffectiveStatement<String, ImportStatement>> {
+
+    public ImportStatementDefinition() {
+        super(Rfc6020Mapping.Import);
+    }
+
+    @Override
+    public String parseArgumentValue(StmtContext<?, ?, ?> ctx, String value) {
+        return value;
+    }
+
+    @Override
+    public ImportStatement createDeclared(StmtContext<String, ImportStatement, ?> ctx) {
+        return new ImportStatementImpl(ctx);
+    }
+
+    @Override
+    public EffectiveStatement<String, ImportStatement> createEffective(
+            StmtContext<String, ImportStatement, EffectiveStatement<String, ImportStatement>> ctx) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void onLinkageDeclared(final Mutable<String, ImportStatement, EffectiveStatement<String, ImportStatement>> stmt)
+            throws InferenceException, SourceException {
+        final ModuleIdentifier impIdentifier = getImportedModuleIdentifier(stmt);
+        ModelActionBuilder importAction = stmt.newInferenceAction(SourceLinkage);
+        final Prerequisite<StmtContext<?, ?, ?>> imported;
+        final Prerequisite<Mutable<?, ?, ?>> linkageTarget;
+        imported = importAction.requiresCtx(stmt, ModuleNamespace.class, impIdentifier, SourceLinkage);
+        linkageTarget = importAction.mutatesCtx(stmt.getRoot(),SourceLinkage);
+
+        importAction.apply(new InferenceAction() {
+
+            @Override
+            public void apply() throws InferenceException {
+                StmtContext<?, ?, ?> importedModule = imported.get();
+                // URI importedNs =
+                // importedModule.firstSubstatement(NamespaceStatement.class).argument();
+                // String prefix =
+                // stmt.firstSubstatement(PrefixStatement.class).argument();
+                linkageTarget.get().addToNs(ImportedModuleContext.class, impIdentifier, importedModule);
+                // prefixTarget.get().addToNs(PrefixToModule.class, prefix,
+                // QNameModule.create(importedNs, null));
+            }
+
+            @Override
+            public void prerequisiteFailed(Collection<? extends Prerequisite<?>> failed) throws InferenceException {
+                if (failed.contains(imported)) {
+                    throw new InferenceException("Imported module was not found.", stmt.getStatementSourceReference());
+                }
+            }
+        });
+    }
+
+    private static ModuleIdentifier getImportedModuleIdentifier(Mutable<String, ImportStatement, ?> stmt) throws SourceException {
+        String moduleName = stmt.getStatementArgument();
+        String revisionArg = firstAttributeOf(stmt.declaredSubstatements(), RevisionDateStatement.class);
+        final Optional<Date> revision;
+        if (revisionArg != null) {
+            try {
+                revision = Optional.of(SimpleDateFormatUtil.getRevisionFormat().parse(revisionArg));
+            } catch (ParseException e) {
+                throw new SourceException(
+                        String.format("Revision value %s is not in required format yyyy-MM-dd", revisionArg),
+                        stmt.getStatementSourceReference(), e);
+            }
+        } else {
+            revision = Optional.absent();
+        }
+        return new ModuleIdentifierImpl(moduleName, Optional.<URI> absent(), revision);
+    }
+
+}
\ No newline at end of file
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementImpl.java
new file mode 100644 (file)
index 0000000..df090bd
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
+
+import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+
+public class ImportStatementImpl extends AbstractDeclaredStatement<String> implements ImportStatement {
+
+    ImportStatementImpl(StmtContext<String, ImportStatement,?> context) {
+        super(context);
+    }
+
+    @Override
+    public String getModule() {
+        return rawArgument();
+    }
+
+    @Override
+    public PrefixStatement getPrefix() {
+        return firstDeclared(PrefixStatement.class);
+    }
+
+    @Override
+    public RevisionDateStatement getRevisionDate() {
+        return firstDeclared(RevisionDateStatement.class);
+    }
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportedModuleContext.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportedModuleContext.java
new file mode 100644 (file)
index 0000000..629fee2
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
+
+import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ImportedNamespaceContext;
+
+public interface ImportedModuleContext extends ImportedNamespaceContext<ModuleIdentifier> {
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementImpl.java
new file mode 100644 (file)
index 0000000..497f7c9
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
+
+import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+
+public class ModuleStatementImpl extends AbstractRootStatement<ModuleStatement> implements ModuleStatement {
+
+    protected ModuleStatementImpl(StmtContext<String, ModuleStatement,?> context) {
+        super(context);
+    }
+
+    @Override
+    public String getName() {
+        return rawArgument();
+    }
+
+    @Override
+    public YangVersionStatement getYangVersion() {
+        return firstDeclared(YangVersionStatement.class);
+    }
+
+    @Override
+    public NamespaceStatement getNamespace() {
+        return firstDeclared(NamespaceStatement.class);
+    }
+
+    @Override
+    public PrefixStatement getPrefix() {
+        return firstDeclared(PrefixStatement.class);
+    }
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java
new file mode 100644 (file)
index 0000000..1c3edcd
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
+
+import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf;
+
+import com.google.common.base.Optional;
+import java.net.URI;
+import java.util.Date;
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
+import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl;
+import org.opendaylight.yangtools.yang.parser.spi.ModuleNamespace;
+import org.opendaylight.yangtools.yang.parser.spi.NamespaceToModule;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
+import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
+
+public class ModuleStatementSupport extends AbstractStatementSupport<String, ModuleStatement, EffectiveStatement<String,ModuleStatement>> {
+
+    public ModuleStatementSupport() {
+        super(Rfc6020Mapping.Module);
+    }
+
+    @Override
+    public String parseArgumentValue(StmtContext<?,?,?> ctx, String value) {
+        return value;
+    }
+
+    @Override
+    public ModuleStatement createDeclared(StmtContext<String, ModuleStatement,?> ctx) {
+        return new ModuleStatementImpl(ctx);
+    }
+
+    @Override
+    public EffectiveStatement<String,ModuleStatement> createEffective(StmtContext<String, ModuleStatement,EffectiveStatement<String,ModuleStatement>> ctx) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void onLinkageDeclared(Mutable<String, ModuleStatement, EffectiveStatement<String, ModuleStatement>> stmt)
+            throws InferenceException, SourceException {
+        URI moduleNs = firstAttributeOf(stmt.declaredSubstatements(),NamespaceStatement.class);
+
+        QNameModule qnameNamespace = QNameModule.create(moduleNs, null);
+        ModuleIdentifierImpl moduleIdentifier = new ModuleIdentifierImpl(stmt.getStatementArgument(), Optional.<URI>absent(), Optional.<Date>absent());
+
+        stmt.addContext(ModuleNamespace.class,moduleIdentifier ,stmt);
+        stmt.addContext(NamespaceToModule.class, qnameNamespace, stmt);
+    }
+
+}
\ No newline at end of file
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NamespaceStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NamespaceStatementImpl.java
new file mode 100644 (file)
index 0000000..acd9394
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
+
+import java.net.URI;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+
+public class NamespaceStatementImpl extends AbstractDeclaredStatement<URI> implements NamespaceStatement {
+
+    public static class Definition extends AbstractStatementSupport<URI,NamespaceStatement,EffectiveStatement<URI,NamespaceStatement>> {
+
+        public Definition() {
+            super(org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping.Namespace);
+        }
+
+        @Override
+        public URI parseArgumentValue(StmtContext<?, ?,?> ctx, String value) {
+            return URI.create(value);
+        }
+
+        @Override
+        public NamespaceStatement createDeclared(StmtContext<URI, NamespaceStatement,?> ctx) {
+            return new NamespaceStatementImpl(ctx);
+        }
+
+        @Override
+        public EffectiveStatement<URI,NamespaceStatement> createEffective(StmtContext<URI, NamespaceStatement,EffectiveStatement<URI,NamespaceStatement>> ctx) {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+
+    NamespaceStatementImpl(StmtContext<URI, NamespaceStatement,?> context) {
+        super(context);
+    }
+
+    @Override
+    public URI getUri() {
+        return argument();
+    }
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PrefixStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PrefixStatementImpl.java
new file mode 100644 (file)
index 0000000..df63da0
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
+
+import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+
+public class PrefixStatementImpl extends AbstractDeclaredStatement<String> implements PrefixStatement {
+
+    public static class Definition extends AbstractStatementSupport<String,PrefixStatement,EffectiveStatement<String,PrefixStatement>> {
+
+        public Definition() {
+            super(Rfc6020Mapping.Prefix);
+        }
+
+        @Override
+        public String parseArgumentValue(StmtContext<?, ?,?> ctx, String value) {
+            return (value);
+        }
+
+        @Override
+        public PrefixStatement createDeclared(StmtContext<String, PrefixStatement,?> ctx) {
+            return new PrefixStatementImpl(ctx);
+        }
+
+        @Override
+        public EffectiveStatement<String,PrefixStatement> createEffective(StmtContext<String, PrefixStatement,EffectiveStatement<String,PrefixStatement>> ctx) {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    PrefixStatementImpl(StmtContext<String, PrefixStatement,?> context) {
+        super(context);
+    }
+
+    @Override
+    public String getValue() {
+        return rawArgument();
+    }
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java
new file mode 100644 (file)
index 0000000..324eeaf
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
+
+import java.util.Collection;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
+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.StatementDefinition;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
+import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
+import org.opendaylight.yangtools.yang.parser.spi.GroupingNamespace;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceAction;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
+import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
+
+public class UsesStatementImpl extends AbstractDeclaredStatement<QName> implements UsesStatement {
+
+    protected UsesStatementImpl(StmtContext<QName, UsesStatement, ?> context) {
+        super(context);
+    }
+
+    public static class Definition extends
+            AbstractStatementSupport<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> {
+
+        public Definition() {
+            super(Rfc6020Mapping.Uses);
+        }
+
+        @Override
+        public QName parseArgumentValue(StmtContext<?, ?, ?> ctx, String value) {
+            return Utils.qNameFromArgument(ctx, value);
+        }
+
+        public void onStatementDeclared(Mutable<QName, UsesStatement, ?> usesNode) throws InferenceException {
+            ModelActionBuilder modifier = usesNode.newInferenceAction(ModelProcessingPhase.EffectiveModel);
+            final QName groupingName = usesNode.getStatementArgument();
+            final StatementSourceReference usesSource = usesNode.getStatementSourceReference();
+            final Prerequisite<?> targetPre = modifier.mutatesEffectiveCtx(usesNode.getParentContext());
+            final Prerequisite<EffectiveStatement<QName, GroupingStatement>> sourcePre = modifier.requiresEffective(
+                    usesNode, GroupingNamespace.class, groupingName);
+
+            modifier.apply(new InferenceAction() {
+
+                @Override
+                public void apply() throws InferenceException {
+                    Mutable<?, ?, ?> targetCtx = (Mutable<?, ?, ?>) targetPre.get();
+                    EffectiveStatement<QName, GroupingStatement> source = sourcePre.get();
+
+                    throw new UnsupportedOperationException("Copy of not not yet implemented.");
+                }
+
+                @Override
+                public void prerequisiteFailed(Collection<? extends Prerequisite<?>> failed) throws InferenceException {
+                    if(failed.contains(sourcePre)) {
+                        throw new InferenceException("Grouping " + groupingName + "was not found.", usesSource);
+                    }
+                    throw new InferenceException("Unknown error occured.", usesSource);
+                }
+
+            });
+
+        }
+
+        @Override
+        public UsesStatement createDeclared(StmtContext<QName, UsesStatement, ?> ctx) {
+            return new UsesStatementImpl(ctx);
+        }
+
+        @Override
+        public EffectiveStatement<QName, UsesStatement> createEffective(
+                StmtContext<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> ctx) {
+            throw new UnsupportedOperationException("Not implemented yet.");
+        }
+
+    }
+
+    @Override
+    public QName getName() {
+        return argument();
+    }
+
+    @Override
+    public WhenStatement getWhenStatement() {
+        return firstDeclared(WhenStatement.class);
+    }
+
+    @Override
+    public Collection<? extends IfFeatureStatement> getIfFeatures() {
+        return allDeclared(IfFeatureStatement.class);
+    }
+
+    @Override
+    public StatusStatement getStatus() {
+        return firstDeclared(StatusStatement.class);
+    }
+
+    @Override
+    public DescriptionStatement getDescription() {
+        return firstDeclared(DescriptionStatement.class);
+    }
+
+    @Override
+    public ReferenceStatement getReference() {
+        return firstDeclared(ReferenceStatement.class);
+    }
+
+    @Override
+    public Collection<? extends AugmentStatement> getAugments() {
+        return allDeclared(AugmentStatement.class);
+    }
+
+    @Override
+    public Collection<? extends RefineStatement> getRefines() {
+        return allDeclared(RefineStatement.class);
+    }
+
+    @Override
+    public QName argument() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public String rawArgument() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public StatementDefinition statementDefinition() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public StatementSource getStatementSource() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java
new file mode 100644 (file)
index 0000000..101038d
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
+
+public class Utils {
+
+
+    public static QName qNameFromArgument(StmtContext<?,?,?> ctx, String value) {
+        // TODO: Implement real parsing
+        String prefix = "";
+        ctx.getFromNamespace(PrefixToModule.class, prefix);
+
+        return QName.create(value);
+    }
+
+
+}