2 * Copyright (c) 2016 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.binding2.java.api.generator.renderers;
11 import static org.opendaylight.mdsal.binding2.generator.util.Binding2Mapping.MODEL_BINDING_PROVIDER_CLASS_NAME;
12 import static org.opendaylight.mdsal.binding2.generator.util.Binding2Mapping.getRootPackageName;
14 import com.google.common.base.Preconditions;
15 import com.google.common.collect.ImmutableSet;
16 import java.io.IOException;
17 import java.io.InputStream;
18 import java.util.Collections;
19 import java.util.Date;
20 import java.util.HashMap;
21 import java.util.HashSet;
24 import java.util.TreeMap;
25 import org.opendaylight.mdsal.binding2.generator.util.Types;
26 import org.opendaylight.mdsal.binding2.model.api.ParameterizedType;
27 import org.opendaylight.mdsal.binding2.model.api.Type;
28 import org.opendaylight.mdsal.binding2.model.api.WildcardType;
29 import org.opendaylight.mdsal.binding2.spec.YangModelBindingProvider;
30 import org.opendaylight.mdsal.binding2.spec.YangModuleInfo;
31 import org.opendaylight.mdsal.binding2.txt.modelProviderTemplate;
32 import org.opendaylight.mdsal.binding2.txt.yangModuleInfoTemplate;
33 import org.opendaylight.yangtools.yang.model.api.Module;
34 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
36 public class YangModuleInfoTemplateRenderer {
38 private final Module module;
39 private final SchemaContext ctx;
40 private final Map<String, String> importMap = new HashMap<>();
41 private final String packageName;
42 private final String modelBindingProviderName;
44 public YangModuleInfoTemplateRenderer(final Module module, final SchemaContext ctx) {
46 Preconditions.checkArgument(module != null, "Module must not be null.");
49 this.packageName = getRootPackageName(module);
51 final StringBuilder sb = new StringBuilder();
52 sb.append(packageName)
54 .append(MODEL_BINDING_PROVIDER_CLASS_NAME);
55 this.modelBindingProviderName = sb.toString();
58 protected String body() {
60 * list of all imported names for template
62 final Map<String, String> importedNames = new HashMap<>();
64 importedNames.put("string", importedName(String.class));
65 importedNames.put("stringBuilder", importedName(StringBuilder.class));
66 importedNames.put("set", importedName(Set.class));
67 importedNames.put("hashSet", importedName(HashSet.class));
68 importedNames.put("collections", importedName(Collections.class));
69 importedNames.put("immutableSet", importedName(ImmutableSet.class));
70 importedNames.put("inputStream", importedName(InputStream.class));
71 importedNames.put("iOException", importedName(IOException.class));
72 importedNames.put("yangModuleInfo", importedName(YangModuleInfo.class));
74 return yangModuleInfoTemplate.render(module, ctx, importedNames).body();
79 * @return generated final template
81 public String generateTemplate() {
82 final StringBuilder sb = new StringBuilder();
83 /* body must be filled before imports method call */
84 final String templateBody = body();
89 .append(templateBody);
93 public String generateModelProvider() {
94 return modelProviderTemplate.render(packageName, YangModelBindingProvider.class.getName(), YangModuleInfo.class
99 * walks through map of imports
100 * @return string of imports for template
102 private String imports() {
103 final StringBuilder sb = new StringBuilder();
104 for (Map.Entry<String, String> entry : importMap.entrySet()) {
105 if (!getRootPackageName(module).equals(entry.getValue())) {
107 .append(entry.getValue())
109 .append(entry.getKey())
113 return sb.toString();
116 private String importedName(final Class<?> cls) {
117 final Type inType = Types.typeForClass(cls);
118 putTypeIntoImports(inType);
119 return getExplicitType(inType);
122 private void putTypeIntoImports(final Type type) {
123 final String typeName = type.getName();
124 final String typePackageName = type.getPackageName();
125 if (typePackageName.startsWith("java.lang") || typePackageName.isEmpty()) {
128 if (!importMap.containsKey(typeName)) {
129 importMap.put(typeName, typePackageName);
131 if (type instanceof ParameterizedType) {
132 final Type[] params = ((ParameterizedType) type).getActualTypeArguments();
133 if (params != null) {
134 for (Type param : params) {
135 putTypeIntoImports(param);
141 private String getExplicitType(final Type type) {
142 final String typePackageName = type.getPackageName();
143 final String typeName = type.getName();
144 final String importedPackageName = importMap.get(typeName);
145 final StringBuilder sb;
146 if (typePackageName.equals(importedPackageName)) {
147 sb = new StringBuilder(type.getName());
148 if (sb.toString().equals("Void")) {
151 addActualTypeParameters(sb, type);
153 if (type.equals(Types.voidType())) {
156 sb = new StringBuilder();
157 if (!typePackageName.isEmpty()) {
158 sb.append(typePackageName)
160 .append(type.getName());
162 sb.append(type.getName());
164 addActualTypeParameters(sb, type);
166 return sb.toString();
169 private StringBuilder addActualTypeParameters(final StringBuilder sb, final Type type) {
170 if (type instanceof ParameterizedType) {
171 final Type[] pTypes = ((ParameterizedType) type).getActualTypeArguments();
173 sb.append(getParameters(pTypes));
179 private String getParameters(final Type[] pTypes) {
180 if (pTypes == null || pTypes.length == 0) {
183 final StringBuilder sb = new StringBuilder();
185 for (Type pType : pTypes) {
186 final Type type = pTypes[i];
187 String separator = ",";
188 if (i == (pTypes.length - 1)) {
191 String wildcardParam = "";
192 if (type.equals(Types.voidType())) {
193 sb.append("java.lang.Void" + separator);
195 if (type instanceof WildcardType) {
196 wildcardParam = "? extends ";
198 sb.append(wildcardParam + getExplicitType(type) + separator);
202 return sb.toString();
205 public static Module getSortedQName(final Set<Module> modules, final String name) {
206 final TreeMap<Date, Module> sorted = new TreeMap<>();
207 for (Module module : modules) {
208 if (name.equals(module.getName())) {
209 sorted.put(module.getRevision(), module);
212 return sorted.lastEntry().getValue();