BUG-6522: create a specialized CopyHistory object
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / 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
9 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective;
10
11 import com.google.common.collect.ImmutableList;
12 import com.google.common.collect.ImmutableList.Builder;
13 import java.util.List;
14 import org.opendaylight.yangtools.yang.common.QName;
15 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
16 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
17 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
18 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
19 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
20 import org.opendaylight.yangtools.yang.parser.spi.ExtensionNamespace;
21 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyHistory;
22 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
23 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
24
25 public abstract class UnknownEffectiveStatementBase<A> extends AbstractEffectiveDocumentedNode<A, UnknownStatement<A>>
26         implements UnknownSchemaNode {
27
28     private final boolean addedByUses;
29     private final boolean addedByAugmentation;
30
31     private final ExtensionDefinition extension;
32     private final List<UnknownSchemaNode> unknownNodes;
33     private final QName nodeType;
34     private final String nodeParameter;
35
36     public UnknownEffectiveStatementBase(final StmtContext<A, UnknownStatement<A>, ?> ctx) {
37         super(ctx);
38
39         final StmtContext<?, ExtensionStatement, EffectiveStatement<QName, ExtensionStatement>> extensionInit = ctx
40                 .getFromNamespace(ExtensionNamespace.class, ctx.getPublicDefinition().getStatementName());
41
42         if (extensionInit == null) {
43             extension = null;
44             nodeType = ctx.getPublicDefinition().getArgumentName();
45         } else {
46             extension = (ExtensionEffectiveStatementImpl) extensionInit.buildEffective();
47             nodeType = null;
48         }
49
50         // initCopyType
51         final CopyHistory copyTypesFromOriginal = ctx.getCopyHistory();
52         if (copyTypesFromOriginal.contains(CopyType.ADDED_BY_USES_AUGMENTATION)) {
53             this.addedByUses = this.addedByAugmentation = true;
54         } else {
55             this.addedByAugmentation = copyTypesFromOriginal.contains(CopyType.ADDED_BY_AUGMENTATION);
56             this.addedByUses = copyTypesFromOriginal.contains(CopyType.ADDED_BY_USES);
57         }
58
59         nodeParameter = (ctx.rawStatementArgument() == null) ? "" : ctx.rawStatementArgument();
60
61         // TODO init other fields (see Bug1412Test)
62         final Builder<UnknownSchemaNode> builder = ImmutableList.builder();
63         for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
64             if (effectiveStatement instanceof UnknownSchemaNode) {
65                 builder.add((UnknownSchemaNode) effectiveStatement);
66             }
67         }
68         unknownNodes = builder.build();
69     }
70
71     @Override
72     public boolean isAddedByAugmentation() {
73         return addedByAugmentation;
74     }
75
76     @Override
77     public QName getNodeType() {
78         return extension == null ? nodeType : extension.getQName();
79     }
80
81     @Override
82     public String getNodeParameter() {
83         return nodeParameter;
84     }
85
86     @Override
87     public boolean isAddedByUses() {
88         return addedByUses;
89     }
90
91     @Override
92     public ExtensionDefinition getExtensionDefinition() {
93         return extension;
94     }
95
96     @Override
97     public List<UnknownSchemaNode> getUnknownSchemaNodes() {
98         return unknownNodes;
99     }
100
101     @Override
102     public String toString() {
103         final QName type = getNodeType();
104
105         return String.valueOf(type.getNamespace()) +
106                 ":" + type.getLocalName() + " " + nodeParameter;
107     }
108 }