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