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