31339498e3b65e19ab469270ec8ce6ed62d014b0
[mdsal.git] / binding / mdsal-binding-generator-impl / src / main / java / org / opendaylight / mdsal / binding / generator / impl / CodegenTypeGenerator.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies, s.r.o.  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 package org.opendaylight.mdsal.binding.generator.impl;
9
10 import static org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil.encodeAngleBrackets;
11
12 import java.util.ArrayList;
13 import java.util.Collection;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Optional;
17 import java.util.Set;
18 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
19 import org.opendaylight.mdsal.binding.model.api.Type;
20 import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition;
21 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
22 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
23 import org.opendaylight.mdsal.binding.model.api.type.builder.TypeMemberBuilder;
24 import org.opendaylight.mdsal.binding.model.util.TypeComments;
25 import org.opendaylight.mdsal.binding.yang.types.CodegenTypeProvider;
26 import org.opendaylight.yangtools.yang.model.api.DocumentedNode;
27 import org.opendaylight.yangtools.yang.model.api.Module;
28 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
29 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
30
31 final class CodegenTypeGenerator extends AbstractTypeGenerator {
32     CodegenTypeGenerator(final SchemaContext context, final Map<SchemaNode, JavaTypeName> renames) {
33         super(context, new CodegenTypeProvider(context, renames), renames);
34     }
35
36     List<Type> toTypes(final Collection<? extends Module> modules) {
37         final List<Type> filteredGenTypes = new ArrayList<>();
38         for (final Module m : modules) {
39             filteredGenTypes.addAll(moduleContext(m.getQNameModule()).getGeneratedTypes());
40             final Set<Type> additionalTypes = typeProvider().getAdditionalTypes().get(m);
41             if (additionalTypes != null) {
42                 filteredGenTypes.addAll(additionalTypes);
43             }
44         }
45         return filteredGenTypes;
46     }
47
48     @Override
49     void addCodegenInformation(final GeneratedTypeBuilderBase<?> genType, final Module module,
50             final SchemaNode node) {
51         YangSourceDefinition.of(module, node).ifPresent(genType::setYangSourceDefinition);
52         TypeComments.description(node).ifPresent(genType::addComment);
53         node.getDescription().ifPresent(genType::setDescription);
54         node.getReference().ifPresent(genType::setReference);
55     }
56
57     @Override
58     void addCodegenInformation(final GeneratedTypeBuilderBase<?> genType, final Module module) {
59         YangSourceDefinition.of(module).ifPresent(genType::setYangSourceDefinition);
60         TypeComments.description(module).ifPresent(genType::addComment);
61         module.getDescription().ifPresent(genType::setDescription);
62         module.getReference().ifPresent(genType::setReference);
63     }
64
65     @Override
66     void addCodegenInformation(final GeneratedTypeBuilder interfaceBuilder, final Module module,
67             final String description, final Collection<?  extends SchemaNode> nodes) {
68         interfaceBuilder.addComment(TypeComments.javadoc("Interface for implementing the following YANG " + description
69             + " defined in module <b>" + module.getName() + "</b>").get());
70         YangSourceDefinition.of(module, nodes).ifPresent(interfaceBuilder::setYangSourceDefinition);
71     }
72
73     @Override
74     void addComment(final TypeMemberBuilder<?> genType, final DocumentedNode node) {
75         final Optional<String> optDesc = node.getDescription();
76         if (optDesc.isPresent()) {
77             genType.setComment(encodeAngleBrackets(optDesc.get()));
78         }
79     }
80 }