/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2015, 2017 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
package org.opendaylight.controller.config.facade.xml.mapping.config;
import static com.google.common.base.Preconditions.checkState;
+
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import java.util.Collection;
import java.util.Collections;
-import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.opendaylight.controller.config.util.xml.XmlElement;
import org.opendaylight.controller.config.util.xml.XmlMappingConstants;
import org.opendaylight.controller.config.util.xml.XmlUtil;
+import org.opendaylight.yangtools.yang.common.Revision;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
public class Config {
private final Map<String/* Namespace from yang file */,
- Map<String /* Name of module entry from yang file */, ModuleConfig>> moduleConfigs;
+ Map<String /* Name of module entry from yang file */,
+ ModuleConfig>> moduleConfigs;
- private final Map<String, Map<Date, IdentityMapping>> identityMap;
+ private final Map<String, Map<Optional<Revision>, IdentityMapping>> identityMap;
private final EnumResolver enumResolver;
public Config(final Map<String, Map<String, ModuleConfig>> moduleConfigs, final EnumResolver enumResolver) {
- this(moduleConfigs, Collections.<String, Map<Date, IdentityMapping>>emptyMap(), enumResolver);
+ this(moduleConfigs, Collections.<String, Map<Optional<Revision>, IdentityMapping>>emptyMap(), enumResolver);
}
- public Config(final Map<String, Map<String, ModuleConfig>> moduleConfigs, final Map<String, Map<Date, IdentityMapping>> identityMap, final EnumResolver enumResolver) {
+ public Config(final Map<String, Map<String, ModuleConfig>> moduleConfigs,
+ final Map<String, Map<Optional<Revision>, IdentityMapping>> identityMap, final EnumResolver enumResolver) {
this.moduleConfigs = moduleConfigs;
this.identityMap = identityMap;
this.enumResolver = enumResolver;
}
- public static Map<String, Map<String, Collection<ObjectName>>> getMappedInstances(final Set<ObjectName> instancesToMap,
- final Map<String, Map<String, ModuleConfig>> configs) {
+ public static Map<String, Map<String, Collection<ObjectName>>> getMappedInstances(
+ final Set<ObjectName> instancesToMap, final Map<String, Map<String, ModuleConfig>> configs) {
Multimap<String, ObjectName> moduleToInstances = mapInstancesToModules(instancesToMap);
Map<String, Map<String, Collection<ObjectName>>> retVal = Maps.newLinkedHashMap();
// TODO, this code does not support same module names from different namespaces
// Namespace should be present in ObjectName
- if (instances == null){
+ if (instances == null) {
continue;
}
innerRetVal.put(moduleName, instances);
}
-
retVal.put(namespaceToModuleToConfigEntry.getKey(), innerRetVal);
}
return retVal;
return retVal;
}
- public Element toXml(final Set<ObjectName> instancesToMap, final Optional<String> maybeNamespace, final Document document,
- final Element dataElement, final ServiceRegistryWrapper serviceTracker) {
+ public Element toXml(final Set<ObjectName> instancesToMap, final Optional<String> maybeNamespace,
+ final Document document, final Element dataElement, final ServiceRegistryWrapper serviceTracker) {
Map<String, Map<String, Collection<ObjectName>>> moduleToInstances = getMappedInstances(instancesToMap,
moduleConfigs);
dataElement.setAttributeNS(maybeNamespace.get(), dataElement.getNodeName(), "xmlns");
}
- Element modulesElement = XmlUtil.createElement(document, XmlMappingConstants.MODULES_KEY, Optional.of(XmlMappingConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG));
+ Element modulesElement = XmlUtil.createElement(document, XmlMappingConstants.MODULES_KEY,
+ Optional.of(XmlMappingConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG));
dataElement.appendChild(modulesElement);
for (Entry<String, Map<String, Collection<ObjectName>>> moduleToInstanceEntry : moduleToInstances.entrySet()) {
for (Entry<String, Collection<ObjectName>> moduleMappingEntry : moduleToInstanceEntry.getValue()
.entrySet()) {
- ModuleConfig mapping = moduleConfigs.get(moduleToInstanceEntry.getKey()).get(moduleMappingEntry.getKey());
+ ModuleConfig mapping = moduleConfigs.get(moduleToInstanceEntry.getKey())
+ .get(moduleMappingEntry.getKey());
if (moduleMappingEntry.getValue().isEmpty()) {
continue;
}
for (ObjectName objectName : moduleMappingEntry.getValue()) {
- modulesElement.appendChild(mapping.toXml(objectName, document, moduleToInstanceEntry.getKey(), enumResolver));
+ modulesElement.appendChild(
+ mapping.toXml(objectName, document, moduleToInstanceEntry.getKey(), enumResolver));
}
}
}
public Element moduleToXml(final String moduleNamespace, final String factoryName, final String instanceName,
- final ObjectName instanceON, final Document document) {
+ final ObjectName instanceON, final Document document) {
ModuleConfig moduleConfig = getModuleMapping(moduleNamespace, instanceName, factoryName);
return moduleConfig.toXml(instanceON, document, moduleNamespace, enumResolver);
}
// TODO refactor, replace Map->Multimap with e.g. ConfigElementResolved
// class
- public Map<String, Multimap<String, ModuleElementResolved>> fromXmlModulesResolved(final XmlElement xml, final EditStrategyType defaultEditStrategyType, final ServiceRegistryWrapper serviceTracker) throws DocumentedException {
+ public Map<String, Multimap<String, ModuleElementResolved>> fromXmlModulesResolved(final XmlElement xml,
+ final EditStrategyType defaultEditStrategyType, final ServiceRegistryWrapper serviceTracker)
+ throws DocumentedException {
Optional<XmlElement> modulesElement = getModulesElement(xml);
List<XmlElement> moduleElements = getModulesElementList(modulesElement);
Map<String, Multimap<String, ModuleElementResolved>> retVal = Maps.newHashMap();
- for (XmlElement moduleElement : moduleElements) {
- ResolvingStrategy<ModuleElementResolved> resolvingStrategy = new ResolvingStrategy<ModuleElementResolved>() {
- @Override
- public ModuleElementResolved resolveElement(final ModuleConfig moduleMapping, final XmlElement moduleElement, final ServiceRegistryWrapper serviceTracker, final String instanceName, final String moduleNamespace, final EditStrategyType defaultStrategy) throws DocumentedException {
- return moduleMapping.fromXml(moduleElement, serviceTracker,
- instanceName, moduleNamespace, defaultStrategy, identityMap, enumResolver);
- }
- };
+ ResolvingStrategy<ModuleElementResolved> resolvingStrategy = (moduleMapping, moduleElement, serviceTracker1,
+ instanceName, moduleNamespace, defaultStrategy) -> moduleMapping.fromXml(moduleElement, serviceTracker1,
+ instanceName, moduleNamespace, defaultStrategy, identityMap, enumResolver);
+ for (XmlElement moduleElement : moduleElements) {
resolveModule(retVal, serviceTracker, moduleElement, defaultEditStrategyType, resolvingStrategy);
}
+
return retVal;
}
/**
- * return a map containing namespace -> moduleName -> instanceName map. Attribute parsing is omitted.
+ * return a map containing namespace -> moduleName -> instanceName map.
+ * Attribute parsing is omitted.
*/
public Map<String, Multimap<String, ModuleElementDefinition>> fromXmlModulesMap(final XmlElement xml,
- final EditStrategyType defaultEditStrategyType, final ServiceRegistryWrapper serviceTracker) throws DocumentedException {
+ final EditStrategyType defaultEditStrategyType, final ServiceRegistryWrapper serviceTracker)
+ throws DocumentedException {
Optional<XmlElement> modulesElement = getModulesElement(xml);
List<XmlElement> moduleElements = getModulesElementList(modulesElement);
Map<String, Multimap<String, ModuleElementDefinition>> retVal = Maps.newHashMap();
- for (XmlElement moduleElement : moduleElements) {
- ResolvingStrategy<ModuleElementDefinition> resolvingStrategy = new ResolvingStrategy<ModuleElementDefinition>() {
- @Override
- public ModuleElementDefinition resolveElement(final ModuleConfig moduleMapping, final XmlElement moduleElement,
- final ServiceRegistryWrapper serviceTracker, final String instanceName, final String moduleNamespace,
- final EditStrategyType defaultStrategy) {
- // TODO: add check for conflicts between global and local
- // edit strategy
- String perInstanceEditStrategy = moduleElement.getAttribute(XmlMappingConstants.OPERATION_ATTR_KEY,
- XmlMappingConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0);
- return new ModuleElementDefinition(instanceName, perInstanceEditStrategy, defaultStrategy);
- }
- };
+ ResolvingStrategy<ModuleElementDefinition> resolvingStrategy = (moduleMapping, moduleElement, serviceTracker1,
+ instanceName, moduleNamespace, defaultStrategy) -> {
+ // TODO: add check for conflicts between global and local edit
+ // strategy
+ String perInstanceEditStrategy = moduleElement.getAttribute(XmlMappingConstants.OPERATION_ATTR_KEY,
+ XmlMappingConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0);
+ return new ModuleElementDefinition(instanceName, perInstanceEditStrategy, defaultStrategy);
+ };
+ for (XmlElement moduleElement : moduleElements) {
resolveModule(retVal, serviceTracker, moduleElement, defaultEditStrategyType, resolvingStrategy);
}
+
return retVal;
}
private static Optional<XmlElement> getModulesElement(final XmlElement xml) {
return xml.getOnlyChildElementOptionally(XmlMappingConstants.MODULES_KEY,
- XmlMappingConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG);
+ XmlMappingConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG);
}
- private List<XmlElement> getModulesElementList(final Optional<XmlElement> modulesElement) throws DocumentedException {
+ private List<XmlElement> getModulesElementList(final Optional<XmlElement> modulesElement)
+ throws DocumentedException {
List<XmlElement> moduleElements;
if (modulesElement.isPresent()) {
return moduleElements;
}
- private <T> void resolveModule(final Map<String, Multimap<String, T>> retVal, final ServiceRegistryWrapper serviceTracker,
- final XmlElement moduleElement, final EditStrategyType defaultStrategy, final ResolvingStrategy<T> resolvingStrategy) throws DocumentedException {
+ private <T> void resolveModule(final Map<String, Multimap<String, T>> retVal,
+ final ServiceRegistryWrapper serviceTracker, final XmlElement moduleElement,
+ final EditStrategyType defaultStrategy, final ResolvingStrategy<T> resolvingStrategy)
+ throws DocumentedException {
XmlElement typeElement = null;
typeElement = moduleElement.getOnlyChildElementWithSameNamespace(XmlMappingConstants.TYPE_KEY);
Entry<String, String> prefixToNamespace = typeElement.findNamespaceOfTextContent();
ModuleConfig moduleMapping = getModuleMapping(moduleNamespace, instanceName, factoryName);
- Multimap<String, T> innerMap = retVal.get(moduleNamespace);
- if (innerMap == null) {
- innerMap = HashMultimap.create();
- retVal.put(moduleNamespace, innerMap);
- }
+ Multimap<String, T> innerMap = retVal.computeIfAbsent(moduleNamespace, k -> HashMultimap.create());
- T resolvedElement = resolvingStrategy.resolveElement(moduleMapping, moduleElement, serviceTracker,
- instanceName, moduleNamespace, defaultStrategy);
+ T resolvedElement = resolvingStrategy.resolveElement(moduleMapping, moduleElement, serviceTracker, instanceName,
+ moduleNamespace, defaultStrategy);
innerMap.put(factoryName, resolvedElement);
}
private static Optional<XmlElement> getServicesElement(final XmlElement xml) {
return xml.getOnlyChildElementOptionally(XmlMappingConstants.SERVICES_KEY,
- XmlMappingConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG);
+ XmlMappingConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG);
}
public static void checkUnrecognisedChildren(final XmlElement parent) throws DocumentedException {
Optional<XmlElement> modulesOpt = getModulesElement(parent);
List<XmlElement> recognised = Lists.newArrayList();
- if(servicesOpt.isPresent()){
+ if (servicesOpt.isPresent()) {
recognised.add(servicesOpt.get());
}
- if(modulesOpt.isPresent()){
+ if (modulesOpt.isPresent()) {
recognised.add(modulesOpt.get());
}
}
private String getFactoryName(final String factoryNameWithPrefix, final String prefixOrEmptyString) {
- checkState(
- factoryNameWithPrefix.startsWith(prefixOrEmptyString),
+ checkState(factoryNameWithPrefix.startsWith(prefixOrEmptyString),
String.format("Internal error: text " + "content '%s' of type node does not start with prefix '%s'",
factoryNameWithPrefix, prefixOrEmptyString));
return factoryNameWithPrefix.substring(factoryNameAfterPrefixIndex);
}
- private ModuleConfig getModuleMapping(final String moduleNamespace, final String instanceName, final String factoryName) {
+ private ModuleConfig getModuleMapping(final String moduleNamespace, final String instanceName,
+ final String factoryName) {
Map<String, ModuleConfig> mappingsFromNamespace = moduleConfigs.get(moduleNamespace);
Preconditions.checkNotNull(mappingsFromNamespace,
private interface ResolvingStrategy<T> {
T resolveElement(ModuleConfig moduleMapping, XmlElement moduleElement, ServiceRegistryWrapper serviceTracker,
- String instanceName, String moduleNamespace, EditStrategyType defaultStrategy) throws DocumentedException;
+ String instanceName, String moduleNamespace, EditStrategyType defaultStrategy)
+ throws DocumentedException;
}
}