X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fconfig-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fconfignetconfconnector%2Fosgi%2FYangStoreSnapshot.java;h=283ec424badac4a18703044cd95175f5b0aeef88;hb=95115ca49f3b16b936e0f6c88aedfc17cd0ee92c;hp=0454bad4baec1651c6b0d84ba3c52e231ab6251a;hpb=57f507d105b1daa9aa9663ca5ec6d258251fca2e;p=controller.git diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/YangStoreSnapshot.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/YangStoreSnapshot.java index 0454bad4ba..283ec424ba 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/YangStoreSnapshot.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/YangStoreSnapshot.java @@ -5,37 +5,148 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ + package org.opendaylight.controller.netconf.confignetconfconnector.osgi; +import com.google.common.base.Optional; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.NoSuchElementException; +import java.util.Set; import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; +import org.opendaylight.controller.config.yangjmxgenerator.PackageTranslator; +import org.opendaylight.controller.config.yangjmxgenerator.ServiceInterfaceEntry; +import org.opendaylight.controller.config.yangjmxgenerator.TypeProviderWrapper; +import org.opendaylight.yangtools.sal.binding.yang.types.TypeProviderImpl; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import java.util.Map; -import java.util.Set; +final class YangStoreSnapshot implements YangStoreContext { + private static final Logger LOG = LoggerFactory.getLogger(YangStoreSnapshot.class); + + + private final Map> moduleMXBeanEntryMap; + + + private final Map> qNamesToIdentitiesToModuleMXBeanEntries; + + private final SchemaContext schemaContext; + + public YangStoreSnapshot(final SchemaContext resolveSchemaContext) { + LOG.trace("Resolved modules:{}", resolveSchemaContext.getModules()); + this.schemaContext = resolveSchemaContext; + // JMX generator + + Map namespaceToPackageMapping = Maps.newHashMap(); + PackageTranslator packageTranslator = new PackageTranslator(namespaceToPackageMapping); + Map qNamesToSIEs = new HashMap<>(); + Map knownSEITracker = new HashMap<>(); + // create SIE structure qNamesToSIEs + for (Module module : resolveSchemaContext.getModules()) { + String packageName = packageTranslator.getPackageName(module); + Map namesToSIEntries = ServiceInterfaceEntry + .create(module, packageName, knownSEITracker); + for (Entry sieEntry : namesToSIEntries.entrySet()) { + // merge value into qNamesToSIEs + if (qNamesToSIEs.containsKey(sieEntry.getKey()) == false) { + qNamesToSIEs.put(sieEntry.getKey(), sieEntry.getValue()); + } else { + throw new IllegalStateException("Cannot add two SIE with same qname " + + sieEntry.getValue()); + } + } + } + + Map> moduleMXBeanEntryMap = Maps.newHashMap(); + + Map> qNamesToIdentitiesToModuleMXBeanEntries = new HashMap<>(); -public interface YangStoreSnapshot extends AutoCloseable { - /** - * @deprecated Use {@link #getQNamesToIdentitiesToModuleMXBeanEntries()} instead. This method return only one - * module representation even if multiple revisions are available. - */ - @Deprecated - Map> getModuleMXBeanEntryMap(); + for (Module module : schemaContext.getModules()) { + String packageName = packageTranslator.getPackageName(module); + TypeProviderWrapper typeProviderWrapper = new TypeProviderWrapper( + new TypeProviderImpl(resolveSchemaContext)); + QName qName = QName.create(module.getNamespace(), module.getRevision(), module.getName()); + + Map namesToMBEs = + Collections.unmodifiableMap(ModuleMXBeanEntry.create(module, qNamesToSIEs, resolveSchemaContext, + typeProviderWrapper, packageName)); + moduleMXBeanEntryMap.put(module.getNamespace().toString(), namesToMBEs); + + qNamesToIdentitiesToModuleMXBeanEntries.put(qName, namesToMBEs); + } + this.moduleMXBeanEntryMap = Collections.unmodifiableMap(moduleMXBeanEntryMap); + this.qNamesToIdentitiesToModuleMXBeanEntries = Collections.unmodifiableMap(qNamesToIdentitiesToModuleMXBeanEntries); + + } + + @Override + public Map> getModuleMXBeanEntryMap() { + return moduleMXBeanEntryMap; + } + + @Override + public Map> getQNamesToIdentitiesToModuleMXBeanEntries() { + return qNamesToIdentitiesToModuleMXBeanEntries; + } + + @Override + public Set getModules() { + final Set modules = Sets.newHashSet(schemaContext.getModules()); + for (final Module module : schemaContext.getModules()) { + modules.addAll(module.getSubmodules()); + } + return modules; + } + + @Override + public String getModuleSource(final org.opendaylight.yangtools.yang.model.api.ModuleIdentifier moduleIdentifier) { + final Optional moduleSource = schemaContext.getModuleSource(moduleIdentifier); + if(moduleSource.isPresent()) { + return moduleSource.get(); + } else { + try { + return Iterables.find(getModules(), new Predicate() { + @Override + public boolean apply(final Module input) { + final ModuleIdentifierImpl id = new ModuleIdentifierImpl(input.getName(), Optional.fromNullable(input.getNamespace()), Optional.fromNullable(input.getRevision())); + return id.equals(moduleIdentifier); + } + }).getSource(); + } catch (final NoSuchElementException e) { + throw new IllegalArgumentException("Source for yang module " + moduleIdentifier + " not found", e); + } + } + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; - Map> getQNamesToIdentitiesToModuleMXBeanEntries(); + final YangStoreSnapshot that = (YangStoreSnapshot) o; - /** - * Get all modules discovered when this snapshot was created. - * @return all modules discovered. If one module exists with two different revisions, return both. - */ - Set getModules(); + if (schemaContext != null ? !schemaContext.equals(that.schemaContext) : that.schemaContext != null) + return false; - String getModuleSource(ModuleIdentifier moduleIdentifier); + return true; + } @Override - void close(); + public int hashCode() { + return schemaContext != null ? schemaContext.hashCode() : 0; + } }