Migrate LeafrefSpecificationSupport 02/90902/3
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Jul 2020 21:56:30 +0000 (23:56 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Jul 2020 22:31:55 +0000 (00:31 +0200)
LeafrefSpecificationSupport can use memory-efficient representation
through BaseStatementSupport. Furthermore we can reuse
TypeEffectiveStatementImpl instead of brewing a separate effective
implementation.

JIRA: YANGTOOLS-1065
Change-Id: I735563730e8c382b49ea01fccc00191ffcfdfb14
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractLeafrefSpecificationSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationEffectiveStatement.java [deleted file]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationImpl.java

index 52649adee70ee535d47352e89a0a1fd180b777ee..a889aac7e10ad3f17fb2438c263fbf350c42adff 100644 (file)
@@ -7,15 +7,21 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type;
 
+import com.google.common.collect.ImmutableList;
 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.PathEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.LeafrefSpecification;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.model.util.type.BaseTypes;
+import org.opendaylight.yangtools.yang.model.util.type.LeafrefTypeBuilder;
+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.source.SourceException;
 
 abstract class AbstractLeafrefSpecificationSupport
-        extends
-        AbstractStatementSupport<String, LeafrefSpecification, EffectiveStatement<String, LeafrefSpecification>> {
+        extends BaseStatementSupport<String, LeafrefSpecification, EffectiveStatement<String, LeafrefSpecification>> {
     AbstractLeafrefSpecificationSupport() {
         super(YangStmtMapping.TYPE);
     }
@@ -26,13 +32,48 @@ abstract class AbstractLeafrefSpecificationSupport
     }
 
     @Override
-    public final LeafrefSpecification createDeclared(final StmtContext<String, LeafrefSpecification, ?> ctx) {
-        return new LeafrefSpecificationImpl(ctx);
+    protected final LeafrefSpecification createDeclared(final StmtContext<String, LeafrefSpecification, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new LeafrefSpecificationImpl(ctx, substatements);
     }
 
     @Override
-    public final EffectiveStatement<String, LeafrefSpecification> createEffective(
-            final StmtContext<String, LeafrefSpecification, EffectiveStatement<String, LeafrefSpecification>> ctx) {
-        return new LeafrefSpecificationEffectiveStatement(ctx);
+    protected final LeafrefSpecification createEmptyDeclared(final StmtContext<String, LeafrefSpecification, ?> ctx) {
+        throw noPath(ctx);
+    }
+
+    @Override
+    protected final EffectiveStatement<String, LeafrefSpecification> createEffective(
+            final StmtContext<String, LeafrefSpecification, EffectiveStatement<String, LeafrefSpecification>> ctx,
+            final LeafrefSpecification declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        final LeafrefTypeBuilder builder = BaseTypes.leafrefTypeBuilder(ctx.getSchemaPath().get());
+
+        for (final EffectiveStatement<?, ?> stmt : substatements) {
+            if (stmt instanceof PathEffectiveStatement) {
+                builder.setPathStatement(((PathEffectiveStatement) stmt).argument());
+            } else if (stmt instanceof RequireInstanceEffectiveStatement) {
+                builder.setRequireInstance(((RequireInstanceEffectiveStatement)stmt).argument());
+            }
+        }
+
+        return new TypeEffectiveStatementImpl<>(declared, substatements, builder);
+    }
+
+    @Override
+    protected final EffectiveStatement<String, LeafrefSpecification> createEmptyEffective(
+            final StmtContext<String, LeafrefSpecification, EffectiveStatement<String, LeafrefSpecification>> ctx,
+            final LeafrefSpecification declared) {
+        throw noPath(ctx);
+    }
+
+    private static SourceException noPath(final StmtContext<?, ?, ?> ctx) {
+        /*
+         *  https://tools.ietf.org/html/rfc7950#section-9.12
+         *
+         *     When the type is "union", the "type" statement (Section 7.4) MUST be
+         *     present.
+         */
+        return new SourceException("A path statement has to be present", ctx.getStatementSourceReference());
     }
 }
\ No newline at end of file
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationEffectiveStatement.java
deleted file mode 100644 (file)
index 14f65eb..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.type;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.PathEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.LeafrefSpecification;
-import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
-import org.opendaylight.yangtools.yang.model.util.type.BaseTypes;
-import org.opendaylight.yangtools.yang.model.util.type.LeafrefTypeBuilder;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-
-final class LeafrefSpecificationEffectiveStatement
-        extends DeclaredEffectiveStatementBase<String, LeafrefSpecification>
-        implements TypeEffectiveStatement<LeafrefSpecification> {
-    private final @NonNull LeafrefTypeDefinition typeDefinition;
-
-    LeafrefSpecificationEffectiveStatement(final StmtContext<String, LeafrefSpecification,
-            EffectiveStatement<String, LeafrefSpecification>> ctx) {
-        super(ctx);
-
-        final LeafrefTypeBuilder builder = BaseTypes.leafrefTypeBuilder(ctx.getSchemaPath().get());
-
-        for (final EffectiveStatement<?, ?> stmt : effectiveSubstatements()) {
-            if (stmt instanceof PathEffectiveStatement) {
-                builder.setPathStatement(((PathEffectiveStatement) stmt).argument());
-            } else if (stmt instanceof RequireInstanceEffectiveStatement) {
-                builder.setRequireInstance(((RequireInstanceEffectiveStatement)stmt).argument());
-            } else if (stmt instanceof UnknownSchemaNode) {
-                builder.addUnknownSchemaNode((UnknownSchemaNode)stmt);
-            }
-        }
-
-        typeDefinition = builder.build();
-    }
-
-    @Override
-    public LeafrefTypeDefinition getTypeDefinition() {
-        return typeDefinition;
-    }
-}
index 27dd08fa5e91fdc27eaee468e7c5c6f1172baea4..557a710626c0a66522591419079161e2af7e5202 100644 (file)
@@ -7,12 +7,15 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type;
 
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.LeafrefSpecification;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class LeafrefSpecificationImpl extends AbstractDeclaredStatement<String> implements LeafrefSpecification {
-    LeafrefSpecificationImpl(final StmtContext<String, LeafrefSpecification, ?> context) {
-        super(context);
+final class LeafrefSpecificationImpl extends WithSubstatements implements LeafrefSpecification {
+    LeafrefSpecificationImpl(final StmtContext<String, ?, ?> context,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(context, substatements);
     }
 }