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
8 package org.opendaylight.mdsal.binding.javav2.java.api.generator.renderers;
10 import static org.opendaylight.mdsal.binding.javav2.generator.util.Types.BOOLEAN;
12 import com.google.common.base.Preconditions;
13 import com.google.common.collect.Collections2;
14 import java.beans.ConstructorProperties;
15 import java.util.ArrayList;
16 import java.util.HashMap;
17 import java.util.List;
19 import org.opendaylight.mdsal.binding.javav2.java.api.generator.txt.unionTemplate;
20 import org.opendaylight.mdsal.binding.javav2.java.api.generator.util.TextTemplateUtil;
21 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
22 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedProperty;
23 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject;
24 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
25 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
27 public class UnionRenderer extends ClassRenderer {
28 public UnionRenderer(final GeneratedTransferObject type) {
33 protected String generateConstructors() {
34 // list of all imported names for template
35 final Map<String, String> importedNames = new HashMap<>();
37 if (isBaseEncodingImportRequired()) {
38 this.putToImportMap("BaseEncoding","com.google.common.io");
40 for (GeneratedProperty finalProperty : getFinalProperties()) {
41 importedNames.put("constructorProperties", importedName(ConstructorProperties.class));
42 importedNames.put("string", importedName(String.class));
43 importedNames.put(finalProperty.getName(), importedName(finalProperty.getReturnType()));
46 for (GeneratedProperty property : getProperties()) {
47 if ("char[]".equals(property.getReturnType().getName())) {
48 importedNames.put("constructorProperties", importedName(ConstructorProperties.class));
49 importedNames.put("string", importedName(String.class));
50 importedNames.put(property.getName(), importedName(property.getReturnType()));
54 final StringBuilder sb = new StringBuilder();
55 if (!getProperties().isEmpty()) {
56 for (GeneratedProperty property : getProperties()) {
57 sb.append(generateField(property));
61 if (getProperties().isEmpty() && !getParentProperties().isEmpty()) {
62 importedNames.put("superType", importedName(genTO.getSuperType()));
65 for (GeneratedProperty parentProperty : getParentProperties()) {
66 importedNames.put(parentProperty.getName(), importedName(parentProperty.getReturnType()));
69 return unionTemplate.render(getType(), importedNames, getFinalProperties(), getParentProperties(),
70 getProperties(), sb.toString()).body();
73 private boolean isBaseEncodingImportRequired() {
74 for (GeneratedProperty property : getFinalProperties()) {
75 final Type returnType = property.getReturnType();
76 if (returnType instanceof GeneratedTransferObject) {
77 final GeneratedTransferObject returnTypeGto = (GeneratedTransferObject)returnType;
78 if (returnTypeGto.isTypedef() && returnTypeGto.getProperties() != null
79 && !returnTypeGto.getProperties().isEmpty() && returnTypeGto.getProperties().size() == 1
80 && "value".equals(returnTypeGto.getProperties().get(0).getName())
81 && "byte[]".equals(returnTypeGto.getProperties().get(0).getReturnType().getName())) {
89 private String generateField(final GeneratedProperty generatedProperty) {
90 final StringBuilder sb = new StringBuilder();
91 final String name = TextTemplateUtil.fieldName(generatedProperty);
96 if (!"value".equals(name) && importedName(generatedProperty.getReturnType()).contains("[]")) {
97 sb.append(" == null ? null : source.")
102 return sb.toString();
105 private String generateCharArrayFieldForTypedef(final String fieldName, GeneratedTransferObject typedefType) {
106 Preconditions.checkState(typedefType.isTypedef(),"Not a typedef type!");
108 final StringBuilder sb = new StringBuilder();
109 final List<GeneratedProperty> retTypeCastProperties = typedefType.getProperties();
111 if (retTypeCastProperties != null
112 && !retTypeCastProperties.isEmpty() && retTypeCastProperties.size() == 1
113 && retTypeCastProperties.get(0).getName().equals("value")) {
115 final StringBuilder sb1 = new StringBuilder(fieldName);
117 .append(TextTemplateUtil.getterMethodName(retTypeCastProperties.get(0)))
120 sb.append(generateCharArrayField(sb1.toString(), retTypeCastProperties.get(0)));
121 // generated bits typedef
122 } else if (retTypeCastProperties != null && !retTypeCastProperties.isEmpty()
123 && typedefType.getBaseType() instanceof BitsTypeDefinition) {
124 sb.append("java.util.Arrays.toString(")
126 .append(".getValue()).toCharArray();");
128 //generated typedef typedef
129 } else if ((retTypeCastProperties == null || retTypeCastProperties.isEmpty())) {
130 Preconditions.checkState(typedefType.getSuperType() != null);
132 sb.append(generateCharArrayFieldForTypedef(fieldName,
133 (GeneratedTransferObject) typedefType.getSuperType()));
136 return sb.toString();
139 private String generateCharArrayField(final String fieldName, final GeneratedProperty generatedProperty) {
140 final StringBuilder sb = new StringBuilder();
141 final Type propertyReturnType = generatedProperty.getReturnType();
143 // generated type String
144 if ("java.lang.String".equals(propertyReturnType.getFullyQualifiedName())) {
145 sb.append(fieldName).append(".toCharArray();");
146 // generated type InstanceIdentifier
147 } else if ("org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier"
148 .equals(propertyReturnType.getFullyQualifiedName())) {
149 sb.append(fieldName).append(".toString().toCharArray();");
150 //generated type binary, boolean, empty
151 } else if (BOOLEAN.equals(propertyReturnType)) {
152 sb.append(fieldName).append(".toString().toCharArray();");
153 //generated type byte[]
154 } else if ("byte[]".equals(propertyReturnType.getName())) {
155 sb.append("BaseEncoding.base64().encode(").append(fieldName)
156 .append(").toCharArray();");
157 //generated type int*, uint, decimal64 or enumeration*
158 } else if (propertyReturnType.getFullyQualifiedName().startsWith("java.lang")
159 || propertyReturnType instanceof Enumeration
160 || propertyReturnType.getFullyQualifiedName().startsWith("java.math")
161 || propertyReturnType.getFullyQualifiedName().startsWith("org.opendaylight.yangtools.yang.common")) {
162 sb.append(fieldName).append(".toString().toCharArray();");
164 } else if (propertyReturnType instanceof GeneratedTransferObject) {
165 final GeneratedTransferObject propRetTypeCast = (GeneratedTransferObject) propertyReturnType;
167 // generated union type
168 if (propRetTypeCast.isUnionType()) {
169 sb.append(fieldName).append(".getValue();");
171 // generated typedef type
172 } else if (propRetTypeCast.isTypedef()) {
173 sb.append(generateCharArrayFieldForTypedef(fieldName, propRetTypeCast));
178 .append(".getValue().toString().toCharArray();");
181 return sb.toString();
185 protected String getterMethod(final GeneratedProperty field) {
186 if (!"value".equals(field.getName())) {
187 return super.getterMethod(field);
190 final StringBuilder sb1 = new StringBuilder();
191 final String name = TextTemplateUtil.fieldName(field);
192 final String importedName = Preconditions.checkNotNull(importedName(field.getReturnType()));
193 sb1.append("public ")
194 .append(importedName)
196 .append(TextTemplateUtil.getterMethodName(field))
199 final List<GeneratedProperty> filtered = new ArrayList<>(Collections2.filter(this.getFinalProperties(),
200 input -> !"value".equals(input.getName())));
202 final List<CharSequence> strings = new ArrayList<>(filtered.size());
204 for (GeneratedProperty property : filtered) {
205 final Type propertyReturnType = property.getReturnType();
206 //string builder for current property
207 final StringBuilder sb = new StringBuilder();
209 .append(TextTemplateUtil.fieldName(property))
210 .append(" != null) {")
211 .append(TextTemplateUtil.fieldName(field))
213 .append(generateCharArrayField(TextTemplateUtil.fieldName(property), property))
218 sb1.append(String.join(" else ", strings))
221 sb1.append("return ")
223 if (importedName.contains("[]")) {
224 sb1.append(" == null ? null : ")
228 sb1.append(";\n}\n");
230 return sb1.toString();
234 protected String generateInnerClassBody(GeneratedTransferObject innerClass) {
235 final UnionRenderer unionRenderer = new UnionRenderer((GeneratedTransferObject) innerClass);
236 final String body = unionRenderer.generateAsInnerClass();
237 this.putAllToImportMap(unionRenderer.getImportMap());