Optimize path statement implementations 21/91021/1
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Jul 2020 13:42:41 +0000 (15:42 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 8 Jul 2020 17:26:37 +0000 (19:26 +0200)
This migrates 'path' statement support to use denser objects, as
the argument is not affected by any copying around.

JIRA: YANGTOOLS-1065
Change-Id: Idb1281cf54e449db28c63645252a721191ed8de1
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 1a0ce46f2eb59fb07fdaac1d2b8fb14ee09bad68)

yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/PathEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/PathStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/EmptyPathEffectiveStatement.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/PathEffectiveStatementImpl.java with 55% similarity]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/EmptyPathStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/PathStatementImpl.java [deleted file]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/PathStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/RegularPathEffectiveStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/RegularPathStatement.java [new file with mode: 0644]

index 219c5a2400fa2af3ca1df0a33de9f32fe229d64e..269ee561722bd362d95bb4f9061d9169bf1fadcc 100644 (file)
@@ -9,9 +9,14 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.model.api.PathExpression;
+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 PathEffectiveStatement extends EffectiveStatement<PathExpression, PathStatement> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.PATH;
+    }
 }
index 272f7a3d53f9376fb1079ae69ef00a76877b2aa6..bfec882c9ce143f4b717fa01413b49232b181d3d 100644 (file)
@@ -11,9 +11,16 @@ import static com.google.common.base.Verify.verifyNotNull;
 
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.api.PathExpression;
+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 PathStatement extends DeclaredStatement<PathExpression> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.PATH;
+    }
+
     default @NonNull PathExpression getValue() {
         // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here
         return verifyNotNull(argument());
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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,
@@ -10,12 +10,11 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.path;
 import org.opendaylight.yangtools.yang.model.api.PathExpression;
 import org.opendaylight.yangtools.yang.model.api.stmt.PathEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement;
-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 PathEffectiveStatementImpl extends DeclaredEffectiveStatementBase<PathExpression, PathStatement>
+final class EmptyPathEffectiveStatement extends DefaultArgument<PathExpression, PathStatement>
         implements PathEffectiveStatement {
-    PathEffectiveStatementImpl(final StmtContext<PathExpression, PathStatement, ?> ctx) {
-        super(ctx);
+    EmptyPathEffectiveStatement(final PathStatement declared) {
+        super(declared);
     }
-}
\ No newline at end of file
+}
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/EmptyPathStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/EmptyPathStatement.java
new file mode 100644 (file)
index 0000000..8bbb03f
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.path;
+
+import static java.util.Objects.requireNonNull;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.model.api.PathExpression;
+import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement;
+
+class EmptyPathStatement extends AbstractDeclaredStatement<PathExpression> implements PathStatement {
+    private final @NonNull PathExpression argument;
+
+    EmptyPathStatement(final PathExpression argument) {
+        this.argument = requireNonNull(argument);
+    }
+
+    @Override
+    public final PathExpression argument() {
+        return argument;
+    }
+
+    @Override
+    public final String rawArgument() {
+        return argument.getOriginalString();
+    }
+}
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/PathStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/PathStatementImpl.java
deleted file mode 100644 (file)
index 9e6be68..0000000
+++ /dev/null
@@ -1,19 +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.path;
-
-import org.opendaylight.yangtools.yang.model.api.PathExpression;
-import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-
-final class PathStatementImpl extends AbstractDeclaredStatement<PathExpression> implements PathStatement {
-    PathStatementImpl(final StmtContext<PathExpression, PathStatement, ?> context) {
-        super(context);
-    }
-}
index 7928662f0e29c3885f3d7a2596717ef95fe1bdb3..d6f2b7c2ce02de5757c821ceca826bf3b86084b3 100644 (file)
@@ -9,16 +9,19 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.path;
 
 import static java.util.Objects.requireNonNull;
 
+import com.google.common.collect.ImmutableList;
 import org.opendaylight.yangtools.yang.model.api.PathExpression;
 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.PathStatement;
-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;
 
 public final class PathStatementSupport
-        extends AbstractStatementSupport<PathExpression, PathStatement, PathEffectiveStatement> {
+        extends BaseStatementSupport<PathExpression, PathStatement, PathEffectiveStatement> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(
         YangStmtMapping.PATH).build();
     private static final PathStatementSupport LENIENT_INSTANCE = new PathStatementSupport(
@@ -47,18 +50,32 @@ public final class PathStatementSupport
     }
 
     @Override
-    public PathStatement createDeclared(final StmtContext<PathExpression, PathStatement, ?> ctx) {
-        return new PathStatementImpl(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
     }
 
     @Override
-    public PathEffectiveStatement createEffective(
-            final StmtContext<PathExpression, PathStatement, PathEffectiveStatement> ctx) {
-        return new PathEffectiveStatementImpl(ctx);
+    protected PathStatement createDeclared(final StmtContext<PathExpression, PathStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularPathStatement(ctx.coerceStatementArgument(), substatements);
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return SUBSTATEMENT_VALIDATOR;
+    protected PathStatement createEmptyDeclared(final StmtContext<PathExpression, PathStatement, ?> ctx) {
+        return new EmptyPathStatement(ctx.coerceStatementArgument());
+    }
+
+    @Override
+    protected PathEffectiveStatement createEffective(
+            final StmtContext<PathExpression, PathStatement, PathEffectiveStatement> ctx,
+            final PathStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new RegularPathEffectiveStatement(declared, substatements);
+    }
+
+    @Override
+    protected PathEffectiveStatement createEmptyEffective(
+            final StmtContext<PathExpression, PathStatement, PathEffectiveStatement> ctx,
+            final PathStatement declared) {
+        return new EmptyPathEffectiveStatement(declared);
     }
 }
\ No newline at end of file
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/RegularPathEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/RegularPathEffectiveStatement.java
new file mode 100644 (file)
index 0000000..acaf092
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.path;
+
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.model.api.PathExpression;
+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.PathStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements;
+
+final class RegularPathEffectiveStatement extends WithSubstatements<PathExpression, PathStatement>
+        implements PathEffectiveStatement {
+    RegularPathEffectiveStatement(final PathStatement 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/path/RegularPathStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/path/RegularPathStatement.java
new file mode 100644 (file)
index 0000000..183755f
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.path;
+
+import com.google.common.collect.ImmutableList;
+import java.util.Collection;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.model.api.PathExpression;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+
+final class RegularPathStatement extends EmptyPathStatement {
+    private final @NonNull Object substatements;
+
+    RegularPathStatement(final PathExpression argument,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(argument);
+        this.substatements = maskList(substatements);
+    }
+
+    @Override
+    public Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
+        return unmaskList(substatements);
+    }
+}