*/
package org.opendaylight.yangtools.yang.parser.builder.impl;
-import java.util.ArrayList;
-import java.util.Collections;
+import com.google.common.collect.ImmutableList;
import java.util.List;
-
import org.opendaylight.yangtools.yang.model.api.Deviation;
import org.opendaylight.yangtools.yang.model.api.Deviation.Deviate;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder;
-import org.opendaylight.yangtools.yang.parser.util.Comparators;
-import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
+import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.util.AbstractBuilder;
import org.opendaylight.yangtools.yang.parser.util.YangParseException;
public final class DeviationBuilder extends AbstractBuilder {
+ private DeviationImpl instance;
private final String targetPathStr;
- private boolean isBuilt;
- private final DeviationImpl instance;
-
private SchemaPath targetPath;
+ private Deviate deviate;
private String reference;
- private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
DeviationBuilder(final String moduleName, final int line, final String targetPathStr) {
super(moduleName, line);
"Deviation argument string must be an absolute schema node identifier.");
}
this.targetPathStr = targetPathStr;
- this.targetPath = ParserUtils.parseXPathString(targetPathStr);
- instance = new DeviationImpl();
+ this.targetPath = BuilderUtils.parseXPathString(targetPathStr);
}
@Override
public Deviation build() {
if (targetPath == null) {
- throw new YangParseException(moduleName, line, "Unresolved deviation target");
+ throw new YangParseException(getModuleName(), getLine(), "Unresolved deviation target");
}
- if (!isBuilt) {
- instance.setTargetPath(targetPath);
- instance.setReference(reference);
+ if (instance != null) {
+ return instance;
+ }
- // UNKNOWN NODES
- List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
- for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
- unknownNodes.add(b.build());
- }
- Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
- instance.setUnknownSchemaNodes(unknownNodes);
+ instance = new DeviationImpl();
+ instance.targetPath = targetPath;
+ instance.deviate = deviate;
+ instance.reference = reference;
- isBuilt = true;
+ // UNKNOWN NODES
+ for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+ unknownNodes.add(b.build());
}
+ instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
return instance;
}
public void setDeviate(final String deviate) {
if ("not-supported".equals(deviate)) {
- instance.setDeviate(Deviate.NOT_SUPPORTED);
+ this.deviate = Deviate.NOT_SUPPORTED;
} else if ("add".equals(deviate)) {
- instance.setDeviate(Deviate.ADD);
+ this.deviate = Deviate.ADD;
} else if ("replace".equals(deviate)) {
- instance.setDeviate(Deviate.REPLACE);
+ this.deviate = Deviate.REPLACE;
} else if ("delete".equals(deviate)) {
- instance.setDeviate(Deviate.DELETE);
+ this.deviate = Deviate.DELETE;
} else {
- throw new YangParseException(moduleName, line, "Unsupported type of 'deviate' statement: " + deviate);
+ throw new YangParseException(getModuleName(), getLine(), "Unsupported type of 'deviate' statement: " + deviate);
}
}
return "deviation " + targetPathStr;
}
- private final class DeviationImpl implements Deviation {
+ private static final class DeviationImpl implements Deviation {
private SchemaPath targetPath;
private Deviate deviate;
private String reference;
- private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
+ private ImmutableList<UnknownSchemaNode> unknownNodes;
private DeviationImpl() {
}
return targetPath;
}
- private void setTargetPath(final SchemaPath targetPath) {
- this.targetPath = targetPath;
- }
-
@Override
public Deviate getDeviate() {
return deviate;
}
- private void setDeviate(final Deviate deviate) {
- this.deviate = deviate;
- }
-
@Override
public String getReference() {
return reference;
}
- private void setReference(final String reference) {
- this.reference = reference;
- }
-
@Override
public List<UnknownSchemaNode> getUnknownSchemaNodes() {
return unknownNodes;
}
- private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
- if (unknownSchemaNodes != null) {
- this.unknownNodes = unknownSchemaNodes;
- }
- }
-
@Override
public int hashCode() {
final int prime = 31;
public String toString() {
StringBuilder sb = new StringBuilder(DeviationImpl.class.getSimpleName());
sb.append("[");
- sb.append("targetPath=" + targetPath);
- sb.append(", deviate=" + deviate);
- sb.append(", reference=" + reference);
+ sb.append("targetPath=").append(targetPath);
+ sb.append(", deviate=").append(deviate);
+ sb.append(", reference=").append(reference);
sb.append("]");
return sb.toString();
}