/** * Copy statements from a grouping to a target node. * * @param sourceGrpStmtCtx * source grouping statement context * @param targetCtx * target context * @param usesNode * uses node * @throws SourceException * instance of SourceException */ static void copyFromSourceToTarget(final Mutable<?, ?, ?> sourceGrpStmtCtx, final StatementContextBase<?, ?, ?> targetCtx, final Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode) { final Collection<? extends Mutable<?, ?, ?>> declared = sourceGrpStmtCtx.mutableDeclaredSubstatements(); final Collection<? extends Mutable<?, ?, ?>> effective = sourceGrpStmtCtx.mutableEffectiveSubstatements(); final Collection<Mutable<?, ?, ?>> buffer = new ArrayList<>(declared.size() + effective.size()); final QNameModule newQNameModule = getNewQNameModule(targetCtx, sourceGrpStmtCtx); for (final Mutable<?, ?, ?> original : declared) { if (original.isSupportedByFeatures()) { copyStatement(original, targetCtx, newQNameModule, buffer); } } for (final Mutable<?, ?, ?> original : effective) { copyStatement(original, targetCtx, newQNameModule, buffer); } targetCtx.addEffectiveSubstatements(buffer); usesNode.addAsEffectOfStatement(buffer); }
private static void performRefine(final Mutable<?, ?, ?> subStmtCtx, final StmtContext<?, ?, ?> usesParentCtx) { final Object refineArgument = subStmtCtx.getStatementArgument(); InferenceException.throwIf(!(refineArgument instanceof SchemaNodeIdentifier), subStmtCtx.getStatementSourceReference(), "Invalid refine argument %s. It must be instance of SchemaNodeIdentifier.", refineArgument); final Optional<StmtContext<?, ?, ?>> optRefineTargetCtx = ChildSchemaNodeNamespace.findNode( usesParentCtx, (SchemaNodeIdentifier) refineArgument); InferenceException.throwIf(!optRefineTargetCtx.isPresent(), subStmtCtx.getStatementSourceReference(), "Refine target node %s not found.", refineArgument); final StmtContext<?, ?, ?> refineTargetNodeCtx = optRefineTargetCtx.get(); if (StmtContextUtils.isUnknownStatement(refineTargetNodeCtx)) { LOG.trace("Refine node '{}' in uses '{}' has target node unknown statement '{}'. " + "Refine has been skipped. At line: {}", subStmtCtx.getStatementArgument(), subStmtCtx.coerceParentContext().getStatementArgument(), refineTargetNodeCtx.getStatementArgument(), subStmtCtx.getStatementSourceReference()); subStmtCtx.addAsEffectOfStatement(refineTargetNodeCtx); return; } Verify.verify(refineTargetNodeCtx instanceof StatementContextBase); addOrReplaceNodes(subStmtCtx, (StatementContextBase<?, ?, ?>) refineTargetNodeCtx); subStmtCtx.addAsEffectOfStatement(refineTargetNodeCtx); }