Promote BaseStatementSupport to parser.spi.meta
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / namespace / NamespaceStatementSupport.java
index 9dbbd4b9fb480c66ff10d07f4ad84e50e3e07f2e..8883ae88fae5e041ec06e3feba669c33edcd34dc 100644 (file)
@@ -7,13 +7,20 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.namespace;
 
+import com.google.common.collect.ImmutableList;
 import java.net.URI;
+import java.net.URISyntaxException;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+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.NamespaceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
+import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
 public final class NamespaceStatementSupport
         extends AbstractStatementSupport<URI, NamespaceStatement, NamespaceEffectiveStatement> {
@@ -23,7 +30,7 @@ public final class NamespaceStatementSupport
     private static final NamespaceStatementSupport INSTANCE = new NamespaceStatementSupport();
 
     private NamespaceStatementSupport() {
-        super(YangStmtMapping.NAMESPACE);
+        super(YangStmtMapping.NAMESPACE, StatementPolicy.reject());
     }
 
     public static NamespaceStatementSupport getInstance() {
@@ -32,22 +39,33 @@ public final class NamespaceStatementSupport
 
     @Override
     public URI parseArgumentValue(final StmtContext<?, ?,?> ctx, final String value) {
-        return URI.create(value);
+        try {
+            return new URI(value);
+        } catch (URISyntaxException e) {
+            throw new SourceException(ctx, e, "Invalid namespace \"%s\"", value);
+        }
     }
 
     @Override
-    public NamespaceStatement createDeclared(final StmtContext<URI, NamespaceStatement,?> ctx) {
-        return new NamespaceStatementImpl(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
     }
 
     @Override
-    public NamespaceEffectiveStatement createEffective(
-            final StmtContext<URI, NamespaceStatement, NamespaceEffectiveStatement> ctx) {
-        return new NamespaceEffectiveStatementImpl(ctx);
+    protected NamespaceStatement createDeclared(@NonNull final StmtContext<URI, NamespaceStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularNamespaceStatement(ctx.getArgument(), substatements);
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return SUBSTATEMENT_VALIDATOR;
+    protected NamespaceStatement createEmptyDeclared(final StmtContext<URI, NamespaceStatement, ?> ctx) {
+        return new EmptyNamespaceStatement(ctx.getArgument());
+    }
+
+    @Override
+    protected NamespaceEffectiveStatement createEffective(final Current<URI, NamespaceStatement> stmt,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return substatements.isEmpty() ? new EmptyNamespaceEffectiveStatement(stmt.declared())
+            : new RegularNamespaceEffectiveStatement(stmt.declared(), substatements);
     }
 }
\ No newline at end of file