2 * Copyright (c) 2017 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.mdsal.binding.javav2.java.api.generator.renderers;
11 import com.google.common.base.Preconditions;
12 import java.util.ArrayList;
13 import java.util.List;
14 import org.opendaylight.mdsal.binding.javav2.java.api.generator.txt.enumTemplate;
15 import org.opendaylight.mdsal.binding.javav2.java.api.generator.txt.interfaceTemplate;
16 import org.opendaylight.mdsal.binding.javav2.java.api.generator.util.TextTemplateUtil;
17 import org.opendaylight.mdsal.binding.javav2.model.api.AnnotationType;
18 import org.opendaylight.mdsal.binding.javav2.model.api.Constant;
19 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
20 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject;
21 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
22 import org.opendaylight.mdsal.binding.javav2.model.api.MethodSignature;
23 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
25 public class InterfaceRenderer extends BaseRenderer {
27 private static final char NEW_LINE = '\n';
30 * Creates the instance of this class which is used for generating the interface file source
31 * code from <code>type</code>.
32 * @param type generated type
34 public InterfaceRenderer(final GeneratedType type) {
36 Preconditions.checkNotNull(type, "Generated type reference cannot be NULL!");
40 protected String body() {
41 // mainAnnotations string with annotations for whole interface
42 final String mainAnnotations = generateAnnotations(getType().getAnnotations());
43 // StringBuilder string with the declaration of methods source code in JAVA format
44 final StringBuilder sb1 = new StringBuilder();
45 for (MethodSignature method : getType().getMethodDefinitions()) {
46 if (isAccessor(method)) {
47 sb1.append(TextTemplateUtil.asJavadoc(method.getComment()));
49 sb1.append(TextTemplateUtil.getJavaDocForInterface(method));
51 sb1.append(generateAnnotations(method.getAnnotations()))
52 .append(importedName(method.getReturnType()))
54 .append(method.getName())
56 .append(generateParameters(method.getParameters()))
60 final String methodList = sb1.toString();
62 // enums string with rendered enums from template
63 final StringBuilder sb2 = new StringBuilder();
64 for (Enumeration enumeration : getType().getEnumerations()) {
65 final String importedName = importedName(String.class);
66 final String enumBody = enumTemplate.render(enumeration, importedName).body();
69 final String enums = sb2.toString();
71 final String generatedImports = generateImports(getType().getImplements());
72 // generatedConstants list of constants
73 final List<String> strings = new ArrayList<>(getType().getConstantDefinitions().size());
74 for (Constant constant : getType().getConstantDefinitions()) {
75 strings.add(emitConstant(constant));
78 final String generatedConstants = String.join("\n", strings);
80 final List<String> innerClasses = new ArrayList<>(getType().getEnclosedTypes().size());
81 for (GeneratedType innerClass : getType().getEnclosedTypes()) {
82 if (innerClass instanceof GeneratedTransferObject) {
83 if (((GeneratedTransferObject) innerClass).isUnionType()) {
84 final UnionRenderer unionRenderer = new UnionRenderer((GeneratedTransferObject) innerClass);
85 innerClasses.add(unionRenderer.generateAsInnerClass());
86 this.putAllToImportMap(unionRenderer.getImportMap());
88 final ClassRenderer classRenderer = new ClassRenderer((GeneratedTransferObject) innerClass);
89 innerClasses.add(classRenderer.generateAsInnerClass());
90 this.putAllToImportMap(classRenderer.getImportMap());
94 final String generatedInnerClasses = String.join("\n", innerClasses);
96 return interfaceTemplate.render(getType(), enums, mainAnnotations, methodList, generatedImports,
97 generatedConstants, generatedInnerClasses).body();
100 private static boolean isAccessor(final MethodSignature maybeGetter) {
101 return maybeGetter.getName().startsWith("is") || maybeGetter.getName().startsWith("get");
105 * @param annotationTypeList list of annotations
106 * @return String of annotations in format:
108 * (parameterName1=ParameterSingleValue1,...)
111 private String generateAnnotations(final List<AnnotationType> annotationTypeList) {
112 final StringBuilder sb1 = new StringBuilder();
113 for (AnnotationType annotationType : annotationTypeList) {
114 sb1.append('@').append(importedName(annotationType));
115 if (!annotationType.getParameters().isEmpty()) {
118 final List<String> parameterList = new ArrayList<>(annotationType.getParameters().size());
119 for (AnnotationType.Parameter parameter : annotationType.getParameters()) {
120 final StringBuilder sb2 = new StringBuilder();
121 sb2.append(parameter.getName())
123 .append(parameter.getSingleValue());
124 parameterList.add(sb2.toString());
126 sb1.append(String.join(",", parameterList));
127 if (!annotationType.getParameters().isEmpty()) {
130 sb1.append(NEW_LINE);
132 return sb1.toString();
136 * @param parameters list of parameters
137 * @return list of parameters separated with ","
139 private String generateImports(final List<Type> parameters) {
140 final List<String> strings = new ArrayList<>(parameters.size());
141 for (Type parameter : parameters) {
142 strings.add(importedName(parameter));
145 return String.join(", ", strings);