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.Objects;
15 import java.util.Optional;
16 import java.util.stream.Collectors;
17 import org.opendaylight.mdsal.binding.model.api.ConcreteType;
18 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
19 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
20 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
21 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
22 import org.opendaylight.mdsal.binding.model.api.Restrictions;
23 import org.opendaylight.mdsal.binding.model.api.Type;
24 import org.opendaylight.mdsal.binding.model.util.Types;
27 * Base Java file template. Contains a non-null type and imports which the generated code refers to.
29 class JavaFileTemplate {
30 static final JavaTypeName NONNULL = JavaTypeName.create("org.eclipse.jdt.annotation", "NonNull");
31 static final JavaTypeName NULLABLE = JavaTypeName.create("org.eclipse.jdt.annotation", "Nullable");
33 private final AbstractJavaGeneratedType javaType;
34 private final GeneratedType type;
36 JavaFileTemplate(final GeneratedType type) {
37 this(new TopLevelJavaGeneratedType(type), type);
40 JavaFileTemplate(final AbstractJavaGeneratedType javaType, final GeneratedType type) {
41 this.javaType = requireNonNull(javaType);
42 this.type = requireNonNull(type);
45 final AbstractJavaGeneratedType javaType() {
49 final GeneratedType type() {
53 final GeneratedProperty findProperty(final GeneratedTransferObject gto, final String name) {
54 final Optional<GeneratedProperty> optProp = gto.getProperties().stream()
55 .filter(prop -> prop.getName().equals(name)).findFirst();
56 if (optProp.isPresent()) {
60 final GeneratedTransferObject parent = gto.getSuperType();
61 return parent != null ? findProperty(parent, name) : null;
64 final String generateImportBlock() {
65 verify(javaType instanceof TopLevelJavaGeneratedType);
66 return ((TopLevelJavaGeneratedType) javaType).imports().map(name -> "import " + name + ";\n")
67 .collect(Collectors.joining());
70 final String importedName(final Type intype) {
71 return javaType.getReferenceString(intype);
74 final String importedName(final Type intype, final String... annotations) {
75 return javaType.getReferenceString(intype, annotations);
78 final String importedName(final Class<?> cls) {
79 return importedName(Types.typeForClass(cls));
82 final String importedName(final JavaTypeName intype) {
83 return javaType.getReferenceString(intype);
86 final String importedNonNull(final Type intype) {
87 return importedName(intype, importedName(NONNULL));
90 final String importedNullable(final Type intype) {
91 return importedName(intype, importedName(NULLABLE));
94 final void addImport(final Class<?> cls) {
95 javaType.getReferenceString(JavaTypeName.create(cls));
98 // Exposed for BuilderTemplate
99 boolean isLocalInnerClass(final JavaTypeName name) {
100 final Optional<JavaTypeName> optEnc = name.immediatelyEnclosingClass();
101 return optEnc.isPresent() && type.getIdentifier().equals(optEnc.get());
104 final CharSequence generateInnerClass(final GeneratedType innerClass) {
105 if (!(innerClass instanceof GeneratedTransferObject)) {
109 final GeneratedTransferObject gto = (GeneratedTransferObject) innerClass;
110 final NestedJavaGeneratedType innerJavaType = javaType.getEnclosedType(innerClass.getIdentifier());
111 return gto.isUnionType() ? new UnionTemplate(innerJavaType, gto).generateAsInnerClass()
112 : new ClassTemplate(innerJavaType, gto).generateAsInnerClass();
116 * Return imported name of java.util class, whose hashCode/equals methods we want to invoke on the property. Returns
117 * {@link Arrays} if the property is an array, {@link Objects} otherwise.
119 * @param property Generated property
120 * @return Imported class name
122 final String importedUtilClass(final GeneratedProperty property) {
123 return importedName(property.getReturnType().getName().indexOf('[') != -1 ? Arrays.class : Objects.class);
126 static final Restrictions restrictionsForSetter(final Type actualType) {
127 return actualType instanceof GeneratedType ? null : getRestrictions(actualType);
130 static final Restrictions getRestrictions(final Type type) {
131 if (type instanceof ConcreteType) {
132 return ((ConcreteType) type).getRestrictions();
134 if (type instanceof GeneratedTransferObject) {
135 return ((GeneratedTransferObject) type).getRestrictions();