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.config.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.config.util.xml.XmlElement;
20 import org.opendaylight.controller.config.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(final Element snapshot, final 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;
44 private final SortedSet<String> obsoleteCapabilities;
46 private StripCapabilitiesResult(final SortedSet<String> requiredCapabilities, final SortedSet<String> obsoleteCapabilities) {
47 this.requiredCapabilities = Collections.unmodifiableSortedSet(requiredCapabilities);
48 this.obsoleteCapabilities = Collections.unmodifiableSortedSet(obsoleteCapabilities);
54 static StripCapabilitiesResult stripCapabilities(final XmlElement configElement, final Set<String> allCapabilitiesFromHello) {
55 // collect all namespaces
56 Set<String> foundNamespacesInXML = getNamespaces(configElement);
57 LOG.trace("All capabilities {}\nFound namespaces in XML {}", allCapabilitiesFromHello, foundNamespacesInXML);
58 // required are referenced both in xml and hello
59 SortedSet<String> requiredCapabilities = new TreeSet<>();
61 SortedSet<String> obsoleteCapabilities = new TreeSet<>();
62 for (String capability : allCapabilitiesFromHello) {
63 String namespace = capability.replaceAll("\\?.*","");
64 if (foundNamespacesInXML.contains(namespace)) {
65 requiredCapabilities.add(capability);
67 obsoleteCapabilities.add(capability);
71 LOG.trace("Required capabilities {}, \nObsolete capabilities {}",
72 requiredCapabilities, obsoleteCapabilities);
74 return new StripCapabilitiesResult(requiredCapabilities, obsoleteCapabilities);
77 static Set<String> getNamespaces(final XmlElement element){
78 Set<String> result = new HashSet<>();
79 for (Entry<String,Attr> attribute : element.getAttributes().entrySet()) {
80 if (attribute.getKey().startsWith("xmlns")){
81 result.add(attribute.getValue().getValue());
84 for(XmlElement child: element.getChildElements()) {
85 result.addAll(getNamespaces(child));
91 public SortedSet<String> getCapabilities() {
92 return stripCapabilitiesResult.requiredCapabilities;
96 Set<String> getObsoleteCapabilities(){
97 return stripCapabilitiesResult.obsoleteCapabilities;
101 public String getConfigSnapshot() {
102 return configSnapshot;