/* * 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.stmt.rfc6020.effective; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.DerivedIdentitiesNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.MutableStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; public final class IdentityEffectiveStatementImpl extends AbstractEffectiveSchemaNode<IdentityStatement> implements IdentitySchemaNode, MutableStatement { private final Set<IdentitySchemaNode> derivedIdentities; private IdentitySchemaNode baseIdentity; private Set<IdentitySchemaNode> baseIdentities; private boolean sealed; public IdentityEffectiveStatementImpl( final StmtContext<QName, IdentityStatement, EffectiveStatement<QName, IdentityStatement>> ctx) { super(ctx); this.baseIdentities = new HashSet<>(); ((StmtContext.Mutable<?, ?, ?>) ctx).addMutableStmtToSeal(this); // initDerivedIdentities final Set<IdentitySchemaNode> derivedIdentitiesInit = new HashSet<>(); final List<StmtContext<?, ?, ?>> derivedIdentitiesCtxList = ctx.getFromNamespace( DerivedIdentitiesNamespace.class, ctx.getStatementArgument()); if (derivedIdentitiesCtxList == null) { this.derivedIdentities = ImmutableSet.of(); return; } for (final StmtContext<?, ?, ?> derivedIdentityCtx : derivedIdentitiesCtxList) { final IdentityEffectiveStatementImpl derivedIdentity = (IdentityEffectiveStatementImpl) derivedIdentityCtx .buildEffective(); derivedIdentity.addBaseIdentity(this); derivedIdentitiesInit.add(derivedIdentity); } this.derivedIdentities = ImmutableSet.copyOf(derivedIdentitiesInit); } private void addBaseIdentity(final IdentityEffectiveStatementImpl baseIdentity) { Preconditions.checkState(!sealed, "Attempt to modify sealed identity effective statement %s", getQName()); this.baseIdentity = baseIdentity; this.baseIdentities.add(baseIdentity); } @Override public IdentitySchemaNode getBaseIdentity() { Preconditions.checkState(sealed, "Attempt to get base identity from unsealed identity effective statement %s", getQName()); return baseIdentity; } @Nonnull @Override public Set<IdentitySchemaNode> getBaseIdentities() { Preconditions.checkState(sealed, "Attempt to get base identities from unsealed identity effective statement %s", getQName()); return baseIdentities; } @Override public Set<IdentitySchemaNode> getDerivedIdentities() { return Collections.unmodifiableSet(derivedIdentities); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + Objects.hashCode(getQName()); result = prime * result + Objects.hashCode(getPath()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final IdentityEffectiveStatementImpl other = (IdentityEffectiveStatementImpl) obj; return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath()); } @Override public String toString() { return MoreObjects.toStringHelper(this).add("qname", getQName()).add("path", getPath()).toString(); } @Override public void seal() { if (!sealed) { baseIdentities = ImmutableSet.copyOf(baseIdentities); sealed = true; } } }