From fdf294db9565f1e0552373a91b720268d426bd77 Mon Sep 17 00:00:00 2001 From: Martin Vitez Date: Tue, 14 Jan 2014 10:29:14 +0100 Subject: [PATCH] Added augment sorting before resolving process. Change-Id: I51ca3a9618c71b37f776e886c41e70ba4cb10f84 Signed-off-by: Martin Vitez Signed-off-by: Robert Varga --- .../yang/parser/impl/YangParserImpl.java | 14 ++++++++++--- .../yang/parser/util/Comparators.java | 21 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java index c63a52bd21..9b3a0a4030 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java @@ -40,7 +40,16 @@ import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.TypeAwareBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder; -import org.opendaylight.yangtools.yang.parser.builder.impl.*; +import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceBuilder; +import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceCaseBuilder; +import org.opendaylight.yangtools.yang.parser.builder.impl.DeviationBuilder; +import org.opendaylight.yangtools.yang.parser.builder.impl.ExtensionBuilder; +import org.opendaylight.yangtools.yang.parser.builder.impl.IdentitySchemaNodeBuilder; +import org.opendaylight.yangtools.yang.parser.builder.impl.IdentityrefTypeBuilder; +import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder; +import org.opendaylight.yangtools.yang.parser.builder.impl.UnionTypeBuilder; +import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder; +import org.opendaylight.yangtools.yang.parser.util.Comparators; import org.opendaylight.yangtools.yang.parser.util.GroupingSort; import org.opendaylight.yangtools.yang.parser.util.GroupingUtils; import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort; @@ -749,18 +758,17 @@ public final class YangParserImpl implements YangModelParser { sorted = ModuleDependencySort.sortWithContext(context, all.toArray(new ModuleBuilder[all.size()])); } - // resolve other augments for (ModuleBuilder mb : sorted) { if (mb != null) { List augments = mb.getAllAugments(); checkAugmentMandatoryNodes(augments); + Collections.sort(augments, Comparators.AUGMENT_COMP); for (AugmentationSchemaBuilder augment : augments) { if (!(augment.isResolved())) { boolean resolved = resolveAugment(augment, mb, modules, context); if (!resolved) { throw new YangParseException(augment.getModuleName(), augment.getLine(), "Error in augment parsing: failed to find augment target: " + augment); - } } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/Comparators.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/Comparators.java index e390c4ad32..816db28e34 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/Comparators.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/Comparators.java @@ -11,12 +11,25 @@ import java.util.Comparator; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.SchemaNode; +import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder; public final class Comparators { + /** + * Comparator based on alphabetical order of qname's local name. + */ public static final QNameComparator QNAME_COMP = new QNameComparator(); + + /** + * Comparator based on alphabetical order of local name of SchemaNode's qname. + */ public static final SchemaNodeComparator SCHEMA_NODE_COMP = new SchemaNodeComparator(); + /** + * Comparator based on augment target path length. + */ + public static final AugmentComparator AUGMENT_COMP = new AugmentComparator(); + private Comparators() { } @@ -34,4 +47,12 @@ public final class Comparators { } } + private static final class AugmentComparator implements Comparator { + @Override + public int compare(AugmentationSchemaBuilder o1, AugmentationSchemaBuilder o2) { + return o1.getTargetPath().getPath().size() - o2.getTargetPath().getPath().size(); + } + + } + } -- 2.36.6