Do not use RecursiveObjectLeaker 24/95024/5
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 4 Feb 2021 10:21:44 +0000 (11:21 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 5 Feb 2021 08:21:01 +0000 (09:21 +0100)
Since unrecognized extension statements are not built into their
effective form, we no longer encounter a recursive attempt to build
ExtensionEffectiveStatement. Remove use of RecursiveObjectLeaker.

JIRA: YANGTOOLS-1196
Change-Id: I8d3714f225c1eb628131ac7ebe5588ccf94d1897
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
common/util/src/main/java/org/opendaylight/yangtools/util/RecursiveObjectLeaker.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ExtensionEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ExtensionStatementSupport.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractStatementSupport.java

index 0c3cd1df311b60f0ef5a4c3a4ab41acb30aff6e1..14ede64cd5565d8d7ac66845eaedf3d14f5b10d5 100644 (file)
@@ -42,8 +42,11 @@ import org.slf4j.LoggerFactory;
  * IT IS PROBABLY YOUR FAULT AND YOU ARE ON YOUR OWN.
  *
  * @author Robert Varga
+ * @deprecated This class is not used anywhere anymore and is scheduled for removal in the next major release.
  */
 @Beta
+@Deprecated(forRemoval = true)
+// FIXME: 8.0.0: remove this class
 public final class RecursiveObjectLeaker {
     // Logging note. Only keys passed can be logged, as objects beng resolved may not be properly constructed.
     private static final Logger LOG = LoggerFactory.getLogger(RecursiveObjectLeaker.class);
index 76a14b758f5fd05c4b252fa722d1aef807d153fc..52305947b8585021f60c49670181f566d06b941d 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension;
 
-import static com.google.common.base.Verify.verify;
 import static com.google.common.base.Verify.verifyNotNull;
 
 import com.google.common.collect.ImmutableList;
@@ -65,11 +64,12 @@ final class ExtensionEffectiveStatementImpl extends DefaultArgument<QName, Exten
     private static final RecursionDetector TOSTRING_DETECTOR = new RecursionDetector();
 
     private final @Nullable SchemaPath path;
+    private final Object substatements;
 
-    private volatile Object substatements;
-
-    ExtensionEffectiveStatementImpl(final ExtensionStatement declared, final SchemaPath path) {
+    ExtensionEffectiveStatementImpl(final ExtensionStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final SchemaPath path) {
         super(declared);
+        this.substatements = maskList(substatements);
         this.path = path;
     }
 
@@ -134,11 +134,6 @@ final class ExtensionEffectiveStatementImpl extends DefaultArgument<QName, Exten
         }
     }
 
-    void setSubstatements(final ImmutableList<? extends EffectiveStatement<?, ?>> newSubstatements) {
-        verify(substatements == null, "Substatements already initialized");
-        substatements = maskList(newSubstatements);
-    }
-
     private String recursedToString() {
         return ExtensionEffectiveStatementImpl.class.getSimpleName() + "["
                 + "argument=" + getArgument()
index 66c995bf30e57aee3078c7f1b9e0a796af0e09f6..d8f7d68811e07877a97569ab25be7b5af0454fde 100644 (file)
@@ -7,13 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension;
 
-import static com.google.common.base.Verify.verify;
-import static com.google.common.base.Verify.verifyNotNull;
-
 import com.google.common.collect.ImmutableList;
-import java.util.IdentityHashMap;
-import java.util.Map;
-import java.util.stream.Stream;
 import org.opendaylight.yangtools.openconfig.model.api.OpenConfigStatements;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
@@ -42,8 +36,6 @@ public final class ExtensionStatementSupport
         .addOptional(YangStmtMapping.STATUS)
         .build();
     private static final ExtensionStatementSupport INSTANCE = new ExtensionStatementSupport();
-    private static final ThreadLocal<Map<Current<?, ?>, ExtensionEffectiveStatementImpl>> TL_BUILDERS =
-            new ThreadLocal<>();
 
     private ExtensionStatementSupport() {
         super(YangStmtMapping.EXTENSION, StatementPolicy.reject());
@@ -96,44 +88,9 @@ public final class ExtensionStatementSupport
         return new EmptyExtensionStatement(ctx.getArgument());
     }
 
-    @Override
-    public ExtensionEffectiveStatement createEffective(final Current<QName, ExtensionStatement> stmt,
-            final Stream<? extends StmtContext<?, ?, ?>> declaredSubstatements,
-            final Stream<? extends StmtContext<?, ?, ?>> inferredSubstatements) {
-        Map<Current<?, ?>, ExtensionEffectiveStatementImpl> tl = TL_BUILDERS.get();
-        if (tl == null) {
-            tl = new IdentityHashMap<>();
-            TL_BUILDERS.set(tl);
-        }
-
-        final ExtensionEffectiveStatementImpl existing = tl.get(stmt);
-        if (existing != null) {
-            // Implies non-empty map, no cleanup necessary
-            return existing;
-        }
-
-        try {
-            final ExtensionEffectiveStatementImpl created = new ExtensionEffectiveStatementImpl(stmt.declared(),
-                stmt.optionalPath());
-            verify(tl.put(stmt, created) == null);
-            try {
-                return super.createEffective(stmt, declaredSubstatements, inferredSubstatements);
-            } finally {
-                verify(tl.remove(stmt) == created);
-            }
-        } finally {
-            if (tl.isEmpty()) {
-                TL_BUILDERS.remove();
-            }
-        }
-    }
-
     @Override
     protected ExtensionEffectiveStatement createEffective(final Current<QName, ExtensionStatement> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
-        final ExtensionEffectiveStatementImpl ret = verifyNotNull(verifyNotNull(TL_BUILDERS.get(),
-            "Statement build state not initialized").get(stmt), "No build state found for %s", stmt);
-        ret.setSubstatements(substatements);
-        return ret;
+        return new ExtensionEffectiveStatementImpl(stmt.declared(), substatements, stmt.optionalPath());
     }
 }
\ No newline at end of file
index 74dd85f4aa1f89d0e6fabb6c36c1752938e181be..c3ed5edfcbf82224b4667ca417a017d0ec9ef9d2 100644 (file)
@@ -52,7 +52,7 @@ public abstract class AbstractStatementSupport<A, D extends DeclaredStatement<A>
     protected abstract @NonNull D createEmptyDeclared(@NonNull StmtContext<A, D, ?> ctx);
 
     @Override
-    public E createEffective(final Current<A, D> stmt,
+    public final E createEffective(final Current<A, D> stmt,
             final Stream<? extends StmtContext<?, ?, ?>> declaredSubstatements,
             final Stream<? extends StmtContext<?, ?, ?>> inferredSubstatements) {
         final ImmutableList<? extends EffectiveStatement<?, ?>> substatements =