Minor code cleanups
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / leafref / LeafRefPathParserListenerImpl.java
index b1762982a7ad6f1c5725107f09594ecd78707cc4..078abd2067fba0bbf901f0514f6112bc59604842 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -7,16 +7,16 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.leafref;
 
-import com.google.common.base.Function;
+import static com.google.common.base.Preconditions.checkArgument;
+
 import com.google.common.collect.Lists;
-import java.net.URI;
-import java.util.Date;
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
+import java.util.Optional;
 import org.antlr.v4.runtime.tree.TerminalNode;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefPathParser.IdentifierContext;
 import org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefPathParser.Node_identifierContext;
 import org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefPathParser.Path_argContext;
@@ -30,116 +30,108 @@ import org.opendaylight.yangtools.yang.model.api.ModuleImport;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 
+final class LeafRefPathParserListenerImpl extends LeafRefPathParserBaseListener {
 
-
-final class LeafRefPathParserListenerImpl extends LeafRefPathParserBaseListener{
-
+    private final List<QNameWithPredicateBuilder> leafRefPathQnameList = new ArrayList<>();
     private final SchemaContext schemaContext;
     private final Module module;
-    private LeafRefPath leafRefPath;
-    private boolean relativePath=false;
+    private final Module leafrefModule;
+    // FIXME: use for identifier path completion
+    private final SchemaNode node;
+
+    private ParsingState currentParsingState = ParsingState.LEAF_REF_PATH;
+    private List<QNameWithPredicateBuilder> predicatePathKeyQnameList;
     private QNameWithPredicateBuilder currentLeafRefPathQName;
     private QNamePredicateBuilder currentPredicate;
     private QNameModule currentQnameModule;
     private String currentQNameLocalName;
-    private final List<QNameWithPredicateBuilder> leafRefPathQnameList;
-    private List<QNameWithPredicateBuilder> predicatePathKeyQnameList;
-    private final SchemaNode node; //FIXME use for identifier path completion
-    private ParsingState currentParsingState;
-
-    Function<QNameWithPredicateBuilder, QNameWithPredicate> build = new Function<QNameWithPredicateBuilder, QNameWithPredicate>() {
-        @Override
-        public QNameWithPredicate apply(final QNameWithPredicateBuilder builder) {
-           return builder.build();
-        }
-     };
+    private LeafRefPath leafRefPath;
+    private boolean relativePath = false;
 
     private enum ParsingState {
         LEAF_REF_PATH, PATH_PREDICATE, PREDICATE_PATH_EQUALITY_EXPR, PATH_KEY_EXPR
     }
 
-    public LeafRefPathParserListenerImpl(final SchemaContext schemaContext, final Module currentModule, final SchemaNode currentNode) {
-       this.schemaContext = schemaContext;
-       this.module = currentModule;
-       this.leafRefPathQnameList = new LinkedList<QNameWithPredicateBuilder>();
-       this.node=currentNode;
-       this.currentParsingState = ParsingState.LEAF_REF_PATH;
+    LeafRefPathParserListenerImpl(final SchemaContext schemaContext, final Module leafrefModule,
+            final SchemaNode currentNode) {
+        this.schemaContext = schemaContext;
+        this.module = schemaContext.findModule(currentNode.getQName().getModule()).get();
+        this.leafrefModule = leafrefModule;
+        this.node = currentNode;
     }
 
     @Override
     public void enterPath_predicate(final Path_predicateContext ctx) {
-        currentParsingState=ParsingState.PATH_PREDICATE;
+        currentParsingState = ParsingState.PATH_PREDICATE;
         currentPredicate = new QNamePredicateBuilder();
     }
 
-
     @Override
     public void exitPath_predicate(final Path_predicateContext ctx) {
         currentLeafRefPathQName.addQNamePredicate(currentPredicate.build());
         currentPredicate = null;
-        currentParsingState=ParsingState.LEAF_REF_PATH;
+        currentParsingState = ParsingState.LEAF_REF_PATH;
     }
 
 
     @Override
     public void enterRel_path_keyexpr(final Rel_path_keyexprContext ctx) {
-        currentParsingState=ParsingState.PATH_KEY_EXPR;
-        predicatePathKeyQnameList = new LinkedList<QNameWithPredicateBuilder>();
+        currentParsingState = ParsingState.PATH_KEY_EXPR;
+
         final List<TerminalNode> dots = ctx.DOTS();
-        for (final TerminalNode parent : dots) {
+        predicatePathKeyQnameList = new ArrayList<>(dots.size());
+        for (int i = 0; i < dots.size(); ++i) {
             predicatePathKeyQnameList.add(QNameWithPredicateBuilder.UP_PARENT_BUILDER);
         }
     }
 
-
     @Override
     public void exitRel_path_keyexpr(final Rel_path_keyexprContext ctx) {
-
-        final LeafRefPath pathKeyExpression = LeafRefPath.create(Lists.transform(predicatePathKeyQnameList, build), false);
+        final LeafRefPath pathKeyExpression = LeafRefPath.create(Lists.transform(predicatePathKeyQnameList,
+            QNameWithPredicateBuilder::build), false);
         currentPredicate.setPathKeyExpression(pathKeyExpression);
 
-        currentParsingState=ParsingState.PREDICATE_PATH_EQUALITY_EXPR;
+        currentParsingState = ParsingState.PREDICATE_PATH_EQUALITY_EXPR;
     }
 
     @Override
     public void enterRelative_path(final Relative_pathContext ctx) {
-
         relativePath = true;
         final List<TerminalNode> dots = ctx.DOTS();
-        for (final TerminalNode parent : dots) {
+        for (int i = 0; i < dots.size(); ++i) {
             leafRefPathQnameList.add(QNameWithPredicateBuilder.UP_PARENT_BUILDER);
         }
-
     }
 
     @Override
     public void enterPath_equality_expr(final Path_equality_exprContext ctx) {
-        currentParsingState=ParsingState.PREDICATE_PATH_EQUALITY_EXPR;
+        currentParsingState = ParsingState.PREDICATE_PATH_EQUALITY_EXPR;
     }
 
-
     @Override
     public void exitPath_equality_expr(final Path_equality_exprContext ctx) {
-
-        currentParsingState=ParsingState.PATH_PREDICATE;
+        currentParsingState = ParsingState.PATH_PREDICATE;
     }
 
     @Override
     public void enterPrefix(final PrefixContext ctx) {
-
-        if (module.getPrefix().equals(ctx.getText())) {
-            currentQnameModule = module.getQNameModule();
+        final String prefix = ctx.getText();
+        if (!leafrefModule.getPrefix().equals(prefix)) {
+            final Optional<QNameModule> qnameModuleOpt = getQNameModuleForImportPrefix(leafrefModule, prefix);
+            checkArgument(qnameModuleOpt.isPresent(), "No module import for prefix: %s in module: %s", prefix,
+                leafrefModule.getName());
+            currentQnameModule = qnameModuleOpt.get();
         } else {
-            currentQnameModule = getQNameModuleForImportPrefix(ctx.getText());
+            currentQnameModule = leafrefModule.getQNameModule();
         }
     }
 
     @Override
     public void exitPath_arg(final Path_argContext ctx) {
-        leafRefPath = LeafRefPath.create(Lists.transform(leafRefPathQnameList,build), !relativePath);
+        leafRefPath = LeafRefPath.create(Lists.transform(leafRefPathQnameList, QNameWithPredicateBuilder::build),
+            !relativePath);
     }
 
-
     @Override
     public void enterIdentifier(final IdentifierContext ctx) {
         currentQNameLocalName = ctx.getText();
@@ -147,19 +139,19 @@ final class LeafRefPathParserListenerImpl extends LeafRefPathParserBaseListener{
 
     @Override
     public void exitNode_identifier(final Node_identifierContext ctx) {
-
         if (currentQnameModule == null) {
-            currentQnameModule = module.getQNameModule();
+            if (relativePath) {
+                currentQnameModule = module.getQNameModule();
+            } else {
+                currentQnameModule = leafrefModule.getQNameModule();
+            }
         }
 
         if (currentParsingState == ParsingState.PREDICATE_PATH_EQUALITY_EXPR) {
-            final QName qname = QName.create(currentQnameModule,
-                    currentQNameLocalName);
-            currentPredicate.setIdentifier(qname);
+            currentPredicate.setIdentifier(QName.create(currentQnameModule, currentQNameLocalName));
         } else {
-
-            final QNameWithPredicateBuilder qnameBuilder = new QNameWithPredicateBuilder(
-                    currentQnameModule, currentQNameLocalName);
+            final QNameWithPredicateBuilder qnameBuilder = new QNameWithPredicateBuilder(currentQnameModule,
+                currentQNameLocalName);
 
             if (currentParsingState == ParsingState.PATH_KEY_EXPR) {
                 predicatePathKeyQnameList.add(qnameBuilder);
@@ -176,40 +168,19 @@ final class LeafRefPathParserListenerImpl extends LeafRefPathParserBaseListener{
         return leafRefPath;
     }
 
-
-    private URI getNamespaceForImportPrefix(final String prefix){
-        final ModuleImport moduleImport = getModuleImport(prefix);
-        final Module findedModule = schemaContext.findModuleByName(moduleImport.getModuleName(), moduleImport.getRevision());
-
-        return findedModule.getNamespace();
-    }
-
-    private QNameModule getQNameModuleForImportPrefix(final String prefix) {
-        final ModuleImport moduleImport = getModuleImport(prefix);
-
+    private Optional<QNameModule> getQNameModuleForImportPrefix(final Module targetModule, final String prefix) {
+        final ModuleImport moduleImport = getModuleImport(targetModule, prefix);
         if (moduleImport == null) {
-            throw new LeafRefPathParseException("No module import for prefix: "
-                    + prefix + " in module: " + module.getName());
+            return Optional.empty();
         }
 
         final String moduleName = moduleImport.getModuleName();
-        final Date revision = moduleImport.getRevision();
-        final Module findedModule = schemaContext.findModuleByName(moduleName,
-                revision);
-
-        return findedModule.getQNameModule();
+        final Optional<Revision> revision = moduleImport.getRevision();
+        return schemaContext.findModule(moduleName, revision).map(Module::getQNameModule);
     }
 
-
-    private ModuleImport getModuleImport(final String prefix) {
-        final Set<ModuleImport> imports = module.getImports();
-
-        for (final ModuleImport moduleImport : imports) {
-            if(moduleImport.getPrefix().equals(prefix)) {
-                return moduleImport;
-            }
-        }
-        return null;
+    private static ModuleImport getModuleImport(final Module targetModule, final String prefix) {
+        return targetModule.getImports().stream()
+            .filter(imp -> prefix.equals(imp.getPrefix())).findFirst().orElse(null);
     }
-
 }