Bug 2731: Discard changes only when transaction exist.
[controller.git] / opendaylight / netconf / netconf-impl / src / main / java / org / opendaylight / controller / netconf / impl / CapabilityProviderImpl.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.netconf.impl;
10
11 import com.google.common.base.Optional;
12 import com.google.common.base.Preconditions;
13 import com.google.common.collect.Maps;
14 import java.util.ArrayList;
15 import java.util.Collections;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.Set;
19 import java.util.TreeSet;
20 import org.opendaylight.controller.netconf.impl.mapping.CapabilityProvider;
21 import org.opendaylight.controller.netconf.mapping.api.Capability;
22 import org.opendaylight.controller.netconf.mapping.api.NetconfOperationService;
23 import org.opendaylight.controller.netconf.mapping.api.NetconfOperationServiceSnapshot;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 public class CapabilityProviderImpl implements CapabilityProvider {
28     private final NetconfOperationServiceSnapshot netconfOperationServiceSnapshot;
29     private final Set<String> capabilityURIs;
30
31     private static final Logger LOG = LoggerFactory.getLogger(CapabilityProviderImpl.class);
32
33     public CapabilityProviderImpl(NetconfOperationServiceSnapshot netconfOperationServiceSnapshot) {
34         this.netconfOperationServiceSnapshot = netconfOperationServiceSnapshot;
35         Map<String, Capability> urisToCapabilitiesInternalMap = getCapabilitiesInternal(netconfOperationServiceSnapshot);
36         List<String> capabilityURIs = new ArrayList<>(urisToCapabilitiesInternalMap.keySet());
37         Collections.sort(capabilityURIs);
38         this.capabilityURIs = Collections.unmodifiableSet(new TreeSet<>(capabilityURIs));
39     }
40
41     private static Map<String, Capability> getCapabilitiesInternal(
42             NetconfOperationServiceSnapshot netconfOperationServiceSnapshot) {
43         Map<String, Capability> capabilityMap = Maps.newHashMap();
44
45         for (NetconfOperationService netconfOperationService : netconfOperationServiceSnapshot.getServices()) {
46             final Set<Capability> caps = netconfOperationService.getCapabilities();
47
48             for (Capability cap : caps) {
49
50                 if(capabilityMap.containsKey(cap.getCapabilityUri())) {
51                     LOG.debug("Duplicate capability {} from service {}", cap.getCapabilityUri(), netconfOperationService);
52                 }
53
54                 capabilityMap.put(cap.getCapabilityUri(), cap);
55             }
56         }
57
58         return capabilityMap;
59     }
60
61     @Override
62     public synchronized String getSchemaForCapability(String moduleName, Optional<String> revision) {
63
64         Map<String, Map<String, String>> mappedModulesToRevisionToSchema = Maps.newHashMap();
65
66         for (NetconfOperationService netconfOperationService : netconfOperationServiceSnapshot.getServices()) {
67             final Set<Capability> caps = netconfOperationService.getCapabilities();
68
69             for (Capability cap : caps) {
70                 if (!cap.getModuleName().isPresent()
71                         || !cap.getRevision().isPresent()
72                         || !cap.getCapabilitySchema().isPresent()){
73                     continue;
74                 }
75
76                 final String currentModuleName = cap.getModuleName().get();
77                 Map<String, String> revisionMap = mappedModulesToRevisionToSchema.get(currentModuleName);
78                 if (revisionMap == null) {
79                     revisionMap = Maps.newHashMap();
80                     mappedModulesToRevisionToSchema.put(currentModuleName, revisionMap);
81                 }
82
83                 String currentRevision = cap.getRevision().get();
84                 revisionMap.put(currentRevision, cap.getCapabilitySchema().get());
85             }
86         }
87
88         Map<String, String> revisionMapRequest = mappedModulesToRevisionToSchema.get(moduleName);
89         Preconditions.checkState(revisionMapRequest != null, "Capability for module %s not present, " + ""
90                 + "available modules : %s", moduleName, capabilityURIs);
91
92         if (revision.isPresent()) {
93             String schema = revisionMapRequest.get(revision.get());
94
95             Preconditions.checkState(schema != null,
96                     "Capability for module %s:%s not present, available revisions for module: %s", moduleName,
97                     revision.get(), revisionMapRequest.keySet());
98
99             return schema;
100         } else {
101             Preconditions.checkState(revisionMapRequest.size() == 1,
102                     "Expected 1 capability for module %s, available revisions : %s", moduleName,
103                     revisionMapRequest.keySet());
104             return revisionMapRequest.values().iterator().next();
105         }
106     }
107
108     @Override
109     public synchronized Set<String> getCapabilities() {
110         return capabilityURIs;
111     }
112
113 }