BUG-6972: Consolidate copy operations 30/47530/2
authorRobert Varga <rovarga@cisco.com>
Fri, 21 Oct 2016 15:10:54 +0000 (17:10 +0200)
committerAnil Belur <abelur@linuxfoundation.org>
Sun, 30 Oct 2016 11:41:46 +0000 (11:41 +0000)
This patch moves common code into a 'copy statement' utility
method, making sure we have do not leak it.

Change-Id: Iba205a6019977c3e6c30762dfb1407b13ec7cf37
Signed-off-by: Robert Varga <rovarga@cisco.com>
(cherry picked from commit a597ca7887ffa4b0fc9a5914cb9eeb47263c9251)

yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/GroupingUtils.java

index 6d369e6b6f50840da796725889ad195ba5ed8b6b..ff31de4747534fcca2b1bdddbce4203fcbddfe9b 100644 (file)
@@ -35,9 +35,12 @@ import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNa
 import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace.ValidationBundleType;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.GroupingUtils;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>> extends
         StatementContextBase<A, D, E> {
+    private static final Logger LOG = LoggerFactory.getLogger(SubstatementContext.class);
 
     private final StatementContextBase<?, ?, ?> parent;
     private final A argument;
@@ -71,37 +74,6 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
         }
     }
 
-    private void copyDeclaredStmts(final SubstatementContext<A, D, E> original, final QNameModule newQNameModule,
-            final CopyType typeOfCopy) {
-        final Collection<? extends StatementContextBase<?, ?, ?>> originalDeclaredSubstatements = original
-                .declaredSubstatements();
-        for (final StatementContextBase<?, ?, ?> stmtContext : originalDeclaredSubstatements) {
-            if (!StmtContextUtils.areFeaturesSupported(stmtContext)) {
-                continue;
-            }
-            if (GroupingUtils.needToCopyByUses(stmtContext)) {
-                final StatementContextBase<?, ?, ?> copy = stmtContext.createCopy(newQNameModule, this, typeOfCopy);
-                this.addEffectiveSubstatement(copy);
-            } else if (GroupingUtils.isReusedByUses(stmtContext)) {
-                this.addEffectiveSubstatement(stmtContext);
-            }
-        }
-    }
-
-    private void copyEffectiveStmts(final SubstatementContext<A, D, E> original, final QNameModule newQNameModule,
-            final CopyType typeOfCopy) {
-        final Collection<? extends StatementContextBase<?, ?, ?>> originalEffectiveSubstatements = original
-                .effectiveSubstatements();
-        for (final StatementContextBase<?, ?, ?> stmtContext : originalEffectiveSubstatements) {
-            if (GroupingUtils.needToCopyByUses(stmtContext)) {
-                final StatementContextBase<?, ?, ?> copy = stmtContext.createCopy(newQNameModule, this, typeOfCopy);
-                this.addEffectiveSubstatement(copy);
-            } else if (GroupingUtils.isReusedByUses(stmtContext)) {
-                this.addEffectiveSubstatement(stmtContext);
-            }
-        }
-    }
-
     @Override
     public StatementContextBase<?, ?, ?> getParentContext() {
         return parent;
@@ -153,6 +125,36 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
         return copy;
     }
 
+    private void copySubstatement(final StatementContextBase<?, ?, ?> stmtContext,
+            final QNameModule newQNameModule, final CopyType typeOfCopy) {
+        if (GroupingUtils.needToCopyByUses(stmtContext)) {
+            final StatementContextBase<?, ?, ?> copy = stmtContext.createCopy(newQNameModule, this, typeOfCopy);
+            LOG.debug("Copying substatement {} for {} as", stmtContext, this, copy);
+            this.addEffectiveSubstatement(copy);
+        } else if (GroupingUtils.isReusedByUses(stmtContext)) {
+            LOG.debug("Reusing substatement {} for {}", stmtContext, this);
+            this.addEffectiveSubstatement(stmtContext);
+        } else {
+            LOG.debug("Skipping statement {}", stmtContext);
+        }
+    }
+
+    private void copyDeclaredStmts(final SubstatementContext<A, D, E> original, final QNameModule newQNameModule,
+            final CopyType typeOfCopy) {
+        for (final StatementContextBase<?, ?, ?> stmtContext : original.declaredSubstatements()) {
+            if (StmtContextUtils.areFeaturesSupported(stmtContext)) {
+                copySubstatement(stmtContext, newQNameModule, typeOfCopy);
+            }
+        }
+    }
+
+    private void copyEffectiveStmts(final SubstatementContext<A, D, E> original, final QNameModule newQNameModule,
+            final CopyType typeOfCopy) {
+        for (final StatementContextBase<?, ?, ?> stmtContext : original.effectiveSubstatements()) {
+            copySubstatement(stmtContext, newQNameModule, typeOfCopy);
+        }
+    }
+
     private boolean isSupportedAsShorthandCase() {
         final Collection<?> supportedCaseShorthands = getFromNamespace(ValidationBundlesNamespace.class,
                 ValidationBundleType.SUPPORTED_CASE_SHORTHANDS);
index 5c7954526e8ea4df4817614f9579d0e620677a30..1cc2679d1dbad7d25154073337d9d5de5047af97 100644 (file)
@@ -54,44 +54,29 @@ public final class GroupingUtils {
             final StmtContext.Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode) {
 
         final QNameModule newQNameModule = getNewQNameModule(targetCtx, sourceGrpStmtCtx);
-        copyDeclaredStmts(sourceGrpStmtCtx, targetCtx, usesNode, newQNameModule);
-        copyEffectiveStmts(sourceGrpStmtCtx, targetCtx, usesNode, newQNameModule);
-    }
-
-    public static void copyDeclaredStmts(final StatementContextBase<?, ?, ?> sourceGrpStmtCtx,
-            final StatementContextBase<?, ?, ?> targetCtx,
-            final StmtContext.Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode,
-            final QNameModule newQNameModule) {
-        for (final StatementContextBase<?, ?, ?> originalStmtCtx : sourceGrpStmtCtx.declaredSubstatements()) {
-            if (!StmtContextUtils.areFeaturesSupported(originalStmtCtx)) {
-                continue;
-            }
-            if (needToCopyByUses(originalStmtCtx)) {
-                final StatementContextBase<?, ?, ?> copy = originalStmtCtx.createCopy(newQNameModule, targetCtx,
-                        CopyType.ADDED_BY_USES);
-                targetCtx.addEffectiveSubstatement(copy);
-                usesNode.addAsEffectOfStatement(copy);
-            } else if (isReusedByUsesOnTop(originalStmtCtx)) {
-                targetCtx.addEffectiveSubstatement(originalStmtCtx);
-                usesNode.addAsEffectOfStatement(originalStmtCtx);
+        for (final StatementContextBase<?, ?, ?> original : sourceGrpStmtCtx.declaredSubstatements()) {
+            if (StmtContextUtils.areFeaturesSupported(original)) {
+                copyStatement(original, targetCtx, usesNode, newQNameModule);
             }
         }
+
+        for (final StatementContextBase<?, ?, ?> original : sourceGrpStmtCtx.effectiveSubstatements()) {
+            copyStatement(original, targetCtx, usesNode, newQNameModule);
+        }
     }
 
-    public static void copyEffectiveStmts(final StatementContextBase<?, ?, ?> sourceGrpStmtCtx,
+    private static void copyStatement(final StatementContextBase<?, ?, ?> original,
             final StatementContextBase<?, ?, ?> targetCtx,
-            final StmtContext.Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode,
-            final QNameModule newQNameModule) {
-        for (final StatementContextBase<?, ?, ?> originalStmtCtx : sourceGrpStmtCtx.effectiveSubstatements()) {
-            if (needToCopyByUses(originalStmtCtx)) {
-                final StatementContextBase<?, ?, ?> copy = originalStmtCtx.createCopy(newQNameModule, targetCtx,
-                        CopyType.ADDED_BY_USES);
-                targetCtx.addEffectiveSubstatement(copy);
-                usesNode.addAsEffectOfStatement(copy);
-            } else if (isReusedByUsesOnTop(originalStmtCtx)) {
-                targetCtx.addEffectiveSubstatement(originalStmtCtx);
-                usesNode.addAsEffectOfStatement(originalStmtCtx);
-            }
+            final StmtContext.Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> targetUses,
+            final QNameModule targetModule) {
+        if (needToCopyByUses(original)) {
+            final StatementContextBase<?, ?, ?> copy = original.createCopy(targetModule, targetCtx,
+                    CopyType.ADDED_BY_USES);
+            targetCtx.addEffectiveSubstatement(copy);
+            targetUses.addAsEffectOfStatement(copy);
+        } else if (isReusedByUsesOnTop(original)) {
+            targetCtx.addEffectiveSubstatement(original);
+            targetUses.addAsEffectOfStatement(original);
         }
     }