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