2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.netconf.confignetconfconnector.osgi;
11 import com.google.common.base.Optional;
12 import com.google.common.base.Preconditions;
13 import com.google.common.base.Predicate;
14 import com.google.common.collect.BiMap;
15 import com.google.common.collect.Iterables;
16 import com.google.common.collect.Maps;
17 import com.google.common.collect.Sets;
18 import java.util.Collections;
19 import java.util.HashMap;
21 import java.util.Map.Entry;
22 import java.util.NoSuchElementException;
24 import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
25 import org.opendaylight.controller.config.yangjmxgenerator.PackageTranslator;
26 import org.opendaylight.controller.config.yangjmxgenerator.ServiceInterfaceEntry;
27 import org.opendaylight.controller.config.yangjmxgenerator.TypeProviderWrapper;
28 import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext;
29 import org.opendaylight.yangtools.sal.binding.yang.types.TypeProviderImpl;
30 import org.opendaylight.yangtools.yang.common.QName;
31 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
32 import org.opendaylight.yangtools.yang.model.api.Module;
33 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
34 import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
38 final class YangStoreSnapshot implements YangStoreContext, EnumResolver {
39 private static final Logger LOG = LoggerFactory.getLogger(YangStoreSnapshot.class);
42 private final Map<String /* Namespace from yang file */,
43 Map<String /* Name of module entry from yang file */, ModuleMXBeanEntry>> moduleMXBeanEntryMap;
46 private final Map<QName, Map<String, ModuleMXBeanEntry>> qNamesToIdentitiesToModuleMXBeanEntries;
48 private final SchemaContext schemaContext;
49 private final BindingRuntimeContext bindingContextProvider;
51 public YangStoreSnapshot(final SchemaContext resolveSchemaContext, final BindingRuntimeContext bindingContextProvider) {
52 this.bindingContextProvider = bindingContextProvider;
53 LOG.trace("Resolved modules:{}", resolveSchemaContext.getModules());
54 this.schemaContext = resolveSchemaContext;
57 Map<String, String> namespaceToPackageMapping = Maps.newHashMap();
58 PackageTranslator packageTranslator = new PackageTranslator(namespaceToPackageMapping);
59 Map<QName, ServiceInterfaceEntry> qNamesToSIEs = new HashMap<>();
60 Map<IdentitySchemaNode, ServiceInterfaceEntry> knownSEITracker = new HashMap<>();
61 // create SIE structure qNamesToSIEs
62 for (Module module : resolveSchemaContext.getModules()) {
63 String packageName = packageTranslator.getPackageName(module);
64 Map<QName, ServiceInterfaceEntry> namesToSIEntries = ServiceInterfaceEntry
65 .create(module, packageName, knownSEITracker);
66 for (Entry<QName, ServiceInterfaceEntry> sieEntry : namesToSIEntries.entrySet()) {
67 // merge value into qNamesToSIEs
68 if (qNamesToSIEs.containsKey(sieEntry.getKey()) == false) {
69 qNamesToSIEs.put(sieEntry.getKey(), sieEntry.getValue());
71 throw new IllegalStateException("Cannot add two SIE with same qname "
72 + sieEntry.getValue());
77 Map<String, Map<String, ModuleMXBeanEntry>> moduleMXBeanEntryMap = Maps.newHashMap();
79 Map<QName, Map<String /* identity local name */, ModuleMXBeanEntry>> qNamesToIdentitiesToModuleMXBeanEntries = new HashMap<>();
82 for (Module module : schemaContext.getModules()) {
83 String packageName = packageTranslator.getPackageName(module);
84 TypeProviderWrapper typeProviderWrapper = new TypeProviderWrapper(
85 new TypeProviderImpl(resolveSchemaContext));
87 QName qName = QName.create(module.getNamespace(), module.getRevision(), module.getName());
89 Map<String /* MB identity local name */, ModuleMXBeanEntry> namesToMBEs =
90 Collections.unmodifiableMap(ModuleMXBeanEntry.create(module, qNamesToSIEs, resolveSchemaContext,
91 typeProviderWrapper, packageName));
92 moduleMXBeanEntryMap.put(module.getNamespace().toString(), namesToMBEs);
94 qNamesToIdentitiesToModuleMXBeanEntries.put(qName, namesToMBEs);
96 this.moduleMXBeanEntryMap = Collections.unmodifiableMap(moduleMXBeanEntryMap);
97 this.qNamesToIdentitiesToModuleMXBeanEntries = Collections.unmodifiableMap(qNamesToIdentitiesToModuleMXBeanEntries);
102 public Map<String, Map<String, ModuleMXBeanEntry>> getModuleMXBeanEntryMap() {
103 return moduleMXBeanEntryMap;
107 public Map<QName, Map<String, ModuleMXBeanEntry>> getQNamesToIdentitiesToModuleMXBeanEntries() {
108 return qNamesToIdentitiesToModuleMXBeanEntries;
112 public Set<Module> getModules() {
113 final Set<Module> modules = Sets.newHashSet(schemaContext.getModules());
114 for (final Module module : schemaContext.getModules()) {
115 modules.addAll(module.getSubmodules());
121 public String getModuleSource(final org.opendaylight.yangtools.yang.model.api.ModuleIdentifier moduleIdentifier) {
122 final Optional<String> moduleSource = schemaContext.getModuleSource(moduleIdentifier);
123 if(moduleSource.isPresent()) {
124 return moduleSource.get();
127 return Iterables.find(getModules(), new Predicate<Module>() {
129 public boolean apply(final Module input) {
130 final ModuleIdentifierImpl id = new ModuleIdentifierImpl(input.getName(), Optional.fromNullable(input.getNamespace()), Optional.fromNullable(input.getRevision()));
131 return id.equals(moduleIdentifier);
134 } catch (final NoSuchElementException e) {
135 throw new IllegalArgumentException("Source for yang module " + moduleIdentifier + " not found", e);
141 public EnumResolver getEnumResolver() {
146 public boolean equals(final Object o) {
147 if (this == o) return true;
148 if (o == null || getClass() != o.getClass()) return false;
150 final YangStoreSnapshot that = (YangStoreSnapshot) o;
152 if (schemaContext != null ? !schemaContext.equals(that.schemaContext) : that.schemaContext != null)
159 public int hashCode() {
160 return schemaContext != null ? schemaContext.hashCode() : 0;
164 public String fromYang(final String enumClass, final String enumYangValue) {
165 Preconditions.checkState(bindingContextProvider != null, "Binding context provider was not set yet");
166 final BiMap<String, String> enumMapping = bindingContextProvider.getEnumMapping(enumClass);
167 final String javaName = enumMapping.get(enumYangValue);
168 return Preconditions.checkNotNull(javaName, "Unable to resolve enum value %s for enum class %s with assumed enum mapping: %s", enumYangValue, enumClass, enumMapping);
172 public String toYang(final String enumClass, final String enumJavaValue) {
173 Preconditions.checkState(bindingContextProvider != null, "Binding context provider was not set yet");
174 final BiMap<String, String> enumMapping = bindingContextProvider.getEnumMapping(enumClass);
175 final String javaName = enumMapping.inverse().get(enumJavaValue);
176 return Preconditions.checkNotNull(javaName, "Unable to map enumcd .." +
177 "cd value %s for enum class %s with assumed enum mapping: %s", enumJavaValue, enumClass, enumMapping.inverse());