Refactor namespace implementation classes 31/87331/1
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 31 Jan 2020 15:52:15 +0000 (16:52 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 31 Jan 2020 16:20:45 +0000 (17:20 +0100)
Refactor our implementation classes, so that we lower their footprint.
Since we are in the area, also update argument parser so that it reports
illegal names through SourceException.

Change-Id: I88c154cac3b6397434356304ba5af09aee984246
JIRA: YANGTOOLS-1065
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/NamespaceEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/NamespaceStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/namespace/EmptyNamespaceEffectiveStatement.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/namespace/NamespaceEffectiveStatementImpl.java with 62% similarity]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/namespace/EmptyNamespaceStatement.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/namespace/NamespaceStatementImpl.java with 57% similarity]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/namespace/NamespaceStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/namespace/RegularNamespaceEffectiveStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/namespace/RegularNamespaceStatement.java [new file with mode: 0644]

index 327b5699c6c6b03b34cda6bd0cb6d9078031be5f..fbe0101ccc4c011e27727aaf80f21b6ea40f2903 100644 (file)
@@ -9,9 +9,14 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
 import java.net.URI;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 @Beta
 public interface NamespaceEffectiveStatement extends EffectiveStatement<URI, NamespaceStatement> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.NAMESPACE;
+    }
 }
index c7e8d72be7355d314257f1f3e38b862c359d83f5..d94ae36d4a24c50a8765a8ff5a26d3270825977b 100644 (file)
@@ -11,9 +11,16 @@ import static com.google.common.base.Verify.verifyNotNull;
 
 import java.net.URI;
 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.StatementDefinition;
 
 public interface NamespaceStatement extends DeclaredStatement<URI> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.NAMESPACE;
+    }
+
     default @NonNull URI getUri() {
         // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here
         return verifyNotNull(argument());
@@ -10,12 +10,11 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.namespace;
 import java.net.URI;
 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument;
 
-final class NamespaceEffectiveStatementImpl extends DeclaredEffectiveStatementBase<URI, NamespaceStatement>
+final class EmptyNamespaceEffectiveStatement extends DefaultArgument<URI, NamespaceStatement>
         implements NamespaceEffectiveStatement {
-    NamespaceEffectiveStatementImpl(final StmtContext<URI, NamespaceStatement, ?> ctx) {
-        super(ctx);
+    EmptyNamespaceEffectiveStatement(final NamespaceStatement declared) {
+        super(declared);
     }
 }
@@ -9,11 +9,10 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.namespace;
 
 import java.net.URI;
 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.StmtContext;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.ArgumentToString;
 
-final class NamespaceStatementImpl extends AbstractDeclaredStatement<URI> implements NamespaceStatement {
-    NamespaceStatementImpl(final StmtContext<URI, NamespaceStatement,?> context) {
-        super(context);
+final class EmptyNamespaceStatement extends ArgumentToString<URI> implements NamespaceStatement {
+    EmptyNamespaceStatement(final URI argument) {
+        super(argument);
     }
 }
index 9dbbd4b9fb480c66ff10d07f4ad84e50e3e07f2e..c279f1ea96ec932523f57a6ebefe16a7303de021 100644 (file)
@@ -7,16 +7,22 @@
  */
 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.rfc7950.stmt.BaseStatementSupport;
 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> {
+        extends BaseStatementSupport<URI, NamespaceStatement, NamespaceEffectiveStatement> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
         .NAMESPACE)
         .build();
@@ -32,22 +38,40 @@ 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.getStatementSourceReference(), 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.coerceStatementArgument(), substatements);
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return SUBSTATEMENT_VALIDATOR;
+    protected NamespaceStatement createEmptyDeclared(final StmtContext<URI, NamespaceStatement, ?> ctx) {
+        return new EmptyNamespaceStatement(ctx.coerceStatementArgument());
+    }
+
+    @Override
+    protected NamespaceEffectiveStatement createEffective(
+            final StmtContext<URI, NamespaceStatement, NamespaceEffectiveStatement> ctx,
+            final NamespaceStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new RegularNamespaceEffectiveStatement(declared, substatements);
+    }
+
+    @Override
+    protected NamespaceEffectiveStatement createEmptyEffective(
+            final StmtContext<URI, NamespaceStatement, NamespaceEffectiveStatement> ctx,
+            final NamespaceStatement declared) {
+        return new EmptyNamespaceEffectiveStatement(declared);
     }
 }
\ No newline at end of file
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/namespace/RegularNamespaceEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/namespace/RegularNamespaceEffectiveStatement.java
new file mode 100644 (file)
index 0000000..9686fc2
--- /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.rfc7950.stmt.namespace;
+
+import com.google.common.collect.ImmutableList;
+import java.net.URI;
+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.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements;
+
+final class RegularNamespaceEffectiveStatement extends WithSubstatements<URI, NamespaceStatement>
+        implements NamespaceEffectiveStatement {
+    RegularNamespaceEffectiveStatement(final NamespaceStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(declared, substatements);
+    }
+}
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/namespace/RegularNamespaceStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/namespace/RegularNamespaceStatement.java
new file mode 100644 (file)
index 0000000..02fd876
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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.rfc7950.stmt.namespace;
+
+import com.google.common.collect.ImmutableList;
+import java.net.URI;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.ArgumentToString.WithSubstatements;
+
+final class RegularNamespaceStatement extends WithSubstatements<URI> implements NamespaceStatement {
+    RegularNamespaceStatement(final URI argument,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(argument, substatements);
+    }
+}