2 * Copyright (c) 2020 PANTHEON.tech s.r.o. 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
8 package org.opendaylight.mdsal.yanglib.rfc8525;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.annotations.VisibleForTesting;
13 import java.util.Optional;
14 import java.util.stream.Collectors;
15 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
16 import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
17 import org.opendaylight.mdsal.yanglib.api.YangLibraryContentBuilder;
18 import org.opendaylight.mdsal.yanglib.api.YangLibraryContentBuilderWithLegacy;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesState;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesStateBuilder;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.RevisionIdentifier;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.CommonLeafs;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.Module;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.ModuleBuilder;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.module.SubmoduleBuilder;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.YangIdentifier;
28 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
29 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
30 import org.opendaylight.yangtools.yang.common.Revision;
31 import org.opendaylight.yangtools.yang.data.api.DatastoreIdentifier;
32 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
33 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
35 final class LegacyContentBuilder implements YangLibraryContentBuilderWithLegacy {
36 private static final CommonLeafs.Revision EMPTY_REV = new CommonLeafs.Revision("");
38 private final BindingDataObjectCodecTreeNode<ModulesState> legacyCodec;
39 private final YangLibraryContentBuilderImpl delegate;
41 LegacyContentBuilder(final YangLibraryContentBuilderImpl delegate, final BindingCodecTree codecTree) {
42 this.delegate = requireNonNull(delegate);
43 legacyCodec = codecTree.getDataObjectCodec(InstanceIdentifier.create(ModulesState.class));
47 public LegacyContentBuilder defaultContext(final EffectiveModelContext context) {
48 delegate.defaultContext(context);
53 public YangLibraryContentBuilder addDatastore(final DatastoreIdentifier identifier,
54 final EffectiveModelContext context) {
55 return delegate.addDatastore(identifier, context);
59 public YangLibraryContentBuilderWithLegacy includeLegacy() {
64 public ContainerNode formatYangLibraryContent() {
65 return delegate.formatYangLibrary();
69 public Optional<ContainerNode> formatYangLibraryLegacyContent() {
70 return Optional.of(formatModulesState(requireNonNull(delegate.getModelContext())));
74 ContainerNode formatModulesState(final EffectiveModelContext context) {
75 // Two-step process: we first build the content and then use hashCode() to generate module-set-id
76 final ModulesStateBuilder builder = new ModulesStateBuilder()
78 .setModule(context.getModules().stream()
79 .map(module -> new ModuleBuilder()
80 .setName(new YangIdentifier(module.getName()))
81 .setNamespace(new Uri(module.getNamespace().toString()))
82 .setRevision(convertRevision(module.getRevision()))
83 .setSubmodule(module.getSubmodules().stream()
84 .map(submodule -> new SubmoduleBuilder()
85 .setName(new YangIdentifier(submodule.getName()))
86 .setRevision(convertRevision(submodule.getRevision()))
88 .collect(BindingMap.toMap()))
89 .setFeature(module.getFeatures().stream()
90 .map(feat -> new YangIdentifier(feat.getQName().getLocalName()))
91 .collect(Collectors.toUnmodifiableSet()))
92 .setConformanceType(Module.ConformanceType.Implement)
94 .collect(BindingMap.toMap()));
96 return (ContainerNode) legacyCodec.serialize(builder.setModuleSetId(String.valueOf(builder.build().hashCode()))
100 private static CommonLeafs.Revision convertRevision(final Optional<Revision> revision) {
101 return revision.map(rev -> new CommonLeafs.Revision(new RevisionIdentifier(rev.toString()))).orElse(EMPTY_REV);