2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.netconf.persist.impl;
11 import com.google.common.annotations.VisibleForTesting;
12 import java.util.Collections;
13 import java.util.HashSet;
14 import java.util.Map.Entry;
16 import java.util.SortedSet;
17 import java.util.TreeSet;
18 import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
19 import org.opendaylight.controller.netconf.util.xml.XmlElement;
20 import org.opendaylight.controller.netconf.util.xml.XmlUtil;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
23 import org.w3c.dom.Attr;
24 import org.w3c.dom.Element;
27 * Inspects snapshot xml to be stored, remove all capabilities that are not referenced by it.
28 * Useful when persisting current configuration.
30 public class CapabilityStrippingConfigSnapshotHolder implements ConfigSnapshotHolder {
31 private static final Logger LOG = LoggerFactory.getLogger(CapabilityStrippingConfigSnapshotHolder.class);
33 private final String configSnapshot;
34 private final StripCapabilitiesResult stripCapabilitiesResult;
36 public CapabilityStrippingConfigSnapshotHolder(Element snapshot, Set<String> capabilities) {
37 final XmlElement configElement = XmlElement.fromDomElement(snapshot);
38 configSnapshot = XmlUtil.toString(configElement.getDomElement());
39 stripCapabilitiesResult = stripCapabilities(configElement, capabilities);
42 private static class StripCapabilitiesResult {
43 private final SortedSet<String> requiredCapabilities, obsoleteCapabilities;
45 private StripCapabilitiesResult(SortedSet<String> requiredCapabilities, SortedSet<String> obsoleteCapabilities) {
46 this.requiredCapabilities = Collections.unmodifiableSortedSet(requiredCapabilities);
47 this.obsoleteCapabilities = Collections.unmodifiableSortedSet(obsoleteCapabilities);
53 static StripCapabilitiesResult stripCapabilities(XmlElement configElement, Set<String> allCapabilitiesFromHello) {
54 // collect all namespaces
55 Set<String> foundNamespacesInXML = getNamespaces(configElement);
56 LOG.trace("All capabilities {}\nFound namespaces in XML {}", allCapabilitiesFromHello, foundNamespacesInXML);
57 // required are referenced both in xml and hello
58 SortedSet<String> requiredCapabilities = new TreeSet<>();
60 SortedSet<String> obsoleteCapabilities = new TreeSet<>();
61 for (String capability : allCapabilitiesFromHello) {
62 String namespace = capability.replaceAll("\\?.*","");
63 if (foundNamespacesInXML.contains(namespace)) {
64 requiredCapabilities.add(capability);
66 obsoleteCapabilities.add(capability);
70 LOG.trace("Required capabilities {}, \nObsolete capabilities {}",
71 requiredCapabilities, obsoleteCapabilities);
73 return new StripCapabilitiesResult(requiredCapabilities, obsoleteCapabilities);
76 static Set<String> getNamespaces(XmlElement element){
77 Set<String> result = new HashSet<>();
78 for (Entry<String,Attr> attribute : element.getAttributes().entrySet()) {
79 if (attribute.getKey().startsWith("xmlns")){
80 result.add(attribute.getValue().getValue());
83 for(XmlElement child: element.getChildElements()) {
84 result.addAll(getNamespaces(child));
90 public SortedSet<String> getCapabilities() {
91 return stripCapabilitiesResult.requiredCapabilities;
95 Set<String> getObsoleteCapabilities(){
96 return stripCapabilitiesResult.obsoleteCapabilities;
100 public String getConfigSnapshot() {
101 return configSnapshot;