/* * 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 java.util.List; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.GroupingUtils; import org.opendaylight.yangtools.yang.common.QNameModule; import java.util.Collection; import org.opendaylight.yangtools.yang.common.QName; import com.google.common.base.Preconditions; 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.source.SourceException; class SubstatementContext, E extends EffectiveStatement> extends StatementContextBase { private final StatementContextBase parent; private final A argument; SubstatementContext(StatementContextBase parent,ContextBuilder builder) throws SourceException { //super(builder, builder.getDefinition().parseArgumentValue(parent, builder.getRawArgument())); super(builder); this.parent = Preconditions.checkNotNull(parent, "Parent must not be null"); this.argument = builder.getDefinition().parseArgumentValue(this, builder.getRawArgument()); } SubstatementContext(SubstatementContext original, QNameModule newQNameModule, StatementContextBase newParent) throws SourceException { super(original); this.parent = newParent; if(newQNameModule != null && original.argument instanceof QName) { QName originalQName = (QName) original.argument; this.argument = (A) QName.create(newQNameModule,originalQName.getLocalName()); } else { this.argument = original.argument; } copyDeclaredStmts(original, newQNameModule); copyEffectiveStmts(original, newQNameModule); } private void copyDeclaredStmts(SubstatementContext original, QNameModule newQNameModule) throws SourceException { Collection> originalDeclaredSubstatements = original .declaredSubstatements(); for (StatementContextBase stmtContext : originalDeclaredSubstatements) { if (GroupingUtils.needToCopyByUses(stmtContext)) { StatementContextBase copy = stmtContext .createCopy(newQNameModule,this); this.addEffectiveSubstatement(copy); } else if (GroupingUtils.isReusedByUses(stmtContext)) { this.addEffectiveSubstatement(stmtContext); } } } private void copyEffectiveStmts(SubstatementContext original, QNameModule newQNameModule) throws SourceException { Collection> originalEffectiveSubstatements = original .effectiveSubstatements(); for (StatementContextBase stmtContext : originalEffectiveSubstatements) { if (GroupingUtils.needToCopyByUses(stmtContext)) { StatementContextBase copy = stmtContext .createCopy(newQNameModule,this); this.addEffectiveSubstatement(copy); } else if (GroupingUtils.isReusedByUses(stmtContext)) { this.addEffectiveSubstatement(stmtContext); } } } @Override public StatementContextBase getParentContext() { return parent; } @Override public NamespaceStorageNode getParentNamespaceStorage() { return parent; } @Override public Registry getBehaviourRegistry() { return parent.getBehaviourRegistry(); } @Override public RootStatementContext getRoot() { return parent.getRoot(); } @Override public A getStatementArgument() { return argument; } @Override public StatementContextBase createCopy(QNameModule newQNameModule, StatementContextBase newParent) throws SourceException { return new SubstatementContext<>(this,newQNameModule, newParent); } @Override public List getArgumentsFromRoot() { List argumentsFromRoot = parent.getArgumentsFromRoot(); argumentsFromRoot.add(argument); return argumentsFromRoot; } }