Refactored parsing of key in list schema node. 69/4569/1
authorMartin Vitez <mvitez@cisco.com>
Wed, 22 Jan 2014 11:22:50 +0000 (12:22 +0100)
committerMartin Vitez <mvitez@cisco.com>
Wed, 22 Jan 2014 11:24:35 +0000 (12:24 +0100)
Signed-off-by: Martin Vitez <mvitez@cisco.com>
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserListenerUtils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.xtend
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java

index e3bea979b456c964bc3271786f8935ed97679818..36e6638537f531343730dc83d457fb1e8d457818 100644 (file)
@@ -33,6 +33,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
         AugmentationTargetBuilder {
     private boolean isBuilt;
     private final ListSchemaNodeImpl instance;
+    private List<String> keys;
     // SchemaNode args
     private SchemaPath schemaPath;
     // DataSchemaNode args
@@ -194,6 +195,14 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
         return augmentationBuilders;
     }
 
+    public List<String> getKeys() {
+        return keys;
+    }
+
+    public void setKeys(final List<String> keys) {
+        this.keys = keys;
+    }
+
     public List<QName> getKeyDefinition() {
         return instance.keyDefinition;
     }
index 36ff7bfe6afae2ee856145a11f892b2d8e8f6764..9ff2faba1db50a8603afcd39ff0ef5286265f5ea 100644 (file)
@@ -77,6 +77,8 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
 
     private final List<UnknownSchemaNodeBuilder> allUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
 
+    private final List<ListSchemaNodeBuilder> allLists = new ArrayList<ListSchemaNodeBuilder>();
+
     public ModuleBuilder(final String name) {
         this(name, false);
     }
@@ -308,6 +310,10 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
         return allUnknownNodes;
     }
 
+    public List<ListSchemaNodeBuilder> getAllLists() {
+        return allLists;
+    }
+
     public String getName() {
         return name;
     }
@@ -416,6 +422,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
         Builder parent = getActualNode();
         builder.setParent(parent);
         addChildToParent(parent, builder, qname.getLocalName());
+        allLists.add(builder);
 
         return builder;
     }
index 73291d16ec06e40c8bbfa313eb7be358e93c6bd4..09862a464776a14882225d937db0e7487a99a86d 100644 (file)
@@ -40,15 +40,7 @@ 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.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.builder.impl.*;
 import org.opendaylight.yangtools.yang.parser.util.Comparators;
 import org.opendaylight.yangtools.yang.parser.util.GroupingSort;
 import org.opendaylight.yangtools.yang.parser.util.GroupingUtils;
@@ -488,6 +480,7 @@ public final class YangParserImpl implements YangModelParser {
         resolveUsesTargetGrouping(modules, null);
         resolveUsesForGroupings(modules, null);
         resolveUsesForNodes(modules, null);
+        resolveListsKey(modules);
         resolveAugments(modules, null);
         resolveDeviations(modules);
 
@@ -511,6 +504,7 @@ public final class YangParserImpl implements YangModelParser {
         resolveUsesTargetGrouping(modules, context);
         resolveUsesForGroupings(modules, context);
         resolveUsesForNodes(modules, context);
+        resolveListsKey(modules);
         resolveAugments(modules, context);
         resolveDeviationsWithContext(modules, context);
 
@@ -1059,6 +1053,28 @@ public final class YangParserImpl implements YangModelParser {
         }
     }
 
+    private void resolveListsKey(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
+            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
+                ModuleBuilder module = inner.getValue();
+                List<ListSchemaNodeBuilder> allLists = module.getAllLists();
+                for (ListSchemaNodeBuilder list : allLists) {
+                    List<String> keys = list.getKeys();
+                    if (keys == null) {
+                        list.setKeyDefinition(Collections.<QName> emptyList());
+                    } else {
+                        List<QName> qnames = new ArrayList<>();
+                        for (String key : keys) {
+                            qnames.add(list.getDataChildByName(key).getQName());
+                        }
+                        list.setKeyDefinition(qnames);
+                    }
+
+                }
+            }
+        }
+    }
+
     private void resolveUnknownNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
         for (UnknownSchemaNodeBuilder usnb : module.getAllUnknownNodes()) {
             QName nodeType = usnb.getNodeType();
index 12c230d5bc3894d649990fb7d458fd978a8e17a0..92d583f81c24df1b6cb418ae8e66b94f40fbc4d2 100644 (file)
@@ -657,7 +657,6 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         parseConstraints(ctx, builder.getConstraints());
         builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, line));
 
-        String keyDefinition = "";
         for (int i = 0; i < ctx.getChildCount(); ++i) {
             ParseTree childNode = ctx.getChild(i);
             if (childNode instanceof Ordered_by_stmtContext) {
@@ -665,9 +664,8 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
                 final boolean userOrdered = parseUserOrdered(orderedBy);
                 builder.setUserOrdered(userOrdered);
             } else if (childNode instanceof Key_stmtContext) {
-                keyDefinition = stringFromNode(childNode);
-                List<QName> key = createListKey(keyDefinition, namespace, revision, yangModelPrefix);
-                builder.setKeyDefinition(key);
+                List<String> key = createListKey((Key_stmtContext) childNode);
+                builder.setKeys(key);
             }
         }
     }
index 0718e0a6624d3e97d1ef388396067818f9e06baa..206e8f7ee5cd35bf6deac3e0f432b5bf0559e202 100644 (file)
@@ -37,6 +37,7 @@ import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Error_message_stmt
 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Fraction_digits_stmtContext;
 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Identityref_specificationContext;
 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Instance_identifier_specificationContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Key_stmtContext;
 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Leafref_specificationContext;
 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Length_stmtContext;
 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Mandatory_argContext;
@@ -146,7 +147,7 @@ public final class ParserListenerUtils {
                 final StringContext context = (StringContext) treeNode.getChild(i);
                 if (context != null) {
                     return stringFromStringContext(context);
-                    
+
                 }
             }
         }
@@ -295,32 +296,22 @@ public final class ParserListenerUtils {
     }
 
     /**
-     * Create java.util.List of QName objects from given key definition as
-     * string.
+     * Create java.util.List of key node names.
      *
      * @param keyDefinition
      *            key definition as string
-     * @param namespace
-     *            current namespace
-     * @param revision
-     *            current revision
-     * @param prefix
-     *            current prefix
-     * @return YANG list key as java.util.List of QName objects
+     * @return YANG list key as java.util.List of key node names
      */
-    public static List<QName> createListKey(final String keyDefinition, final URI namespace, final Date revision,
-            final String prefix) {
-        List<QName> key = new ArrayList<>();
+    public static List<String> createListKey(final Key_stmtContext ctx) {
+        String keyDefinition = stringFromNode(ctx);
+        List<String> keys = new ArrayList<>();
         String[] splittedKey = keyDefinition.split(" ");
-
-        QName qname;
         for (String keyElement : splittedKey) {
-            if (keyElement.length() != 0) {
-                qname = new QName(namespace, revision, prefix, keyElement);
-                key.add(qname);
+            if (!keyElement.isEmpty()) {
+                keys.add(keyElement);
             }
         }
-        return key;
+        return keys;
     }
 
     /**
@@ -1681,7 +1672,7 @@ public final class ParserListenerUtils {
         checkState(!potentialValues.isEmpty());
         return ParserListenerUtils.stringFromStringContext(potentialValues.get(0));
     }
-    
+
     public static <T extends ParserRuleContext> Optional<T> getFirstContext(ParserRuleContext context,Class<T> contextType) {
         List<T> potential = context.getRuleContexts(contextType);
         if(potential.isEmpty()) {
index 861778590e816e05ebc655caf393afcd34f1b33e..3ef0f1b06fd841ed3e3c1d474b7b4013599d1e8a 100644 (file)
@@ -379,7 +379,7 @@ public final class ParserUtils {
      */
     public static def boolean processAugmentation(AugmentationSchemaBuilder augment, ModuleBuilder firstNodeParent) {
         val path = augment.targetPath.path
-        var Builder targetNode = findSchemaNodeInModule(path, firstNodeParent as ModuleBuilder)
+        var Builder targetNode = findSchemaNodeInModule(path, firstNodeParent)
         if(targetNode === null) return false;
 
         if ((targetNode instanceof DataNodeContainerBuilder)) {
index e29cc9a07eab3b6905789182fb575a42790da4f0..ec51b47f68084ba53de0f9755cbebbed16fdd16a 100644 (file)
@@ -213,6 +213,7 @@ public class YangParserTest {
         assertEquals(0, ifEntry.getUses().size());
 
         LeafSchemaNode ifIndex = (LeafSchemaNode) ifEntry.getDataChildByName("ifIndex");
+        assertEquals(ifEntry.getKeyDefinition().get(0), ifIndex.getQName());
         assertTrue(ifIndex.getType() instanceof Uint32);
         LeafSchemaNode ifMtu = (LeafSchemaNode) ifEntry.getDataChildByName("ifMtu");
         assertTrue(ifMtu.getType() instanceof Int32);