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%2Fmapping%2Fconfig%2FConfig.java;h=3a5fa1170fec28922155e8e7b2748eb7393448b5;hb=576aa6018e48dfca8f223b7ac929139a32135201;hp=8c7621a24b4ad707b293373e7cf596d1b04b8262;hpb=4f623c74a703a31e787387b536981dcb344ca4f9;p=controller.git diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Config.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Config.java index 8c7621a24b..3a5fa1170f 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Config.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Config.java @@ -8,66 +8,74 @@ package org.opendaylight.controller.netconf.confignetconfconnector.mapping.config; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; +import org.opendaylight.controller.config.api.ServiceReferenceReadableRegistry; import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; +import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditStrategyType; import org.opendaylight.controller.netconf.util.xml.XmlElement; import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.management.ObjectName; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import static com.google.common.base.Preconditions.checkState; import static java.lang.String.format; public class Config { + private final Logger logger = LoggerFactory.getLogger(Config.class); - private final Map> moduleConfigs; + private final Map> moduleConfigs; + private final Map moduleNamesToConfigs; public Config(Map> moduleConfigs) { this.moduleConfigs = moduleConfigs; + Map moduleNamesToConfigs = new HashMap<>(); + for (Entry> entry : moduleConfigs.entrySet()) { + moduleNamesToConfigs.putAll(entry.getValue()); + } + this.moduleNamesToConfigs = Collections.unmodifiableMap(moduleNamesToConfigs); } - private Map>> getMappedInstances(Set instancesToMap, - Services serviceTracker) { + public static Map>> getMappedInstances(Set instancesToMap, + Map> configs) { Multimap moduleToInstances = mapInstancesToModules(instancesToMap); Map>> retVal = Maps.newLinkedHashMap(); - for (String namespace : moduleConfigs.keySet()) { + for (String namespace : configs.keySet()) { Map> innerRetVal = Maps.newHashMap(); - for (Entry mbeEntry : moduleConfigs.get(namespace).entrySet()) { + for (Entry mbeEntry : configs.get(namespace).entrySet()) { String moduleName = mbeEntry.getKey(); Collection instances = moduleToInstances.get(moduleName); + // TODO, this code does not support same module names from different namespaces + // Namespace should be present in ObjectName + if (instances == null) continue; innerRetVal.put(moduleName, instances); - // All found instances add to service tracker in advance - // This way all instances will be serialized as all available - // services when get-config is triggered - // (even if they are not used as services by other onstances) - // = more user friendly - addServices(serviceTracker, instances, mbeEntry.getValue().getProvidedServices()); - } retVal.put(namespace, innerRetVal); @@ -75,15 +83,6 @@ public class Config { return retVal; } - private void addServices(Services serviceTracker, Collection instances, - Collection providedServices) { - for (ObjectName instanceOn : instances) { - for (String serviceName : providedServices) { - serviceTracker.addServiceEntry(serviceName, instanceOn); - } - } - } - private static Multimap mapInstancesToModules(Set instancesToMap) { Multimap retVal = HashMultimap.create(); @@ -100,11 +99,10 @@ public class Config { // } public Element toXml(Set instancesToMap, Optional maybeNamespace, Document document, - Element dataElement) { - Services serviceTracker = new Services(); + Element dataElement, Services serviceTracker) { Map>> moduleToInstances = getMappedInstances(instancesToMap, - serviceTracker); + moduleConfigs); Element root = dataElement; if (maybeNamespace.isPresent()) { @@ -138,6 +136,7 @@ public class Config { return root; } + // TODO remove commented modules from output private void addEmptyModulesCommented(Document document, Element root, String moduleNamespace, Entry> moduleMappingEntry) { Element emptyModule = document.createElement(XmlNetconfConstants.MODULE_KEY); @@ -152,21 +151,41 @@ public class Config { // TODO refactor, replace string representing namespace with namespace class // TODO refactor, replace Map->Multimap with e.g. ConfigElementResolved // class - public Map> fromXml(XmlElement xml) { + public ConfigElementResolved fromXml(XmlElement xml, + EditStrategyType defaultEditStrategyType, ServiceReferenceReadableRegistry taClient) { Map> retVal = Maps.newHashMap(); List recognisedChildren = Lists.newArrayList(); - Services serviceTracker = fromXmlServices(xml, recognisedChildren); + Services serviceTracker = fromXmlServices(xml, recognisedChildren, taClient); List moduleElements = fromXmlModules(xml, recognisedChildren); xml.checkUnrecognisedElements(recognisedChildren); for (XmlElement moduleElement : moduleElements) { - resolveModule(retVal, serviceTracker, moduleElement); + resolveModule(retVal, serviceTracker, moduleElement, defaultEditStrategyType); } - return retVal; + return new ConfigElementResolved(retVal, serviceTracker); + } + + public static class ConfigElementResolved { + + private final Map> resolvedModules; + private final Services services; + + public ConfigElementResolved(Map> retVal, Services serviceTracker) { + this.resolvedModules = retVal; + this.services = serviceTracker; + } + + public Map> getResolvedModules() { + return resolvedModules; + } + + public Services getServices() { + return services; + } } private List fromXmlModules(XmlElement xml, List recognisedChildren) { @@ -184,7 +203,7 @@ public class Config { } private void resolveModule(Map> retVal, Services serviceTracker, - XmlElement moduleElement) { + XmlElement moduleElement, EditStrategyType defaultStrategy) { XmlElement typeElement = moduleElement.getOnlyChildElementWithSameNamespace(XmlNetconfConstants.TYPE_KEY); Entry prefixToNamespace = typeElement.findNamespaceOfTextContent(); String moduleNamespace = prefixToNamespace.getValue(); @@ -203,24 +222,26 @@ public class Config { } ModuleElementResolved moduleElementResolved = moduleMapping.fromXml(moduleElement, serviceTracker, - instanceName, moduleNamespace); + instanceName, moduleNamespace, defaultStrategy); innerMap.put(factoryName, moduleElementResolved); } - private Services fromXmlServices(XmlElement xml, List recognisedChildren) { + private Services fromXmlServices(XmlElement xml, List recognisedChildren, + ServiceReferenceReadableRegistry taClient) { Optional servicesElement = xml.getOnlyChildElementOptionally(XmlNetconfConstants.SERVICES_KEY, XmlNetconfConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG); - Map> mappedServices; + Map>> mappedServices; if (servicesElement.isPresent()) { mappedServices = Services.fromXml(servicesElement.get()); recognisedChildren.add(servicesElement.get()); } else { mappedServices = new HashMap<>(); } + Services services = Services.resolveServices(mappedServices, taClient); - return Services.resolveServices(mappedServices); + return services; } private String getFactoryName(String factoryNameWithPrefix, String prefixOrEmptyString) {