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