X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fconfig-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fconfignetconfconnector%2Fmapping%2Fconfig%2FInstanceConfig.java;h=ff1d719c57877c2df4710701d9d6f0bd65075b07;hp=1da9fabdb38390dd0a153b37f4f30a3560fdd03d;hb=c6ab5fdef3d0cc6fac96cb960839168ed7906b3a;hpb=d7a972ac145d9f0ac8870dac2d7835520e92c02a diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/InstanceConfig.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/InstanceConfig.java index 1da9fabdb3..ff1d719c57 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/InstanceConfig.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/InstanceConfig.java @@ -11,7 +11,12 @@ package org.opendaylight.controller.netconf.confignetconfconnector.mapping.confi import com.google.common.base.Optional; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.google.common.collect.Multimap; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import javax.management.ObjectName; +import javax.management.openmbean.OpenType; import org.opendaylight.controller.config.util.ConfigRegistryClient; import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry; import org.opendaylight.controller.config.yangjmxgenerator.attribute.AttributeIfc; @@ -29,81 +34,79 @@ import org.opendaylight.controller.netconf.confignetconfconnector.operations.edi 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 javax.management.openmbean.OpenType; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - public final class InstanceConfig { private static final Logger logger = LoggerFactory.getLogger(InstanceConfig.class); private final Map yangToAttrConfig; + private final String nullableDummyContainerName; private final Map jmxToAttrConfig; private final ConfigRegistryClient configRegistryClient; - public InstanceConfig(ConfigRegistryClient configRegistryClient, Map yangNamesToAttributes) { + public InstanceConfig(ConfigRegistryClient configRegistryClient, Map yangNamesToAttributes, + String nullableDummyContainerName) { + this.yangToAttrConfig = yangNamesToAttributes; + this.nullableDummyContainerName = nullableDummyContainerName; this.jmxToAttrConfig = reverseMap(yangNamesToAttributes); this.configRegistryClient = configRegistryClient; } - private Map getMappedConfiguration(ObjectName on, ServiceRegistryWrapper depTracker) { + private Map getMappedConfiguration(ObjectName on) { // TODO make field, mappingStrategies can be instantiated only once - Map>> mappingStrategies = new ObjectMapper(depTracker) + Map>> mappingStrategies = new ObjectMapper() .prepareMapping(jmxToAttrConfig); Map toXml = Maps.newHashMap(); for (Entry configDefEntry : jmxToAttrConfig.entrySet()) { - // Skip children runtime beans as they are mapped by InstanceRuntime - if (configDefEntry.getValue() instanceof RuntimeBeanEntry) + if (configDefEntry.getValue() instanceof RuntimeBeanEntry){ continue; - + } Object value = configRegistryClient.getAttributeCurrentValue(on, configDefEntry.getKey()); try { AttributeMappingStrategy> attributeMappingStrategy = mappingStrategies .get(configDefEntry.getKey()); Optional a = attributeMappingStrategy.mapAttribute(value); - if (a.isPresent() == false) + if (!a.isPresent()){ continue; - + } toXml.put(configDefEntry.getValue().getAttributeYangName(), a.get()); } catch (Exception e) { throw new IllegalStateException("Unable to map value " + value + " to attribute " + configDefEntry.getKey(), e); } } - return toXml; } - public Element toXml(ObjectName on, ServiceRegistryWrapper depTracker, String namespace, Document document, Element rootElement) { - - Element cfgElement = rootElement; - + public Element toXml(ObjectName on, String namespace, Document document, Element rootElement) { Map strats = new ObjectXmlWriter().prepareWriting(yangToAttrConfig, document); - - Map mappedConfig = getMappedConfiguration(on, depTracker); - + Map mappedConfig = getMappedConfiguration(on); + Element parentElement; + if (nullableDummyContainerName != null) { + Element dummyElement = XmlUtil.createElement(document, nullableDummyContainerName, Optional.of(namespace)); + rootElement.appendChild(dummyElement); + parentElement = dummyElement; + } else { + parentElement = rootElement; + } for (Entry mappingEntry : mappedConfig.entrySet()) { try { - strats.get(mappingEntry.getKey()).writeElement(cfgElement, namespace, mappingEntry.getValue()); + strats.get(mappingEntry.getKey()).writeElement(parentElement, namespace, mappingEntry.getValue()); } catch (Exception e) { throw new IllegalStateException("Unable to write value " + mappingEntry.getValue() + " for attribute " + mappingEntry.getValue(), e); } } - - return cfgElement; + return rootElement; } private void resolveConfiguration(InstanceConfigElementResolved mappedConfig, ServiceRegistryWrapper depTracker) { @@ -131,34 +134,59 @@ public final class InstanceConfig { } public InstanceConfigElementResolved fromXml(XmlElement moduleElement, ServiceRegistryWrapper services, String moduleNamespace, - EditStrategyType defaultStrategy, Multimap providedServices, Map> identityMap) throws NetconfDocumentedException { + EditStrategyType defaultStrategy, + Map> identityMap) throws NetconfDocumentedException { Map retVal = Maps.newHashMap(); Map strats = new ObjectXmlReader().prepareReading(yangToAttrConfig, identityMap); List recognisedChildren = Lists.newArrayList(); - XmlElement type = null; - XmlElement name = null; - type = moduleElement.getOnlyChildElementWithSameNamespace(XmlNetconfConstants.TYPE_KEY); - name = moduleElement.getOnlyChildElementWithSameNamespace(XmlNetconfConstants.NAME_KEY); - List typeAndName = Lists.newArrayList(type, name); + XmlElement typeElement = moduleElement.getOnlyChildElementWithSameNamespace(XmlNetconfConstants.TYPE_KEY); + XmlElement nameElement = moduleElement.getOnlyChildElementWithSameNamespace(XmlNetconfConstants.NAME_KEY); + List typeAndNameElements = Lists.newArrayList(typeElement, nameElement); + + // if dummy container was defined in yang, set moduleElement to its content + if (nullableDummyContainerName != null) { + int size = moduleElement.getChildElements().size(); + int expectedChildNodes = 1 + typeAndNameElements.size(); + if (size > expectedChildNodes) { + throw new NetconfDocumentedException("Error reading module " + typeElement.getTextContent() + " : " + + nameElement.getTextContent() + " - Expected " + expectedChildNodes +" child nodes, " + + "one of them with name " + nullableDummyContainerName + + ", got " + size + " elements."); + } + if (size == expectedChildNodes) { + try { + moduleElement = moduleElement.getOnlyChildElement(nullableDummyContainerName, moduleNamespace); + } catch (NetconfDocumentedException e) { + throw new NetconfDocumentedException("Error reading module " + typeElement.getTextContent() + " : " + + nameElement.getTextContent() + " - Expected child node with name " + nullableDummyContainerName + + "." + e.getMessage()); + } + } // else 2 elements, no need to descend + } for (Entry readStratEntry : strats.entrySet()) { List configNodes = getConfigNodes(moduleElement, moduleNamespace, readStratEntry.getKey(), - recognisedChildren, typeAndName); + recognisedChildren, typeAndNameElements); AttributeConfigElement readElement = readStratEntry.getValue().readElement(configNodes); retVal.put(readStratEntry.getKey(), readElement); } - recognisedChildren.addAll(typeAndName); - moduleElement.checkUnrecognisedElements(recognisedChildren); - + recognisedChildren.addAll(typeAndNameElements); + try { + moduleElement.checkUnrecognisedElements(recognisedChildren); + } catch (NetconfDocumentedException e) { + throw new NetconfDocumentedException("Error reading module " + typeElement.getTextContent() + " : " + + nameElement.getTextContent() + " - " + + e.getMessage(), e.getErrorType(), e.getErrorTag(),e.getErrorSeverity(),e.getErrorInfo()); + } // TODO: add check for conflicts between global and local edit strategy String perInstanceEditStrategy = moduleElement.getAttribute(XmlNetconfConstants.OPERATION_ATTR_KEY, XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0); InstanceConfigElementResolved instanceConfigElementResolved = perInstanceEditStrategy.equals("") ? new InstanceConfigElementResolved( - retVal, defaultStrategy, providedServices) : new InstanceConfigElementResolved(perInstanceEditStrategy, retVal, defaultStrategy, providedServices); + retVal, defaultStrategy) : new InstanceConfigElementResolved(perInstanceEditStrategy, retVal, defaultStrategy); resolveConfiguration(instanceConfigElementResolved, services); return instanceConfigElementResolved;