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=0b33b553207bf15a8b7a58c6007e0c867e296cea;hp=0fe5fad29c1d4ad20e5cb67c3d8c21357e791f46;hb=80aa861b74f7b0b3574f0962cdb45740ff71946c;hpb=567792806ed799ac649cc125bffb4debde40d254 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 0fe5fad29c..0b33b55320 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,11 +11,20 @@ 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; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.AttributeConfigElement; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.AttributeReadingStrategy; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.ObjectXmlReader; @@ -28,36 +37,33 @@ import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attrib import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditConfig; 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(); @@ -84,24 +90,26 @@ public final class InstanceConfig { 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) { @@ -129,34 +137,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;