2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.controller.netconf.mdsal.connector;
11 import com.google.common.base.Optional;
12 import java.util.Collection;
13 import java.util.Collections;
14 import java.util.HashSet;
16 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
17 import org.opendaylight.controller.netconf.mapping.api.Capability;
18 import org.opendaylight.controller.netconf.mapping.api.NetconfOperation;
19 import org.opendaylight.controller.netconf.mapping.api.NetconfOperationService;
20 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
21 import org.opendaylight.yangtools.yang.model.api.Module;
22 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
26 public class MdsalNetconfOperationService implements NetconfOperationService {
28 private static final Logger LOG = LoggerFactory.getLogger(MdsalNetconfOperationService.class);
30 private final CurrentSchemaContext schemaContext;
31 private final String netconfSessionIdForReporting;
32 private final OperationProvider operationProvider;
34 public MdsalNetconfOperationService(final CurrentSchemaContext schemaContext, final String netconfSessionIdForReporting,
35 final DOMDataBroker dataBroker) {
36 this.schemaContext = schemaContext;
37 // TODO schema contexts are different in data broker and the one we receive here ... the one received here should be updated same way as broker is
38 this.netconfSessionIdForReporting = netconfSessionIdForReporting;
39 this.operationProvider = new OperationProvider(netconfSessionIdForReporting, schemaContext, dataBroker);
47 // TODO does this get called dynamically ?
49 public Set<Capability> getCapabilities() {
50 final Set<Capability> capabilities = new HashSet<>();
51 // [RFC6241] 8.3. Candidate Configuration Capability
52 capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:candidate:1.0"));
54 final SchemaContext currentContext = schemaContext.getCurrentContext();
55 final Set<Module> modules = currentContext.getModules();
56 for (final Module module : modules) {
57 if(currentContext.getModuleSource(module).isPresent()) {
58 capabilities.add(new YangStoreCapability(module, currentContext.getModuleSource(module).get()));
60 LOG.warn("Missing source for module {}. This module will not be available from netconf server for session {}",
61 module, netconfSessionIdForReporting);
69 public Set<NetconfOperation> getNetconfOperations() {
70 return operationProvider.getOperations();
73 // TODO reuse from netconf impl
74 private static class BasicCapability implements Capability {
76 private final String capability;
78 private BasicCapability(final String capability) {
79 this.capability = capability;
83 public String getCapabilityUri() {
88 public Optional<String> getModuleNamespace() {
89 return Optional.absent();
93 public Optional<String> getModuleName() {
94 return Optional.absent();
98 public Optional<String> getRevision() {
99 return Optional.absent();
103 public Optional<String> getCapabilitySchema() {
104 return Optional.absent();
108 public Collection<String> getLocation() {
109 return Collections.emptyList();
113 public String toString() {
118 private static final class YangStoreCapability extends BasicCapability {
120 private final String content;
121 private final String revision;
122 private final String moduleName;
123 private final String moduleNamespace;
125 public YangStoreCapability(final Module module, final String moduleContent) {
126 super(toCapabilityURI(module));
127 this.content = moduleContent;
128 this.moduleName = module.getName();
129 this.moduleNamespace = module.getNamespace().toString();
130 this.revision = SimpleDateFormatUtil.getRevisionFormat().format(module.getRevision());
134 public Optional<String> getCapabilitySchema() {
135 return Optional.of(content);
138 private static String toCapabilityURI(final Module module) {
139 return String.valueOf(module.getNamespace()) + "?module="
140 + module.getName() + "&revision=" + SimpleDateFormatUtil.getRevisionFormat().format(module.getRevision());
144 public Optional<String> getModuleName() {
145 return Optional.of(moduleName);
149 public Optional<String> getModuleNamespace() {
150 return Optional.of(moduleNamespace);
154 public Optional<String> getRevision() {
155 return Optional.of(revision);