/* * 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.reactor; import com.google.common.base.Optional; import java.util.Collection; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.StorageNodeType; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; /** * root statement class for a Yang source */ public class RootStatementContext, E extends EffectiveStatement> extends StatementContextBase { private final SourceSpecificContext sourceContext; private final A argument; RootStatementContext(final ContextBuilder builder, final SourceSpecificContext sourceContext) throws SourceException { super(builder); this.sourceContext = sourceContext; this.argument = builder.getDefinition().parseArgumentValue(this, builder.getRawArgument()); } RootStatementContext(final RootStatementContext original, final QNameModule newQNameModule, final TypeOfCopy typeOfCopy) throws SourceException { super(original); sourceContext = original.sourceContext; this.argument = original.argument; copyDeclaredStmts(original, newQNameModule, typeOfCopy); copyEffectiveStmts(original, newQNameModule, typeOfCopy); } /** * copies declared statements from original to this' substatements * * @param typeOfCopy * determines whether copy is used by augmentation or uses * @throws SourceException */ private void copyDeclaredStmts(final RootStatementContext original, final QNameModule newQNameModule, final TypeOfCopy typeOfCopy) throws SourceException { Collection> originalDeclaredSubstatements = original.declaredSubstatements(); for (StmtContext stmtContext : originalDeclaredSubstatements) { this.addEffectiveSubstatement(stmtContext.createCopy(newQNameModule, this, typeOfCopy)); } } /** * copies effective statements from original to this' substatements * * @param typeOfCopy * determines whether copy is used by augmentation or uses * @throws SourceException */ private void copyEffectiveStmts(final RootStatementContext original, final QNameModule newQNameModule, final TypeOfCopy typeOfCopy) throws SourceException { Collection> originalEffectiveSubstatements = original.effectiveSubstatements(); for (StmtContext stmtContext : originalEffectiveSubstatements) { this.addEffectiveSubstatement(stmtContext.createCopy(newQNameModule, this, typeOfCopy)); } } /** * @return null as root cannot have parent */ @Override public StatementContextBase getParentContext() { return null; } /** * @return namespace storage of source context */ @Override public NamespaceStorageNode getParentNamespaceStorage() { return sourceContext; } /** * @return registry of source context */ @Override public Registry getBehaviourRegistry() { return sourceContext; } @Override public StorageNodeType getStorageNodeType() { return StorageNodeType.ROOT_STATEMENT_LOCAL; } /** * @return this as its own root */ @Override public RootStatementContext getRoot() { return this; } SourceSpecificContext getSourceContext() { return sourceContext; } @Override public A getStatementArgument() { return argument; } /** * @return copy of this considering {@link TypeOfCopy} (augment, uses) * * @throws SourceException instance of SourceException */ @Override public StatementContextBase createCopy(final StatementContextBase newParent, final TypeOfCopy typeOfCopy) throws SourceException { return createCopy(null, newParent, typeOfCopy); } /** * @return copy of this considering {@link TypeOfCopy} (augment, uses) * * @throws SourceException instance of SourceException */ @Override public StatementContextBase createCopy(final QNameModule newQNameModule, final StatementContextBase newParent, final TypeOfCopy typeOfCopy) throws SourceException { RootStatementContext copy = new RootStatementContext<>(this, newQNameModule, typeOfCopy); copy.addAllToCopyHistory(this.getCopyHistory()); copy.addToCopyHistory(typeOfCopy); if(this.getOriginalCtx() != null) { copy.setOriginalCtx(this.getOriginalCtx()); } else { copy.setOriginalCtx(this); } definition().onStatementAdded(copy); return copy; } @Override public Optional getSchemaPath() { return Optional.of(SchemaPath.ROOT); } /** * @return true */ @Override public boolean isRootContext() { return true; } @Override public boolean isConfiguration() { return true; } }