Refactor AbstractEffectiveDocumentedNodeWithStatus
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / UnknownEffectiveStatementBase.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. 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;
9
10 import com.google.common.base.Preconditions;
11 import com.google.common.collect.ImmutableList;
12 import org.opendaylight.yangtools.yang.common.QName;
13 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
14 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
15 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
16 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionEffectiveStatement;
17 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
18 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
19 import org.opendaylight.yangtools.yang.parser.spi.ExtensionNamespace;
20 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyHistory;
21 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
22 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
23
24 public abstract class UnknownEffectiveStatementBase<A, D extends UnknownStatement<A>>
25         extends AbstractEffectiveDocumentedNodeWithStatus<A, D> implements UnknownSchemaNode {
26
27     private final boolean addedByUses;
28     private final boolean addedByAugmentation;
29
30     private final ExtensionDefinition extension;
31     private final QName nodeType;
32     private final String nodeParameter;
33
34     protected UnknownEffectiveStatementBase(final StmtContext<A, D, ?> ctx,
35             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
36         super(ctx, substatements);
37
38         final StmtContext<?, ExtensionStatement, ExtensionEffectiveStatement> extensionInit =
39                 ctx.getFromNamespace(ExtensionNamespace.class, ctx.getPublicDefinition().getStatementName());
40
41         if (extensionInit == null) {
42             extension = null;
43             nodeType = ctx.getPublicDefinition().getStatementName();
44         } else {
45             final EffectiveStatement<QName, ExtensionStatement> effective = extensionInit.buildEffective();
46             Preconditions.checkState(effective instanceof ExtensionDefinition,
47                 "Statement %s is not an ExtensionDefinition", effective);
48             extension = (ExtensionDefinition) extensionInit.buildEffective();
49             nodeType = null;
50         }
51
52         // initCopyType
53         final CopyHistory copyTypesFromOriginal = ctx.getCopyHistory();
54         if (copyTypesFromOriginal.contains(CopyType.ADDED_BY_USES_AUGMENTATION)) {
55             this.addedByAugmentation = true;
56             this.addedByUses = true;
57         } else {
58             this.addedByAugmentation = copyTypesFromOriginal.contains(CopyType.ADDED_BY_AUGMENTATION);
59             this.addedByUses = copyTypesFromOriginal.contains(CopyType.ADDED_BY_USES);
60         }
61
62         nodeParameter = ctx.rawStatementArgument() == null ? "" : ctx.rawStatementArgument();
63     }
64
65     @Deprecated
66     @Override
67     public boolean isAddedByAugmentation() {
68         return addedByAugmentation;
69     }
70
71     @Override
72     public QName getNodeType() {
73         return extension == null ? nodeType : extension.getQName();
74     }
75
76     @Override
77     public String getNodeParameter() {
78         return nodeParameter;
79     }
80
81     @Deprecated
82     @Override
83     public boolean isAddedByUses() {
84         return addedByUses;
85     }
86
87     @Override
88     public ExtensionDefinition getExtensionDefinition() {
89         return extension;
90     }
91
92     @Override
93     public String toString() {
94         final QName type = getNodeType();
95         return String.valueOf(type.getNamespace()) + ":" + type.getLocalName() + " " + nodeParameter;
96     }
97 }