Merge "Bug 2561: Parser incorrectly allows usage of union in list"
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / AnyXmlBuilder.java
1 /*
2  * Copyright (c) 2013 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.builder.impl;
9
10 import org.opendaylight.yangtools.yang.common.QName;
11 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
12 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
13 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
14 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
15 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
16 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
17 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractSchemaNodeBuilder;
18 import com.google.common.base.Preconditions;
19 import com.google.common.collect.ImmutableList;
20
21 public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements DataSchemaNodeBuilder {
22     private AnyXmlSchemaNodeImpl instance;
23
24     private boolean augmenting;
25     private boolean addedByUses;
26     private boolean configuration;
27     private AnyXmlSchemaNode originalNode;
28     private AnyXmlBuilder originalBuilder;
29     private final ConstraintsBuilder constraints;
30
31     public AnyXmlBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
32         super(moduleName, line, qname);
33         this.schemaPath = path;
34         constraints = new ConstraintsBuilderImpl(moduleName, line);
35     }
36
37     public AnyXmlBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path,
38             final AnyXmlSchemaNode base) {
39         super(moduleName, line, qname);
40         this.schemaPath = path;
41         constraints = new ConstraintsBuilderImpl(moduleName, line, base.getConstraints());
42
43         description = base.getDescription();
44         reference = base.getReference();
45         status = base.getStatus();
46         augmenting = base.isAugmenting();
47         addedByUses = base.isAddedByUses();
48         originalNode = base;
49         configuration = base.isConfiguration();
50         unknownNodes.addAll(base.getUnknownSchemaNodes());
51     }
52
53     @Override
54     public AnyXmlSchemaNode build() {
55         if (instance != null) {
56             return instance;
57         }
58
59         instance = new AnyXmlSchemaNodeImpl(qname, schemaPath);
60
61         instance.description = description;
62         instance.reference = reference;
63         instance.status = status;
64         instance.augmenting = augmenting;
65         instance.addedByUses = addedByUses;
66         instance.configuration = configuration;
67         instance.constraintsDef = constraints.toInstance();
68
69         // ORIGINAL NODE
70         if (originalNode == null && originalBuilder != null) {
71             originalNode = originalBuilder.build();
72         }
73         instance.original = originalNode;
74
75         // UNKNOWN NODES
76         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
77             unknownNodes.add(b.build());
78         }
79         instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
80
81         return instance;
82     }
83
84     @Override
85     public ConstraintsBuilder getConstraints() {
86         return constraints;
87     }
88
89     @Override
90     public boolean isAugmenting() {
91         return augmenting;
92     }
93
94     @Override
95     public void setAugmenting(final boolean augmenting) {
96         this.augmenting = augmenting;
97     }
98
99     @Override
100     public boolean isAddedByUses() {
101         return addedByUses;
102     }
103
104     @Override
105     public void setAddedByUses(final boolean addedByUses) {
106         this.addedByUses = addedByUses;
107     }
108
109     @Override
110     public AnyXmlBuilder getOriginal() {
111         return originalBuilder;
112     }
113
114     @Override
115     public void setOriginal(final SchemaNodeBuilder builder) {
116         Preconditions.checkArgument(builder instanceof AnyXmlBuilder, "Original of anyxml cannot be " + builder);
117         this.originalBuilder = (AnyXmlBuilder) builder;
118     }
119
120     @Override
121     public boolean isConfiguration() {
122         return configuration;
123     }
124
125     @Override
126     public void setConfiguration(final boolean configuration) {
127         this.configuration = configuration;
128     }
129
130     @Override
131     public int hashCode() {
132         final int prime = 31;
133         int result = 1;
134         result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
135         return result;
136     }
137
138     @Override
139     public boolean equals(final Object obj) {
140         if (this == obj) {
141             return true;
142         }
143         if (obj == null) {
144             return false;
145         }
146         if (getClass() != obj.getClass()) {
147             return false;
148         }
149         AnyXmlBuilder other = (AnyXmlBuilder) obj;
150         if (schemaPath == null) {
151             if (other.schemaPath != null) {
152                 return false;
153             }
154         } else if (!schemaPath.equals(other.schemaPath)) {
155             return false;
156         }
157         if (getParent() == null) {
158             if (other.getParent() != null) {
159                 return false;
160             }
161         } else if (!getParent().equals(other.getParent())) {
162             return false;
163         }
164         return true;
165     }
166
167     @Override
168     public String toString() {
169         return "anyxml " + qname.getLocalName();
170     }
171
172 }