import com.google.common.annotations.Beta;
import com.google.common.collect.ImmutableSet;
-import org.eclipse.jdt.annotation.NonNull;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.MustConstraintAware;
import org.opendaylight.yangtools.yang.model.api.MustDefinition;
@Beta
public abstract class AbstractEffectiveMustConstraintAwareDataSchemaNode<D extends DeclaredStatement<QName>>
extends AbstractEffectiveDataSchemaNode<D> implements MustConstraintAware {
- private final @NonNull ImmutableSet<MustDefinition> mustConstraints;
+ private static final VarHandle MUST_CONSTRAINTS;
+
+ static {
+ try {
+ MUST_CONSTRAINTS = MethodHandles.lookup().findVarHandle(
+ AbstractEffectiveMustConstraintAwareDataSchemaNode.class, "mustConstraints", ImmutableSet.class);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ throw new ExceptionInInitializerError(e);
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private volatile ImmutableSet<MustDefinition> mustConstraints;
protected AbstractEffectiveMustConstraintAwareDataSchemaNode(final StmtContext<QName, D, ?> ctx) {
super(ctx);
- mustConstraints = ImmutableSet.copyOf(allSubstatementsOfType(MustDefinition.class));
}
@Override
public final ImmutableSet<MustDefinition> getMustConstraints() {
- return mustConstraints;
+ return derivedSet(MUST_CONSTRAINTS, MustDefinition.class);
}
}
import com.google.common.annotations.Beta;
import com.google.common.collect.ImmutableSet;
-import org.eclipse.jdt.annotation.NonNull;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.MustConstraintAware;
import org.opendaylight.yangtools.yang.model.api.MustDefinition;
@Beta
public abstract class AbstractEffectiveMustConstraintAwareSimpleDataNodeContainer<D extends DeclaredStatement<QName>>
extends AbstractEffectiveSimpleDataNodeContainer<D> implements MustConstraintAware {
- private final @NonNull ImmutableSet<MustDefinition> mustConstraints;
+ private static final VarHandle MUST_CONSTRAINTS;
+
+ static {
+ try {
+ MUST_CONSTRAINTS = MethodHandles.lookup().findVarHandle(
+ AbstractEffectiveMustConstraintAwareSimpleDataNodeContainer.class, "mustConstraints",
+ ImmutableSet.class);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ throw new ExceptionInInitializerError(e);
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private volatile ImmutableSet<MustDefinition> mustConstraints;
protected AbstractEffectiveMustConstraintAwareSimpleDataNodeContainer(final StmtContext<QName, D, ?> ctx) {
super(ctx);
- mustConstraints = ImmutableSet.copyOf(allSubstatementsOfType(MustDefinition.class));
}
@Override
public final ImmutableSet<MustDefinition> getMustConstraints() {
- return mustConstraints;
+ return derivedSet(MUST_CONSTRAINTS, MustDefinition.class);
}
}
import com.google.common.annotations.Beta;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import java.lang.invoke.VarHandle;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
return super.getNamespaceContents(namespace);
}
+ protected final <T> @NonNull ImmutableSet<T> derivedSet(final VarHandle vh, final @NonNull Class<T> clazz) {
+ final ImmutableSet<T> existing = (ImmutableSet<T>) vh.getAcquire(this);
+ return existing != null ? existing : loadSet(vh, clazz);
+ }
+
+ @SuppressWarnings("unchecked")
+ private <T> @NonNull ImmutableSet<T> loadSet(final VarHandle vh, final @NonNull Class<T> clazz) {
+ final ImmutableSet<T> computed = ImmutableSet.copyOf(allSubstatementsOfType(clazz));
+ final Object witness = vh.compareAndExchangeRelease(this, null, computed);
+ return witness == null ? computed : (ImmutableSet<T>) witness;
+ }
+
private static <T extends SchemaTreeEffectiveStatement<?>> void putChild(final Map<QName, T> map,
final T child, final StatementSourceReference ref, final String tree) {
final QName id = child.getIdentifier();
package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.notification;
import com.google.common.collect.ImmutableSet;
-import java.util.Collection;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
final class NotificationEffectiveStatementImpl
extends AbstractEffectiveDocumentedDataNodeContainer<QName, NotificationStatement>
implements NotificationDefinition, NotificationEffectiveStatement {
+ private static final VarHandle MUST_CONSTRAINTS;
+
+ static {
+ try {
+ MUST_CONSTRAINTS = MethodHandles.lookup().findVarHandle(
+ NotificationEffectiveStatementImpl.class, "mustConstraints", ImmutableSet.class);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ throw new ExceptionInInitializerError(e);
+ }
+ }
+
private final @NonNull QName qname;
private final @NonNull SchemaPath path;
private final ImmutableSet<AugmentationSchemaNode> augmentations;
private final boolean augmenting;
private final boolean addedByUses;
- private final ImmutableSet<MustDefinition> mustConstraints;
+
+ @SuppressWarnings("unused")
+ private volatile ImmutableSet<MustDefinition> mustConstraints;
NotificationEffectiveStatementImpl(
final StmtContext<QName, NotificationStatement, EffectiveStatement<QName, NotificationStatement>> ctx) {
}
}
this.augmentations = ImmutableSet.copyOf(augmentationsInit);
- this.mustConstraints = ImmutableSet.copyOf(this.allSubstatementsOfType(MustDefinition.class));
// initCopyType
final CopyHistory copyTypesFromOriginal = ctx.getCopyHistory();
}
@Override
- public Collection<MustDefinition> getMustConstraints() {
- return mustConstraints;
+ public ImmutableSet<MustDefinition> getMustConstraints() {
+ return derivedSet(MUST_CONSTRAINTS, MustDefinition.class);
}
@Override