*/
package org.opendaylight.yangtools.yang.parser.builder.impl;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
+import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
import org.opendaylight.yangtools.yang.model.api.UsesNode;
import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
-import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
+import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDataNodeContainerBuilder;
import org.opendaylight.yangtools.yang.parser.util.YangParseException;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-
public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContainerBuilder implements
AugmentationSchemaBuilder {
+ private final int order;
private AugmentationSchemaImpl instance;
private String whenCondition;
private boolean resolved;
private AugmentationSchemaBuilder copyOf;
- public AugmentationSchemaBuilderImpl(final String moduleName, final int line, final String augmentTargetStr) {
+ public AugmentationSchemaBuilderImpl(final String moduleName, final int line, final String augmentTargetStr, final int order) {
super(moduleName, line, null);
+ this.order = order;
this.augmentTargetStr = augmentTargetStr;
- targetPath = ParserUtils.parseXPathString(augmentTargetStr);
+ targetPath = BuilderUtils.parseXPathString(augmentTargetStr);
}
@Override
@Override
public void addGrouping(final GroupingBuilder grouping) {
- throw new YangParseException(moduleName, line, "augment can not contains grouping statement");
+ throw new YangParseException(getModuleName(), grouping.getLine(), "augment can not contains grouping statement");
}
@Override
return instance;
}
- instance = new AugmentationSchemaImpl(targetPath);
+ instance = new AugmentationSchemaImpl(targetPath, order);
instance.description = description;
instance.reference = reference;
}
if (parent instanceof UsesNodeBuilder) {
- ModuleBuilder mb = ParserUtils.getParentModule(this);
+ final ModuleBuilder mb = BuilderUtils.getParentModule(this);
+ final QNameModule qm = QNameModule.create(mb.getNamespace(), mb.getRevision());
+
List<QName> newPath = new ArrayList<>();
- List<QName> parsedPath = targetPath.getPath();
- for (QName name : parsedPath) {
- newPath.add(new QName(mb.getNamespace(), mb.getRevision(), name.getPrefix(), name.getLocalName()));
+ for (QName name : targetPath.getPathFromRoot()) {
+ newPath.add(QName.create(qm, name.getPrefix(), name.getLocalName()));
}
- instance.targetPath = new SchemaPath(newPath, false);
+ instance.targetPath = SchemaPath.create(newPath, false);
} else {
instance.targetPath = targetNodeSchemaPath;
}
// CHILD NODES
for (DataSchemaNodeBuilder node : addedChildNodes) {
- childNodes.add(node.build());
+ childNodes.put(node.getQName(), node.build());
}
- instance.childNodes = ImmutableSet.copyOf(childNodes);
+ instance.childNodes = ImmutableSet.copyOf(childNodes.values());
// USES
for (UsesNodeBuilder builder : addedUsesNodes) {
@Override
public void addTypedef(final TypeDefinitionBuilder type) {
- throw new YangParseException(moduleName, line, "Augmentation can not contains typedef statement.");
+ throw new YangParseException(getModuleName(), type.getLine(), "Augmentation can not contains typedef statement.");
}
@Override
}
@Override
- public void setStatus(Status status) {
+ public void setStatus(final Status status) {
this.status = Preconditions.checkNotNull(status, "status cannot be null");
}
this.targetNodeSchemaPath = path;
}
+ @Override
+ public int getOrder() {
+ return order;
+ }
+
@Override
public int hashCode() {
final int prime = 17;
copyOf = old;
}
- private static final class AugmentationSchemaImpl implements AugmentationSchema, NamespaceRevisionAware {
+ private static final class AugmentationSchemaImpl implements AugmentationSchema, NamespaceRevisionAware,
+ Comparable<AugmentationSchemaImpl> {
+ private final int order;
private SchemaPath targetPath;
private RevisionAwareXPath whenCondition;
private ImmutableSet<DataSchemaNode> childNodes;
private ImmutableList<UnknownSchemaNode> unknownNodes;
private AugmentationSchema copyOf;
- private AugmentationSchemaImpl(final SchemaPath targetPath) {
+ public AugmentationSchemaImpl(final SchemaPath targetPath, final int order) {
this.targetPath = targetPath;
+ this.order = order;
}
public void setCopyOf(final AugmentationSchema build) {
sb.append("]");
return sb.toString();
}
+
+ @Override
+ public int compareTo(final AugmentationSchemaImpl o) {
+ Iterator<QName> thisIt = this.targetPath.getPathFromRoot().iterator();
+ Iterator<QName> otherIt = o.getTargetPath().getPathFromRoot().iterator();
+ while (thisIt.hasNext()) {
+ if (otherIt.hasNext()) {
+ int comp = thisIt.next().compareTo(otherIt.next());
+ if (comp != 0) {
+ return comp;
+ }
+ } else {
+ return 1;
+ }
+ }
+ if (otherIt.hasNext()) {
+ return -1;
+ }
+ return this.order - o.order;
+ }
}
}