From c2bbf5ea78b943a43f7ca1e2f802e8fd82119335 Mon Sep 17 00:00:00 2001 From: Martin Vitez Date: Mon, 19 May 2014 15:36:24 +0200 Subject: [PATCH] Improved sorting of augmentations before code generation. Change-Id: I6471f4849fa57a717d85d61293305b0853b851cb Signed-off-by: Martin Vitez --- .../generator/impl/BindingGeneratorImpl.xtend | 39 ++++++++++-- .../api/AugmentationSchemaBuilder.java | 6 +- .../impl/AugmentationSchemaBuilderImpl.java | 49 ++++++++++++--- .../parser/builder/impl/ModuleBuilder.java | 7 ++- .../parser/impl/YangParserListenerImpl.java | 5 +- .../yang/parser/util/Comparators.java | 62 +------------------ .../yangtools/yang/parser/util/CopyUtils.java | 3 +- 7 files changed, 86 insertions(+), 85 deletions(-) diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend index ec1ec8fc6a..82a191eb44 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend @@ -79,6 +79,7 @@ import org.opendaylight.yangtools.yang.binding.BindingMapping import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTypeBuilderBase import com.google.common.collect.Sets +import java.util.TreeSet public class BindingGeneratorImpl implements BindingGenerator { @@ -364,19 +365,45 @@ public class BindingGeneratorImpl implements BindingGenerator { checkState(module.augmentations !== null, "Augmentations Set cannot be NULL."); val Set augmentations = module.augmentations; - val List sortedAugmentations = new ArrayList(augmentations); + var List sortedAugmentations = getSortedOrNull(augmentations) + if (sortedAugmentations != null) { + return sortedAugmentations + } + sortedAugmentations = new ArrayList(augmentations); Collections.sort(sortedAugmentations, [ augSchema1, augSchema2 | - if (augSchema1.targetPath.path.size() > augSchema2.targetPath.path.size()) { - return 1; - } else if (augSchema1.targetPath.path.size() < augSchema2.targetPath.path.size()) { - return -1; + val Iterator thisIt = augSchema1.targetPath.getPath().iterator(); + val Iterator otherIt = augSchema2.getTargetPath().getPath().iterator(); + while (thisIt.hasNext()) { + if (otherIt.hasNext()) { + val int comp = thisIt.next().compareTo(otherIt.next()); + if (comp != 0) { + return comp + } + } else { + return 1 + } + } + if (otherIt.hasNext()) { + return -1 } - return 0; + return 0 ]); return sortedAugmentations; } + private def List getSortedOrNull(Collection collection) { + val TreeSet set = new TreeSet() + for (e : collection) { + if (e instanceof Comparable) { + set.add(e) + } else { + return null + } + } + return new ArrayList(set.toArray) + } + /** * Converts whole module to GeneratedType object. * Firstly is created the module builder object from which is vally diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java index ebe587afef..6b1e49e1ed 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java @@ -7,7 +7,9 @@ */ package org.opendaylight.yangtools.yang.parser.builder.api; -import org.opendaylight.yangtools.yang.model.api.*; +import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.opendaylight.yangtools.yang.model.api.Status; /** * Interface for builders of 'augment' statement. @@ -80,4 +82,6 @@ public interface AugmentationSchemaBuilder extends DataNodeContainerBuilder { */ void setResolved(boolean resolved); + int getOrder(); + } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java index d908f93b02..3b75d1190c 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java @@ -7,13 +7,17 @@ */ 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.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -36,13 +40,9 @@ import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.yangtools.yang.parser.util.ParserUtils; 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; @@ -57,8 +57,9 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain 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, int order) { super(moduleName, line, null); + this.order = order; this.augmentTargetStr = augmentTargetStr; targetPath = ParserUtils.parseXPathString(augmentTargetStr); } @@ -89,7 +90,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain return instance; } - instance = new AugmentationSchemaImpl(targetPath); + instance = new AugmentationSchemaImpl(targetPath, order); instance.description = description; instance.reference = reference; @@ -227,6 +228,11 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain this.targetNodeSchemaPath = path; } + @Override + public int getOrder() { + return order; + } + @Override public int hashCode() { final int prime = 17; @@ -282,7 +288,9 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain copyOf = old; } - private static final class AugmentationSchemaImpl implements AugmentationSchema, NamespaceRevisionAware { + private static final class AugmentationSchemaImpl implements AugmentationSchema, NamespaceRevisionAware, + Comparable { + private final int order; private SchemaPath targetPath; private RevisionAwareXPath whenCondition; private ImmutableSet childNodes; @@ -296,8 +304,9 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain private ImmutableList 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) { @@ -442,6 +451,26 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain sb.append("]"); return sb.toString(); } + + @Override + public int compareTo(AugmentationSchemaImpl o) { + Iterator thisIt = this.targetPath.getPath().iterator(); + Iterator otherIt = o.getTargetPath().getPath().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; + } } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java index 1b6f19a069..e8716365d4 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java @@ -13,6 +13,7 @@ import java.util.Collections; import java.util.Date; import java.util.Deque; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -82,7 +83,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { private final Set imports = new HashSet(); - private final Set augments = new HashSet<>(); + private final Set augments = new LinkedHashSet<>(); private final List augmentBuilders = new ArrayList<>(); private final List allAugments = new ArrayList<>(); @@ -523,8 +524,8 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return builder; } - public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr) { - final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr); + public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr, final int order) { + final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr, order); Builder parent = getActualNode(); builder.setParent(parent); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java index cc4ac33d3a..bf7f399b10 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java @@ -108,6 +108,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { private final DateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); private final Stack> actualPath = new Stack<>(); + private int augmentOrder; private void addNodeToPath(QName name) { actualPath.peek().push(name); @@ -327,7 +328,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { enterLog(AUGMENT_STR, augmentPath, line); actualPath.push(new Stack()); - AugmentationSchemaBuilder builder = moduleBuilder.addAugment(line, augmentPath); + AugmentationSchemaBuilder builder = moduleBuilder.addAugment(line, augmentPath, augmentOrder++); for (int i = 0; i < ctx.getChildCount(); i++) { ParseTree child = ctx.getChild(i); @@ -610,7 +611,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String augmentPath = stringFromNode(ctx); enterLog(AUGMENT_STR, augmentPath, line); - AugmentationSchemaBuilder builder = moduleBuilder.addAugment(line, augmentPath); + AugmentationSchemaBuilder builder = moduleBuilder.addAugment(line, augmentPath, augmentOrder++); for (int i = 0; i < ctx.getChildCount(); i++) { ParseTree child = ctx.getChild(i); 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 ed33bac1e9..ed3ddd6aff 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 @@ -7,21 +7,12 @@ */ package org.opendaylight.yangtools.yang.parser.util; -import java.net.URI; import java.util.Comparator; -import java.util.Date; - -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. */ @@ -35,61 +26,10 @@ public final class Comparators { private Comparators() { } - private static final class QNameComparator implements Comparator { - @Override - public int compare(QName o1, QName o2) { - return o1.getLocalName().compareTo(o2.getLocalName()); - } - } - private static final class SchemaNodeComparator implements Comparator { @Override public int compare(SchemaNode o1, SchemaNode o2) { - QName q1 = o1.getQName(); - QName q2 = o2.getQName(); - int result = q1.getLocalName().compareTo(q2.getLocalName()); - if (result == 0) { - URI ns1 = q1.getNamespace(); - URI ns2 = q2.getNamespace(); - if (ns1 == null && ns2 == null) { - Date rev1 = q1.getRevision(); - Date rev2 = q2.getRevision(); - - if (rev1 == null && rev2 == null) { - String p1 = q1.getPrefix(); - String p2 = q2.getPrefix(); - if (p1 == null && p2 == null) { - throw new IllegalArgumentException("Failed to sort nodes: " + o1 + ", " + o2); - } - if (p1 == null || p2 == null) { - if (p1 == null) { - return -1; - } else { - return 1; - } - } - return p1.compareTo(p2); - } - if (rev1 == null || rev2 == null) { - if (rev1 == null) { - return -1; - } else { - return -2; - } - } - return rev1.compareTo(rev2); - } - if (ns1 == null || ns2 == null) { - if (ns1 == null) { - return -1; - } else { - return 1; - } - } - return ns1.toString().compareTo(ns2.toString()); - } else { - return result; - } + return o1.getQName().compareTo(o2.getQName()); } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java index 311d506e0f..2b3e29bb7f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.parser.util; import java.util.ArrayList; import java.util.Collections; import java.util.List; - import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; @@ -404,7 +403,7 @@ public final class CopyUtils { private static AugmentationSchemaBuilder copyAugment(final AugmentationSchemaBuilder old, final Builder newParent) { AugmentationSchemaBuilderImpl copy = new AugmentationSchemaBuilderImpl(newParent.getModuleName(), - newParent.getLine(), old.getTargetPathAsString()); + newParent.getLine(), old.getTargetPathAsString(), old.getOrder()); copy.setParent(newParent); copy.setCopyOf(old); copy.setDescription(old.getDescription()); -- 2.36.6