CDS: Add stress test RPC to the cars model
[controller.git] / opendaylight / config / config-persister-impl / src / main / java / org / opendaylight / controller / config / persist / impl / CapabilityStrippingConfigSnapshotHolder.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.controller.config.persist.impl;
10
11 import com.google.common.annotations.VisibleForTesting;
12 import java.util.Collections;
13 import java.util.HashSet;
14 import java.util.Map.Entry;
15 import java.util.Set;
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;
25
26 /**
27  * Inspects snapshot xml to be stored, remove all capabilities that are not referenced by it.
28  * Useful when persisting current configuration.
29  */
30 public class CapabilityStrippingConfigSnapshotHolder implements ConfigSnapshotHolder {
31     private static final Logger LOG = LoggerFactory.getLogger(CapabilityStrippingConfigSnapshotHolder.class);
32
33     private final String configSnapshot;
34     private final StripCapabilitiesResult stripCapabilitiesResult;
35
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);
40     }
41
42     private static class StripCapabilitiesResult {
43         private final SortedSet<String> requiredCapabilities, obsoleteCapabilities;
44
45         private StripCapabilitiesResult(SortedSet<String> requiredCapabilities, SortedSet<String> obsoleteCapabilities) {
46             this.requiredCapabilities = Collections.unmodifiableSortedSet(requiredCapabilities);
47             this.obsoleteCapabilities = Collections.unmodifiableSortedSet(obsoleteCapabilities);
48         }
49     }
50
51
52     @VisibleForTesting
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<>();
59         // can be removed
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);
65             } else {
66                 obsoleteCapabilities.add(capability);
67             }
68         }
69
70         LOG.trace("Required capabilities {}, \nObsolete capabilities {}",
71                 requiredCapabilities, obsoleteCapabilities);
72
73         return new StripCapabilitiesResult(requiredCapabilities, obsoleteCapabilities);
74     }
75
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());
81             }
82         }
83         for(XmlElement child: element.getChildElements()) {
84             result.addAll(getNamespaces(child));
85         }
86         return result;
87     }
88
89     @Override
90     public SortedSet<String> getCapabilities() {
91         return stripCapabilitiesResult.requiredCapabilities;
92     }
93
94     @VisibleForTesting
95     Set<String> getObsoleteCapabilities(){
96         return stripCapabilitiesResult.obsoleteCapabilities;
97     }
98
99     @Override
100     public String getConfigSnapshot() {
101         return configSnapshot;
102     }
103 }