Bug 1093: Extracted major static inner classes in parser.builder.impl
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / ContainerSchemaNodeBuilder.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 java.util.ArrayList;
11 import java.util.List;
12 import org.opendaylight.yangtools.yang.common.QName;
13 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
14 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
15 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
16 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
17 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
18 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
19 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
20 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
21 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
22 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainerBuilder;
23 import com.google.common.base.Preconditions;
24 import com.google.common.collect.ImmutableList;
25 import com.google.common.collect.ImmutableSet;
26
27 public final class ContainerSchemaNodeBuilder extends AbstractDocumentedDataNodeContainerBuilder implements
28         AugmentationTargetBuilder, DataSchemaNodeBuilder {
29     private ContainerSchemaNodeImpl instance;
30     private boolean presence;
31     // SchemaNode args
32     private SchemaPath path;
33     // DataSchemaNode args
34     private boolean augmenting;
35     private boolean addedByUses;
36     private boolean configuration;
37     private ContainerSchemaNode originalNode;
38     private ContainerSchemaNodeBuilder originalBuilder;
39     private final ConstraintsBuilder constraints;
40     // AugmentationTarget args
41     private final List<AugmentationSchema> augmentations = new ArrayList<>();
42     private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
43
44     public ContainerSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
45         super(moduleName, line, qname);
46         this.path = Preconditions.checkNotNull(path, "Schema Path must not be null");
47         this.constraints = new ConstraintsBuilderImpl(moduleName, line);
48     }
49
50     // constructor for uses
51     public ContainerSchemaNodeBuilder(final String moduleName, final int line, final QName qname,
52             final SchemaPath path, final ContainerSchemaNode base) {
53         super(moduleName, line, qname, path, base);
54         this.path = Preconditions.checkNotNull(path, "Schema Path must not be null");
55
56         constraints = new ConstraintsBuilderImpl(moduleName, line, base.getConstraints());
57
58         augmenting = base.isAugmenting();
59         addedByUses = base.isAddedByUses();
60         originalNode = base;
61         configuration = base.isConfiguration();
62         presence = base.isPresenceContainer();
63
64         augmentations.addAll(base.getAvailableAugmentations());
65
66     }
67
68     @Override
69     protected String getStatementName() {
70         return "container";
71     }
72
73     @Override
74     public ContainerSchemaNode build() {
75         if (instance != null) {
76             return instance;
77         }
78
79         buildChildren();
80         instance = new ContainerSchemaNodeImpl(this);
81
82         instance.augmenting = augmenting;
83         instance.addedByUses = addedByUses;
84         instance.configuration = configuration;
85         instance.constraints = constraints.toInstance();
86         instance.presence = presence;
87
88         // ORIGINAL NODE
89         if (originalNode == null && originalBuilder != null) {
90             originalNode = originalBuilder.build();
91         }
92         instance.original = originalNode;
93
94         // AUGMENTATIONS
95         for (AugmentationSchemaBuilder builder : augmentationBuilders) {
96             augmentations.add(builder.build());
97         }
98         instance.augmentations = ImmutableSet.copyOf(augmentations);
99
100         // UNKNOWN NODES
101         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
102             unknownNodes.add(b.build());
103         }
104         instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
105
106         return instance;
107     }
108
109     public List<AugmentationSchemaBuilder> getAugmentationBuilders() {
110         return augmentationBuilders;
111     }
112
113     @Override
114     public void addAugmentation(final AugmentationSchemaBuilder augment) {
115         augmentationBuilders.add(augment);
116     }
117
118     @Override
119     public SchemaPath getPath() {
120         return path;
121     }
122
123     @Override
124     public void setPath(final SchemaPath path) {
125         this.path = path;
126     }
127
128     @Override
129     public boolean isAugmenting() {
130         return augmenting;
131     }
132
133     @Override
134     public void setAugmenting(final boolean augmenting) {
135         this.augmenting = augmenting;
136     }
137
138     @Override
139     public boolean isAddedByUses() {
140         return addedByUses;
141     }
142
143     @Override
144     public void setAddedByUses(final boolean addedByUses) {
145         this.addedByUses = addedByUses;
146     }
147
148     @Override
149     public ContainerSchemaNodeBuilder getOriginal() {
150         return originalBuilder;
151     }
152
153     @Override
154     public void setOriginal(final SchemaNodeBuilder builder) {
155         Preconditions.checkArgument(builder instanceof ContainerSchemaNodeBuilder, "Original of container cannot be "
156                 + builder);
157         this.originalBuilder = (ContainerSchemaNodeBuilder) builder;
158     }
159
160     @Override
161     public boolean isConfiguration() {
162         return configuration;
163     }
164
165     @Override
166     public void setConfiguration(final boolean configuration) {
167         this.configuration = configuration;
168     }
169
170     @Override
171     public ConstraintsBuilder getConstraints() {
172         return constraints;
173     }
174
175     public boolean isPresence() {
176         return presence;
177     }
178
179     public void setPresence(final boolean presence) {
180         this.presence = presence;
181     }
182
183     @Override
184     public int hashCode() {
185         final int prime = 31;
186         int result = 1;
187         result = prime * result + ((path == null) ? 0 : path.hashCode());
188         return result;
189     }
190
191     @Override
192     public boolean equals(final Object obj) {
193         if (this == obj) {
194             return true;
195         }
196         if (obj == null) {
197             return false;
198         }
199         if (getClass() != obj.getClass()) {
200             return false;
201         }
202         ContainerSchemaNodeBuilder other = (ContainerSchemaNodeBuilder) obj;
203         if (path == null) {
204             if (other.path != null) {
205                 return false;
206             }
207         } else if (!path.equals(other.path)) {
208             return false;
209         }
210         if (getParent() == null) {
211             if (other.getParent() != null) {
212                 return false;
213             }
214         } else if (!getParent().equals(other.getParent())) {
215             return false;
216         }
217         return true;
218     }
219
220     @Override
221     public String toString() {
222         return "container " + qname.getLocalName();
223     }
224
225 }