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%2FServices.java;h=f522668733497333b7b2ac2052fe5949985f8f51;hp=883dde7564a8785b6145ccec544390478bb9ffe5;hb=86fbc7bff96f17325bbc7e3a1814acd9c4153da4;hpb=dfe4a744e9b2ebbbd06e3e91b6100258c2744983 diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Services.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Services.java index 883dde7564..f522668733 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Services.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Services.java @@ -13,6 +13,7 @@ import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.ObjectNameAttributeReadingStrategy; import org.opendaylight.controller.netconf.util.xml.XmlElement; import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; @@ -42,27 +43,33 @@ public final class Services { private long suffix = 1; private final Map instanceToRef = Maps.newHashMap(); - private final Map> serviceNameToRefNameToInstance = Maps + private final Map>> namespaceToServiceNameToRefNameToInstance = Maps .newHashMap(); - public String addServiceEntry(String serviceName, ObjectName on) { + public String addServiceEntry(String namespace, String serviceName, ObjectName on) { String moduleName = on.getKeyProperty("moduleFactoryName"); String instanceName = on.getKeyProperty("instanceName"); - String refName = addServiceEntry(serviceName, moduleName, instanceName); + String refName = addServiceEntry(namespace, serviceName, moduleName, instanceName); logger.trace("Added service entry to tracker. Service name {}, ref name {}, module name {}, instance name {}", serviceName, refName, moduleName, instanceName); return refName; } @VisibleForTesting - public String addServiceEntry(String serviceName, String moduleName, String instanceName) { + public String addServiceEntry(String namespace, String serviceName, String moduleName, String instanceName) { ServiceInstance serviceInstance = new ServiceInstance(moduleName, instanceName); serviceInstance.setServiceName(serviceName); String refName = instanceToRef.get(serviceInstance); + Map> serviceNameToRefNameToInstance = namespaceToServiceNameToRefNameToInstance.get(namespace); + if (serviceNameToRefNameToInstance == null) { + serviceNameToRefNameToInstance = Maps.newHashMap(); + namespaceToServiceNameToRefNameToInstance.put(namespace, serviceNameToRefNameToInstance); + } + Map refNameToInstance = serviceNameToRefNameToInstance.get(serviceName); if (refNameToInstance == null) { refNameToInstance = Maps.newHashMap(); @@ -101,7 +108,11 @@ public final class Services { return refNamesAsSet; } - public ServiceInstance getByServiceAndRefName(String serviceName, String refName) { + public ServiceInstance getByServiceAndRefName(String namespace, String serviceName, String refName) { + Map> serviceNameToRefNameToInstance = namespaceToServiceNameToRefNameToInstance.get(namespace); + Preconditions.checkArgument(serviceNameToRefNameToInstance != null, "No serviceInstances mapped to " + namespace + " , " + + serviceNameToRefNameToInstance.keySet()); + Map refNameToInstance = serviceNameToRefNameToInstance.get(serviceName); Preconditions.checkArgument(refNameToInstance != null, "No serviceInstances mapped to " + serviceName + " , " + serviceNameToRefNameToInstance.keySet()); @@ -114,20 +125,28 @@ public final class Services { // TODO hide getMappedServices, call it explicitly in toXml - public Map> getMappedServices() { - Map> retVal = Maps.newHashMap(); + public Map>> getMappedServices() { + Map>> retVal = Maps.newHashMap(); - for (String serviceName : serviceNameToRefNameToInstance.keySet()) { + for (String namespace : namespaceToServiceNameToRefNameToInstance.keySet()) { - Map innerRetVal = Maps.transformValues(serviceNameToRefNameToInstance.get(serviceName), - new Function() { - @Nullable - @Override - public String apply(@Nullable ServiceInstance serviceInstance) { - return serviceInstance.toString(); - } - }); - retVal.put(serviceName, innerRetVal); + Map> serviceNameToRefNameToInstance = namespaceToServiceNameToRefNameToInstance + .get(namespace); + Map> innerRetVal = Maps.newHashMap(); + + for (String serviceName : serviceNameToRefNameToInstance.keySet()) { + + Map innerInnerRetVal = Maps.transformValues( + serviceNameToRefNameToInstance.get(serviceName), new Function() { + @Nullable + @Override + public String apply(@Nullable ServiceInstance serviceInstance) { + return serviceInstance.toString(); + } + }); + innerRetVal.put(serviceName, innerInnerRetVal); + } + retVal.put(namespace, innerRetVal); } return retVal; @@ -135,35 +154,45 @@ public final class Services { // TODO hide resolveServices, call it explicitly in fromXml - public static Services resolveServices(Map> mappedServices) { + public static Services resolveServices(Map>> mappedServices) { Services tracker = new Services(); - for (Entry> serviceEntry : mappedServices.entrySet()) { + for (Entry>> namespaceEntry : mappedServices.entrySet()) { + String namespace = namespaceEntry.getKey(); - String serviceName = serviceEntry.getKey(); - for (Entry refEntry : serviceEntry.getValue().entrySet()) { + for (Entry> serviceEntry : namespaceEntry.getValue().entrySet()) { - Map refNameToInstance = tracker.serviceNameToRefNameToInstance - .get(serviceName); - if (refNameToInstance == null) { - refNameToInstance = Maps.newHashMap(); - tracker.serviceNameToRefNameToInstance.put(serviceName, refNameToInstance); - } + String serviceName = serviceEntry.getKey(); + for (Entry refEntry : serviceEntry.getValue().entrySet()) { - String refName = refEntry.getKey(); - Preconditions.checkState(false == refNameToInstance.containsKey(refName), - "Duplicate reference name to service " + refName + " under service " + serviceName); - ServiceInstance serviceInstance = ServiceInstance.fromString(refEntry.getValue()); - refNameToInstance.put(refName, serviceInstance); + Map> namespaceToServices = tracker.namespaceToServiceNameToRefNameToInstance.get(namespace); + if (namespaceToServices == null) { + namespaceToServices = Maps.newHashMap(); + tracker.namespaceToServiceNameToRefNameToInstance.put(namespace, namespaceToServices); + } + + Map refNameToInstance = namespaceToServices + .get(serviceName); + if (refNameToInstance == null) { + refNameToInstance = Maps.newHashMap(); + namespaceToServices.put(serviceName, refNameToInstance); + } + + String refName = refEntry.getKey(); + Preconditions.checkState(false == refNameToInstance.containsKey(refName), + "Duplicate reference name to service " + refName + " under service " + serviceName); + ServiceInstance serviceInstance = ServiceInstance.fromString(refEntry.getValue()); + refNameToInstance.put(refName, serviceInstance); - tracker.instanceToRef.put(serviceInstance, refEntry.getKey()); + tracker.instanceToRef.put(serviceInstance, refEntry.getKey()); + } } } return tracker; } - public static Map> fromXml(XmlElement xml) { - Map> retVal = Maps.newHashMap(); + public static Map>> fromXml(XmlElement xml) { + Map>> retVal = Maps.newHashMap(); List services = xml.getChildElements(SERVICE_KEY); xml.checkUnrecognisedElements(services); @@ -171,10 +200,20 @@ public final class Services { for (XmlElement service : services) { XmlElement typeElement = service.getOnlyChildElement(TYPE_KEY); - String serviceName = typeElement.getTextContent(); + Entry prefixNamespace = typeElement.findNamespaceOfTextContent(); + + Preconditions.checkState(prefixNamespace.getKey()!=null && prefixNamespace.getKey().equals("") == false, "Type attribute was not prefixed"); + + Map> namespaceToServices = retVal.get(prefixNamespace.getValue()); + if(namespaceToServices == null) { + namespaceToServices = Maps.newHashMap(); + retVal.put(prefixNamespace.getValue(), namespaceToServices); + } + + String serviceName = ObjectNameAttributeReadingStrategy.checkPrefixAndExtractServiceName(typeElement, prefixNamespace); Map innerMap = Maps.newHashMap(); - retVal.put(serviceName, innerMap); + namespaceToServices.put(serviceName, innerMap); List instances = service.getChildElements(XmlNetconfConstants.INSTANCE_KEY); service.checkUnrecognisedElements(instances, typeElement); @@ -205,29 +244,34 @@ public final class Services { } } - public Element toXml(Map> mappedServices, Document document) { + public Element toXml(Map>> mappedServices, Document document) { Element root = document.createElement(XmlNetconfConstants.SERVICES_KEY); XmlUtil.addNamespaceAttr(root, XmlNetconfConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG); - for (Entry> serviceEntry : mappedServices.entrySet()) { - Element serviceElement = document.createElement(SERVICE_KEY); - root.appendChild(serviceElement); + for (String namespace : mappedServices.keySet()) { - Element typeElement = XmlUtil.createTextElement(document, TYPE_KEY, serviceEntry.getKey()); - serviceElement.appendChild(typeElement); + for (Entry> serviceEntry : mappedServices.get(namespace).entrySet()) { + Element serviceElement = document.createElement(SERVICE_KEY); + root.appendChild(serviceElement); - for (Entry instanceEntry : serviceEntry.getValue().entrySet()) { - Element instanceElement = document.createElement(XmlNetconfConstants.INSTANCE_KEY); - serviceElement.appendChild(instanceElement); + Element typeElement = XmlUtil.createPrefixedTextElement(document, TYPE_KEY, XmlNetconfConstants.PREFIX, + serviceEntry.getKey()); + XmlUtil.addPrefixedNamespaceAttr(typeElement, XmlNetconfConstants.PREFIX, namespace); + serviceElement.appendChild(typeElement); - Element nameElement = XmlUtil.createTextElement(document, NAME_KEY, instanceEntry.getKey()); - instanceElement.appendChild(nameElement); + for (Entry instanceEntry : serviceEntry.getValue().entrySet()) { + Element instanceElement = document.createElement(XmlNetconfConstants.INSTANCE_KEY); + serviceElement.appendChild(instanceElement); - Element providerElement = XmlUtil.createTextElement(document, PROVIDER_KEY, instanceEntry.getValue()); - instanceElement.appendChild(providerElement); + Element nameElement = XmlUtil.createTextElement(document, NAME_KEY, instanceEntry.getKey()); + instanceElement.appendChild(nameElement); + + Element providerElement = XmlUtil.createTextElement(document, PROVIDER_KEY, instanceEntry.getValue()); + instanceElement.appendChild(providerElement); + } } - } + } return root; } @@ -240,8 +284,13 @@ public final class Services { public static ServiceInstance fromString(String instanceId) { instanceId = instanceId.trim(); Matcher matcher = p.matcher(instanceId); + if(matcher.matches() == false) { + matcher = pDeprecated.matcher(instanceId); + } + Preconditions.checkArgument(matcher.matches(), "Unexpected format for provider, expected " + p.toString() - + " but was " + instanceId); + + " or " + pDeprecated.toString() + " but was " + instanceId); + String factoryName = matcher.group(1); String instanceName = matcher.group(2); return new ServiceInstance(factoryName, instanceName); @@ -266,16 +315,25 @@ public final class Services { return instanceName; } - private static final String blueprint = "/" + XmlNetconfConstants.CONFIG_KEY + "/" + private static final String blueprint = "/" + XmlNetconfConstants.MODULES_KEY + "/" + XmlNetconfConstants.MODULE_KEY + "[" - + XmlNetconfConstants.NAME_KEY + "='%s']/" + XmlNetconfConstants.INSTANCE_KEY + "[" + + XmlNetconfConstants.TYPE_KEY + "='%s'][" + XmlNetconfConstants.NAME_KEY + "='%s']"; - private static final String blueprintR = "/" + XmlNetconfConstants.CONFIG_KEY + "/" + // TODO unify with xpath in RuntimeRpc + + // Previous version of xpath, needs to be supported for backwards compatibility (persisted configs by config-persister) + private static final String blueprintRDeprecated = "/" + XmlNetconfConstants.CONFIG_KEY + "/" + XmlNetconfConstants.MODULES_KEY + "/" + XmlNetconfConstants.MODULE_KEY + "\\[" + XmlNetconfConstants.NAME_KEY + "='%s'\\]/" + XmlNetconfConstants.INSTANCE_KEY + "\\[" + XmlNetconfConstants.NAME_KEY + "='%s'\\]"; + private static final String blueprintR = "/" + + XmlNetconfConstants.MODULES_KEY + "/" + XmlNetconfConstants.MODULE_KEY + "\\[" + + XmlNetconfConstants.TYPE_KEY + "='%s'\\]\\[" + + XmlNetconfConstants.NAME_KEY + "='%s'\\]"; + + private static final Pattern pDeprecated = Pattern.compile(String.format(blueprintRDeprecated, "(.+)", "(.+)")); private static final Pattern p = Pattern.compile(String.format(blueprintR, "(.+)", "(.+)")); @Override