-/**
+/*
* Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
*/
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;
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<>();
- 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<>();
+ 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();
@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);
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);
}
-
}