Cleanup unrecognized statement wrapping
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / extension / UnrecognizedStatementSupport.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension;
9
10 import com.google.common.collect.ImmutableList;
11 import java.util.Optional;
12 import org.opendaylight.yangtools.yang.common.QName;
13 import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition;
14 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
15 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
16 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
17 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
18 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
19 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
20 import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
21 import org.opendaylight.yangtools.yang.parser.spi.meta.OverrideChildStatementSupport;
22 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
23 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
24 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
25
26 final class UnrecognizedStatementSupport
27         extends AbstractStatementSupport<Object, UnrecognizedStatement, UnrecognizedEffectiveStatement>
28         implements OverrideChildStatementSupport {
29     UnrecognizedStatementSupport(final StatementDefinition publicDefinition) {
30         // We have no idea about the statement's semantics, hence there should be noone interested in its semantics.
31         // Nevertheless it may be of interest for various hacks to understand there was an extension involved.
32         super(publicDefinition, StatementPolicy.exactReplica());
33     }
34
35     @Override
36     public String parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
37         return value;
38     }
39
40     @Override
41     public UnrecognizedStatementSupport statementDefinitionOverrideOf(final StatementDefinition childDef) {
42         /*
43          * This code wraps statements encountered inside an extension so they do not get confused with regular
44          * statements.
45          */
46         final QName baseQName = getStatementName();
47         final QName statementName = QName.create(baseQName, childDef.getStatementName().getLocalName());
48
49         final ModelDefinedStatementDefinition def;
50         final Optional<ArgumentDefinition> optArgDef = childDef.getArgumentDefinition();
51         if (optArgDef.isPresent()) {
52             final ArgumentDefinition argDef = optArgDef.get();
53             def = new ModelDefinedStatementDefinition(statementName, argDef.getArgumentName(), argDef.isYinElement());
54         } else {
55             def = new ModelDefinedStatementDefinition(statementName);
56         }
57         return new UnrecognizedStatementSupport(def);
58     }
59
60     @Override
61     protected SubstatementValidator getSubstatementValidator() {
62         // We know nothing about this statement
63         return null;
64     }
65
66     @Override
67     protected UnrecognizedStatement createDeclared(final StmtContext<Object, UnrecognizedStatement, ?> ctx,
68             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
69         return new UnrecognizedStatementImpl(ctx.rawArgument(), ctx.publicDefinition(), substatements);
70     }
71
72     // createEffective() should never be called, ensure that for each declared statement
73
74     @Override
75     public void onStatementAdded(final Mutable<Object, UnrecognizedStatement, UnrecognizedEffectiveStatement> stmt) {
76         stmt.setIsSupportedToBuildEffective(false);
77     }
78
79     @Override
80     protected UnrecognizedEffectiveStatement createEffective(final Current<Object, UnrecognizedStatement> stmt,
81             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
82         throw new InferenceException(stmt, "Attempted to instantiate unrecognized effective statement %s",
83             stmt.publicDefinition());
84     }
85 }