2 * Copyright (c) 2018 Pantheon Technologies, s.r.o. 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.java.api.generator;
10 import static com.google.common.base.Verify.verify;
11 import static java.util.Objects.requireNonNull;
13 import java.util.Arrays;
14 import java.util.List;
16 import java.util.Objects;
17 import java.util.Optional;
18 import java.util.regex.Pattern;
19 import java.util.stream.Collectors;
20 import org.opendaylight.mdsal.binding.model.api.ConcreteType;
21 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
22 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
23 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
24 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
25 import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
26 import org.opendaylight.mdsal.binding.model.api.Restrictions;
27 import org.opendaylight.mdsal.binding.model.api.Type;
28 import org.opendaylight.mdsal.binding.model.util.Types;
29 import org.opendaylight.yangtools.yang.binding.CodeHelpers;
32 * Base Java file template. Contains a non-null type and imports which the generated code refers to.
34 class JavaFileTemplate {
36 * {@code java.lang.Class} as a JavaTypeName.
38 static final JavaTypeName CLASS = JavaTypeName.create(Class.class);
40 * {@code java.lang.Deprecated} as a JavaTypeName.
42 static final JavaTypeName DEPRECATED = JavaTypeName.create(Deprecated.class);
44 * {@code java.lang.Override} as a JavaTypeName.
46 static final JavaTypeName OVERRIDE = JavaTypeName.create(Override.class);
49 * {@code java.lang.SuppressWarnings} as a JavaTypeName.
51 static final JavaTypeName SUPPRESS_WARNINGS = JavaTypeName.create(SuppressWarnings.class);
54 * {@code java.util.Arrays} as a JavaTypeName.
56 static final JavaTypeName JU_ARRAYS = JavaTypeName.create(Arrays.class);
58 * {@code java.util.List} as a JavaTypeName.
60 static final JavaTypeName JU_LIST = JavaTypeName.create(List.class);
62 * {@code java.util.Map} as a JavaTypeName.
64 static final JavaTypeName JU_MAP = JavaTypeName.create(Map.class);
66 * {@code java.util.Objects} as a JavaTypeName.
68 static final JavaTypeName JU_OBJECTS = JavaTypeName.create(Objects.class);
70 * {@code java.util.regex.Pattern} as a JavaTypeName.
72 static final JavaTypeName JUR_PATTERN = JavaTypeName.create(Pattern.class);
75 * {@code org.eclipse.jdt.annotation.NonNull} as a JavaTypeName.
77 static final JavaTypeName NONNULL = JavaTypeName.create("org.eclipse.jdt.annotation", "NonNull");
79 * {@code org.eclipse.jdt.annotation.Nullable} as a JavaTypeName.
81 static final JavaTypeName NULLABLE = JavaTypeName.create("org.eclipse.jdt.annotation", "Nullable");
84 * {@code org.opendaylight.yangtools.yang.binding.CodeHelpers} as a JavaTypeName.
86 static final JavaTypeName CODEHELPERS = JavaTypeName.create(CodeHelpers.class);
88 private final AbstractJavaGeneratedType javaType;
89 private final GeneratedType type;
91 JavaFileTemplate(final GeneratedType type) {
92 this(new TopLevelJavaGeneratedType(type), type);
95 JavaFileTemplate(final AbstractJavaGeneratedType javaType, final GeneratedType type) {
96 this.javaType = requireNonNull(javaType);
97 this.type = requireNonNull(type);
100 final AbstractJavaGeneratedType javaType() {
104 final GeneratedType type() {
108 final GeneratedProperty findProperty(final GeneratedTransferObject gto, final String name) {
109 final Optional<GeneratedProperty> optProp = gto.getProperties().stream()
110 .filter(prop -> prop.getName().equals(name)).findFirst();
111 if (optProp.isPresent()) {
112 return optProp.get();
115 final GeneratedTransferObject parent = gto.getSuperType();
116 return parent != null ? findProperty(parent, name) : null;
119 final String generateImportBlock() {
120 verify(javaType instanceof TopLevelJavaGeneratedType);
121 return ((TopLevelJavaGeneratedType) javaType).imports().map(name -> "import " + name + ";\n")
122 .collect(Collectors.joining());
125 final String importedJavadocName(final Type intype) {
126 return importedName(intype instanceof ParameterizedType ? ((ParameterizedType) intype).getRawType() : intype);
129 final String importedName(final Type intype) {
130 return javaType.getReferenceString(intype);
133 final String importedName(final Type intype, final String... annotations) {
134 return javaType.getReferenceString(intype, annotations);
137 final String importedName(final Class<?> cls) {
138 return importedName(Types.typeForClass(cls));
141 final String importedName(final JavaTypeName intype) {
142 return javaType.getReferenceString(intype);
145 final String importedNonNull(final Type intype) {
146 return importedName(intype, importedName(NONNULL));
149 final String importedNullable(final Type intype) {
150 return importedName(intype, importedName(NULLABLE));
153 final void addImport(final Class<?> cls) {
154 javaType.getReferenceString(JavaTypeName.create(cls));
157 // Exposed for BuilderTemplate
158 boolean isLocalInnerClass(final JavaTypeName name) {
159 final Optional<JavaTypeName> optEnc = name.immediatelyEnclosingClass();
160 return optEnc.isPresent() && type.getIdentifier().equals(optEnc.get());
163 final CharSequence generateInnerClass(final GeneratedType innerClass) {
164 if (!(innerClass instanceof GeneratedTransferObject)) {
168 final GeneratedTransferObject gto = (GeneratedTransferObject) innerClass;
169 final NestedJavaGeneratedType innerJavaType = javaType.getEnclosedType(innerClass.getIdentifier());
170 return gto.isUnionType() ? new UnionTemplate(innerJavaType, gto).generateAsInnerClass()
171 : new ClassTemplate(innerJavaType, gto).generateAsInnerClass();
175 * Return imported name of java.util class, whose hashCode/equals methods we want to invoke on the property. Returns
176 * {@link Arrays} if the property is an array, {@link Objects} otherwise.
178 * @param property Generated property
179 * @return Imported class name
181 final String importedUtilClass(final GeneratedProperty property) {
182 return importedName(property.getReturnType().getName().indexOf('[') != -1 ? JU_ARRAYS : JU_OBJECTS);
185 static final Restrictions restrictionsForSetter(final Type actualType) {
186 return actualType instanceof GeneratedType ? null : getRestrictions(actualType);
189 static final Restrictions getRestrictions(final Type type) {
190 if (type instanceof ConcreteType) {
191 return ((ConcreteType) type).getRestrictions();
193 if (type instanceof GeneratedTransferObject) {
194 return ((GeneratedTransferObject) type).getRestrictions();