@Override protected boolean isKnown(final Collection<SourceIdentifier> haystack, final ModuleImport mi) { final SourceIdentifier msi = RevisionSourceIdentifier.create(mi.getModuleName(), mi.getRevision()); // Quick lookup if (haystack.contains(msi)) { return true; } // Slow revision-less walk return !mi.getRevision().isPresent() && findWildcard(haystack, mi.getModuleName()) != null; }
@Override protected boolean isKnown(final Collection<SourceIdentifier> haystack, final ModuleImport mi) { final SourceIdentifier msi = RevisionSourceIdentifier.create(mi.getModuleName(), mi.getRevision()); // Quick lookup if (haystack.contains(msi)) { return true; } // Slow revision-less walk return !mi.getRevision().isPresent() && findWildcard(haystack, mi.getModuleName()) != null; }
private Optional<QNameModule> getQNameModuleForImportPrefix(final Module targetModule, final String prefix) { final ModuleImport moduleImport = getModuleImport(targetModule, prefix); if (moduleImport == null) { return Optional.empty(); } final String moduleName = moduleImport.getModuleName(); final Optional<Revision> revision = moduleImport.getRevision(); return schemaContext.findModule(moduleName, revision).map(Module::getQNameModule); }
private Module findModuleFromImports(final Set<ModuleImport> imports, final String prefix) { for (final ModuleImport imp : imports) { if (imp.getPrefix().equals(prefix)) { return schemaContext.findModule(imp.getModuleName(), imp.getRevision()).orElse(null); } } return null; }
private Optional<QNameModule> getQNameModuleForImportPrefix(final Module targetModule, final String prefix) { final ModuleImport moduleImport = getModuleImport(targetModule, prefix); if (moduleImport == null) { return Optional.empty(); } final String moduleName = moduleImport.getModuleName(); final Optional<Revision> revision = moduleImport.getRevision(); return schemaContext.findModule(moduleName, revision).map(Module::getQNameModule); }
private Module findModuleFromImports(final Set<ModuleImport> imports, final String prefix) { for (final ModuleImport imp : imports) { if (imp.getPrefix().equals(prefix)) { return schemaContext.findModuleByName(imp.getModuleName(), imp.getRevision()); } } return null; }
@Override protected boolean isKnown(final Collection<SourceIdentifier> haystack, final ModuleImport mi) { final SemVerSourceIdentifier msi = SemVerSourceIdentifier.create(mi.getModuleName(), mi.getRevision(), mi.getSemanticVersion().orElse(null)); // Quick lookup if (haystack.contains(msi)) { return true; } // Slow revision-less walk return findCompatibleVersion(haystack, mi) != null; }
private static ServiceInterfaceEntry findSIE(final String prefixAndIdentityLocalName, final Module currentModule, final Map<QName, ServiceInterfaceEntry> qNamesToSIEs, final SchemaContext schemaContext) { Matcher m = PREFIX_COLON_LOCAL_NAME.matcher(prefixAndIdentityLocalName); Module foundModule; String localSIName; if (m.matches()) { // if there is a prefix, look for ModuleImport with this prefix. Get // Module from SchemaContext String prefix = m.group(1); ModuleImport moduleImport = findModuleImport(currentModule, prefix); foundModule = schemaContext.findModuleByName(moduleImport.getModuleName(), moduleImport.getRevision()); checkNotNull(foundModule, format("Module not found in SchemaContext by %s", moduleImport)); localSIName = m.group(2); } else { foundModule = currentModule; // no prefix => SIE is in currentModule localSIName = prefixAndIdentityLocalName; } QName siQName = QName.create(foundModule.getNamespace(), foundModule.getRevision(), localSIName); ServiceInterfaceEntry sie = qNamesToSIEs.get(siQName); checkState(sie != null, "Cannot find referenced Service Interface by " + prefixAndIdentityLocalName); return sie; }
@Override protected boolean isKnown(final Collection<SourceIdentifier> haystack, final ModuleImport mi) { final SemVerSourceIdentifier msi = SemVerSourceIdentifier.create(mi.getModuleName(), mi.getRevision(), mi.getSemanticVersion().orElse(null)); // Quick lookup if (haystack.contains(msi)) { return true; } // Slow revision-less walk return findCompatibleVersion(haystack, mi) != null; }
private QName createQName(final String prefix, final String localName) { final Module module = schemaContext.findModule(schemaNode.getQName().getModule()).get(); if (prefix.isEmpty() || module.getPrefix().equals(prefix)) { return QName.create(module.getQNameModule(), localName); } for (final ModuleImport moduleImport : module.getImports()) { if (prefix.equals(moduleImport.getPrefix())) { final Module importedModule = schemaContext.findModule(moduleImport.getModuleName(), moduleImport.getRevision()).get(); return QName.create(importedModule.getQNameModule(),localName); } } throw new IllegalArgumentException(String.format("Failed to lookup a module for prefix %s", prefix)); }
private QName createQName(final String prefix, final String localName) { final Module module = schemaContext.findModule(schemaNode.getQName().getModule()).get(); if (prefix.isEmpty() || module.getPrefix().equals(prefix)) { return QName.create(module.getQNameModule(), localName); } for (final ModuleImport moduleImport : module.getImports()) { if (prefix.equals(moduleImport.getPrefix())) { final Module importedModule = schemaContext.findModule(moduleImport.getModuleName(), moduleImport.getRevision()).get(); return QName.create(importedModule.getQNameModule(),localName); } } throw new IllegalArgumentException(String.format("Failed to lookup a module for prefix %s", prefix)); }
for (final ModuleImport mi : imports) { if (prefix.equals(mi.getPrefix())) { return context.findModule(mi.getModuleName(), mi.getRevision()).orElse(null);
private static Collection<Module> getImportedModules(final Map<ModuleId, Module> allModules, final Set<Module> baseModules, final TreeMultimap<String, Module> nameToModulesAll) { List<Module> relatedModules = Lists.newLinkedList(); for (Module module : baseModules) { for (ModuleImport moduleImport : module.getImports()) { Optional<Revision> revisionDate = moduleImport.getRevision(); if (!revisionDate.isPresent()) { revisionDate = nameToModulesAll.get(moduleImport.getModuleName()).first().getRevision(); } ModuleId key = new ModuleId(moduleImport.getModuleName(), revisionDate); Module importedModule = allModules.get(key); Preconditions.checkArgument(importedModule != null, "Invalid schema, cannot find imported module: %s from module: %s, %s, modules:%s", key, module.getQNameModule(), module.getName(), allModules); relatedModules.add(importedModule); //calling imports recursive relatedModules.addAll(getImportedModules(allModules, Collections.singleton(importedModule), nameToModulesAll)); } } return relatedModules; }
private boolean checkModuleDependency(final Module module, final Collection<ModuleId> rootModules) { for (ModuleId rootModule : rootModules) { if (rootModule.equals(new ModuleId(module.getName(), module.getRevision()))) { return true; } //handling/checking imports regarding root modules for (ModuleImport moduleImport : module.getImports()) { if (moduleImport.getModuleName().equals(rootModule.getName())) { return !moduleImport.getRevision().isPresent() || moduleImport.getRevision().equals(rootModule.getRev()); } } //submodules handling for (Module moduleSub : module.getSubmodules()) { return checkModuleDependency(moduleSub, rootModules); } } return false; }
private boolean checkModuleDependency(final Module module, final Collection<ModuleId> rootModules) { for (ModuleId rootModule : rootModules) { if (rootModule.equals(new ModuleId(module.getName(), module.getRevision()))) { return true; } //handling/checking imports regarding root modules for (ModuleImport moduleImport : module.getImports()) { if (moduleImport.getModuleName().equals(rootModule.getName())) { return !moduleImport.getRevision().isPresent() || moduleImport.getRevision().equals(rootModule.getRev()); } } //submodules handling for (Module moduleSub : module.getSubmodules()) { return checkModuleDependency(moduleSub, rootModules); } } return false; }
private static Object qnameDomValueFromString(final Codec<Object, Object> codec, final DataSchemaNode schema, final String defaultValue, final SchemaContext schemaContext) { final int prefixEndIndex = defaultValue.indexOf(':'); if (prefixEndIndex != -1) { final String defaultValuePrefix = defaultValue.substring(0, prefixEndIndex); final Module module = schemaContext.findModule(schema.getQName().getModule()).get(); if (module.getPrefix().equals(defaultValuePrefix)) { return codec.deserialize(QName.create(module.getQNameModule(), defaultValue.substring(prefixEndIndex + 1))); } final Set<ModuleImport> imports = module.getImports(); for (final ModuleImport moduleImport : imports) { if (moduleImport.getPrefix().equals(defaultValuePrefix)) { final Module importedModule = schemaContext.findModule(moduleImport.getModuleName(), moduleImport.getRevision()).get(); return codec.deserialize(QName.create(importedModule.getQNameModule(), defaultValue.substring(prefixEndIndex + 1))); } } return null; } return codec.deserialize(QName.create(schema.getQName(), defaultValue)); }
private static Collection<Module> getImportedModules(final Map<ModuleId, Module> allModules, final Set<Module> baseModules, final TreeMultimap<String, Module> nameToModulesAll) { List<Module> relatedModules = Lists.newLinkedList(); for (Module module : baseModules) { for (ModuleImport moduleImport : module.getImports()) { Optional<Revision> revisionDate = moduleImport.getRevision(); if (!revisionDate.isPresent()) { revisionDate = nameToModulesAll.get(moduleImport.getModuleName()).first().getRevision(); } ModuleId key = new ModuleId(moduleImport.getModuleName(), revisionDate); Module importedModule = allModules.get(key); Preconditions.checkArgument(importedModule != null, "Invalid schema, cannot find imported module: %s from module: %s, %s, modules:%s", key, module.getQNameModule(), module.getName(), allModules); relatedModules.add(importedModule); //calling imports recursive relatedModules.addAll(getImportedModules(allModules, Collections.singleton(importedModule), nameToModulesAll)); } } return relatedModules; }
private void emitImport(final ModuleImport importNode) { super.writer.startImportNode(importNode.getModuleName()); emitDocumentedNode(importNode); emitPrefixNode(importNode.getPrefix()); importNode.getRevision().ifPresent(this::emitRevisionDateNode); super.writer.endNode(); }
private static Object qnameDomValueFromString(final Codec<Object, Object> codec, final DataSchemaNode schema, final String defaultValue, final SchemaContext schemaContext) { int prefixEndIndex = defaultValue.indexOf(':'); QName qname; if (prefixEndIndex != -1) { String defaultValuePrefix = defaultValue.substring(0, prefixEndIndex); Module module = schemaContext.findModule(schema.getQName().getModule()).get(); if (module.getPrefix().equals(defaultValuePrefix)) { qname = QName.create(module.getQNameModule(), defaultValue.substring(prefixEndIndex + 1)); return codec.deserialize(qname); } Set<ModuleImport> imports = module.getImports(); for (ModuleImport moduleImport : imports) { if (moduleImport.getPrefix().equals(defaultValuePrefix)) { Module importedModule = schemaContext.findModule(moduleImport.getModuleName(), moduleImport.getRevision()).get(); qname = QName.create(importedModule.getQNameModule(), defaultValue.substring(prefixEndIndex + 1)); return codec.deserialize(qname); } } return null; } qname = QName.create(schema.getQName(), defaultValue); return codec.deserialize(qname); }
/** * Create a prefix {@link Converter} for {@link XPathExpressionException} defined in a particular YANG * {@link Module} .Instantiation requires establishing how a module's imports are mapped to actual modules * and their namespaces. This information is cached and used for improved lookups. * * @param ctx A SchemaContext * @param module Module in which the XPath is defined * @return A new Converter */ public static @Nonnull Converter<String, QNameModule> create(final SchemaContext ctx, final Module module) { // Always check for null ctx requireNonNull(ctx, "Schema context may not be null"); // Use immutable map builder for detection of duplicates (which should never occur) final Builder<String, QNameModule> b = ImmutableBiMap.builder(); b.put(module.getPrefix(), module.getQNameModule()); for (ModuleImport i : module.getImports()) { final Optional<Module> mod = ctx.findModule(i.getModuleName(), i.getRevision()); checkArgument(mod.isPresent(), "Unsatisfied import of %s by module %s", i, module); b.put(i.getPrefix(), mod.get().getQNameModule()); } return Maps.asConverter(b.build()); } }