/*
* Copyright (c) 2017 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.mdsal.binding.javav2.java.api.generator.renderers;
import com.google.common.base.Preconditions;
import java.util.ArrayList;
import java.util.List;
import org.opendaylight.mdsal.binding.javav2.java.api.generator.txt.enumTemplate;
import org.opendaylight.mdsal.binding.javav2.java.api.generator.txt.interfaceTemplate;
import org.opendaylight.mdsal.binding.javav2.java.api.generator.util.TextTemplateUtil;
import org.opendaylight.mdsal.binding.javav2.model.api.AnnotationType;
import org.opendaylight.mdsal.binding.javav2.model.api.Constant;
import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject;
import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
import org.opendaylight.mdsal.binding.javav2.model.api.MethodSignature;
import org.opendaylight.mdsal.binding.javav2.model.api.Type;
public class InterfaceRenderer extends BaseRenderer {
private static final char NEW_LINE = '\n';
/**
* Creates the instance of this class which is used for generating the interface file source
* code from type
.
* @param type generated type
*/
public InterfaceRenderer(final GeneratedType type) {
super(type);
Preconditions.checkNotNull(type, "Generated type reference cannot be NULL!");
}
@Override
protected String body() {
// mainAnnotations string with annotations for whole interface
final String mainAnnotations = generateAnnotations(getType().getAnnotations());
// StringBuilder string with the declaration of methods source code in JAVA format
final StringBuilder sb1 = new StringBuilder();
for (MethodSignature method : getType().getMethodDefinitions()) {
if (isAccessor(method)) {
sb1.append(TextTemplateUtil.asJavadoc(method.getComment()));
} else {
sb1.append(TextTemplateUtil.getJavaDocForInterface(method));
}
sb1.append(generateAnnotations(method.getAnnotations()))
.append(importedName(method.getReturnType()))
.append(' ')
.append(method.getName())
.append('(')
.append(generateParameters(method.getParameters()))
.append(");")
.append(NEW_LINE);
}
final String methodList = sb1.toString();
// enums string with rendered enums from template
final StringBuilder sb2 = new StringBuilder();
for (Enumeration enumeration : getType().getEnumerations()) {
final String importedName = importedName(String.class);
final String enumBody = enumTemplate.render(enumeration, importedName).body();
sb2.append(enumBody);
}
final String enums = sb2.toString();
final String generatedImports = generateImports(getType().getImplements());
// generatedConstants list of constants
final List strings = new ArrayList<>(getType().getConstantDefinitions().size());
for (Constant constant : getType().getConstantDefinitions()) {
strings.add(emitConstant(constant));
}
final String generatedConstants = String.join("\n", strings);
final List innerClasses = new ArrayList<>(getType().getEnclosedTypes().size());
for (GeneratedType innerClass : getType().getEnclosedTypes()) {
if (innerClass instanceof GeneratedTransferObject) {
if (((GeneratedTransferObject) innerClass).isUnionType()) {
final UnionRenderer unionRenderer = new UnionRenderer((GeneratedTransferObject) innerClass);
innerClasses.add(unionRenderer.generateAsInnerClass());
this.putAllToImportMap(unionRenderer.getImportMap());
} else {
final ClassRenderer classRenderer = new ClassRenderer((GeneratedTransferObject) innerClass);
innerClasses.add(classRenderer.generateAsInnerClass());
this.putAllToImportMap(classRenderer.getImportMap());
}
}
}
final String generatedInnerClasses = String.join("\n", innerClasses);
return interfaceTemplate.render(getType(), enums, mainAnnotations, methodList, generatedImports,
generatedConstants, generatedInnerClasses).body();
}
private boolean isAccessor (final MethodSignature maybeGetter) {
return maybeGetter.getName().startsWith("is") || maybeGetter.getName().startsWith("get");
}
/**
* @param annotationTypeList list of annotations
* @return String of annotations in format:
* "@"annotation
* (parameterName1=ParameterSingleValue1,...)
*
*/
private String generateAnnotations(final List annotationTypeList) {
final StringBuilder sb1 = new StringBuilder();
for (AnnotationType annotationType : annotationTypeList) {
sb1.append('@').append(importedName(annotationType));
if (!annotationType.getParameters().isEmpty()) {
sb1.append('(');
}
final List parameterList = new ArrayList<>(annotationType.getParameters().size());
for (AnnotationType.Parameter parameter : annotationType.getParameters()) {
final StringBuilder sb2 = new StringBuilder();
sb2.append(parameter.getName())
.append('=')
.append(parameter.getSingleValue());
parameterList.add(sb2.toString());
}
sb1.append(String.join(",", parameterList));
if (!annotationType.getParameters().isEmpty()) {
sb1.append(')');
}
sb1.append(NEW_LINE);
}
return sb1.toString();
}
/**
* @param parameters list of parameters
* @return list of parameters separated with ","
*/
private String generateImports(final List parameters) {
final List strings = new ArrayList<>(parameters.size());
for (Type parameter : parameters) {
strings.add(importedName(parameter));
}
return String.join(", ", strings);
}
}