Merge "Do not duplicate OSGi dependencyManagement"
[controller.git] / opendaylight / netconf / config-netconf-connector / src / main / java / org / opendaylight / controller / netconf / confignetconfconnector / osgi / NetconfOperationServiceImpl.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.confignetconfconnector.osgi;
10
11 import com.google.common.base.Optional;
12 import java.util.Collection;
13 import java.util.Collections;
14 import java.util.HashSet;
15 import java.util.Set;
16 import org.opendaylight.controller.config.util.ConfigRegistryJMXClient;
17 import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider;
18 import org.opendaylight.controller.netconf.confignetconfconnector.util.Util;
19 import org.opendaylight.controller.netconf.mapping.api.Capability;
20 import org.opendaylight.controller.netconf.mapping.api.NetconfOperation;
21 import org.opendaylight.controller.netconf.mapping.api.NetconfOperationService;
22 import org.opendaylight.yangtools.yang.model.api.Module;
23
24 /**
25  * Manages life cycle of {@link YangStoreContext}.
26  */
27 public class NetconfOperationServiceImpl implements NetconfOperationService {
28
29     private final NetconfOperationProvider operationProvider;
30     private final TransactionProvider transactionProvider;
31     private final YangStoreService yangStoreService;
32
33     public NetconfOperationServiceImpl(final YangStoreService yangStoreService, final ConfigRegistryJMXClient jmxClient,
34             final String netconfSessionIdForReporting) {
35
36         this.yangStoreService = yangStoreService;
37
38         transactionProvider = new TransactionProvider(jmxClient, netconfSessionIdForReporting);
39         operationProvider = new NetconfOperationProvider(yangStoreService, jmxClient, transactionProvider,
40                 netconfSessionIdForReporting);
41     }
42
43     @Override
44     public void close() {
45         transactionProvider.close();
46     }
47
48     @Override
49     public Set<Capability> getCapabilities() {
50         return setupCapabilities(yangStoreService);
51     }
52
53     @Override
54     public Set<NetconfOperation> getNetconfOperations() {
55         return operationProvider.getOperations();
56     }
57
58     private static Set<Capability> setupCapabilities(final YangStoreContext yangStoreSnapshot) {
59         Set<Capability> capabilities = new HashSet<>();
60         // [RFC6241] 8.3.  Candidate Configuration Capability
61         capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:candidate:1.0"));
62
63         // TODO rollback on error not supported EditConfigXmlParser:100
64         // [RFC6241] 8.5.  Rollback-on-Error Capability
65         // capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:rollback-on-error:1.0"));
66
67         Set<Module> modules = yangStoreSnapshot.getModules();
68         for (Module module : modules) {
69             capabilities.add(new YangStoreCapability(module, yangStoreSnapshot.getModuleSource(module)));
70         }
71
72         return capabilities;
73     }
74
75     private static class BasicCapability implements Capability {
76
77         private final String capability;
78
79         private BasicCapability(final String capability) {
80             this.capability = capability;
81         }
82
83         @Override
84         public String getCapabilityUri() {
85             return capability;
86         }
87
88         @Override
89         public Optional<String> getModuleNamespace() {
90             return Optional.absent();
91         }
92
93         @Override
94         public Optional<String> getModuleName() {
95             return Optional.absent();
96         }
97
98         @Override
99         public Optional<String> getRevision() {
100             return Optional.absent();
101         }
102
103         @Override
104         public Optional<String> getCapabilitySchema() {
105             return Optional.absent();
106         }
107
108         @Override
109         public Collection<String> getLocation() {
110             return Collections.emptyList();
111         }
112
113         @Override
114         public String toString() {
115             return capability;
116         }
117     }
118
119     private static final class YangStoreCapability extends BasicCapability {
120
121         private final String content;
122         private final String revision;
123         private final String moduleName;
124         private final String moduleNamespace;
125
126         public YangStoreCapability(final Module module, final String moduleContent) {
127             super(toCapabilityURI(module));
128             this.content = moduleContent;
129             this.moduleName = module.getName();
130             this.moduleNamespace = module.getNamespace().toString();
131             this.revision = Util.writeDate(module.getRevision());
132         }
133
134         @Override
135         public Optional<String> getCapabilitySchema() {
136             return Optional.of(content);
137         }
138
139         private static String toCapabilityURI(final Module module) {
140             return String.valueOf(module.getNamespace()) + "?module="
141                     + module.getName() + "&revision=" + Util.writeDate(module.getRevision());
142         }
143
144         @Override
145         public Optional<String> getModuleName() {
146             return Optional.of(moduleName);
147         }
148
149         @Override
150         public Optional<String> getModuleNamespace() {
151             return Optional.of(moduleNamespace);
152         }
153
154         @Override
155         public Optional<String> getRevision() {
156             return Optional.of(revision);
157         }
158     }
159 }