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 com.google.common.base.Preconditions;
13 import java.util.Collection;
14 import java.util.Collections;
15 import java.util.HashSet;
17 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
18 import org.opendaylight.controller.netconf.api.Capability;
19 import org.opendaylight.controller.netconf.api.monitoring.CapabilityListener;
20 import org.opendaylight.controller.netconf.mapping.api.NetconfOperationServiceFactory;
21 import org.opendaylight.controller.sal.core.api.model.SchemaService;
22 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
23 import org.opendaylight.yangtools.yang.model.api.Module;
24 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 public class MdsalNetconfOperationServiceFactory implements NetconfOperationServiceFactory, AutoCloseable {
30 private static final Logger LOG = LoggerFactory.getLogger(MdsalNetconfOperationServiceFactory.class);
32 private final DOMDataBroker dataBroker;
33 private final CurrentSchemaContext currentSchemaContext;
35 public MdsalNetconfOperationServiceFactory(final SchemaService schemaService, final DOMDataBroker domDataBroker) {
36 this.currentSchemaContext = new CurrentSchemaContext(Preconditions.checkNotNull(schemaService));
37 this.dataBroker = Preconditions.checkNotNull(domDataBroker);
41 public MdsalNetconfOperationService createService(final String netconfSessionIdForReporting) {
42 return new MdsalNetconfOperationService(currentSchemaContext, netconfSessionIdForReporting, dataBroker);
46 public void close() throws Exception {
47 currentSchemaContext.close();
51 public Set<Capability> getCapabilities() {
52 return transformCapabilities(currentSchemaContext.getCurrentContext());
55 static Set<Capability> transformCapabilities(final SchemaContext currentContext1) {
56 final Set<Capability> capabilities = new HashSet<>();
57 // [RFC6241] 8.3. Candidate Configuration Capability
58 capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:candidate:1.0"));
60 final SchemaContext currentContext = currentContext1;
61 final Set<Module> modules = currentContext.getModules();
62 for (final Module module : modules) {
63 if(currentContext.getModuleSource(module).isPresent()) {
64 capabilities.add(new YangStoreCapability(module, currentContext.getModuleSource(module).get()));
66 LOG.warn("Missing source for module {}. This module will not be available from netconf server",
75 public AutoCloseable registerCapabilityListener(final CapabilityListener listener) {
76 return currentSchemaContext.registerCapabilityListener(listener);
79 private static class BasicCapability implements Capability {
81 private final String capability;
83 private BasicCapability(final String capability) {
84 this.capability = capability;
88 public String getCapabilityUri() {
93 public Optional<String> getModuleNamespace() {
94 return Optional.absent();
98 public Optional<String> getModuleName() {
99 return Optional.absent();
103 public Optional<String> getRevision() {
104 return Optional.absent();
108 public Optional<String> getCapabilitySchema() {
109 return Optional.absent();
113 public Collection<String> getLocation() {
114 return Collections.emptyList();
118 public String toString() {
123 private static final class YangStoreCapability extends BasicCapability {
125 private final String content;
126 private final String revision;
127 private final String moduleName;
128 private final String moduleNamespace;
130 public YangStoreCapability(final Module module, final String moduleContent) {
131 super(toCapabilityURI(module));
132 this.content = moduleContent;
133 this.moduleName = module.getName();
134 this.moduleNamespace = module.getNamespace().toString();
135 this.revision = SimpleDateFormatUtil.getRevisionFormat().format(module.getRevision());
139 public Optional<String> getCapabilitySchema() {
140 return Optional.of(content);
143 private static String toCapabilityURI(final Module module) {
144 return String.valueOf(module.getNamespace()) + "?module="
145 + module.getName() + "&revision=" + SimpleDateFormatUtil.getRevisionFormat().format(module.getRevision());
149 public Optional<String> getModuleName() {
150 return Optional.of(moduleName);
154 public Optional<String> getModuleNamespace() {
155 return Optional.of(moduleNamespace);
159 public Optional<String> getRevision() {
160 return Optional.of(revision);