Enable spotbugs in mdsal-binding-java-api-generator
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / JavaFileTemplate.java
index 5387a82c5340020f862c7635de89588cdd4b8f91..5283f874be29ac893d30429259b3b281e9a45088 100644 (file)
@@ -10,25 +10,86 @@ package org.opendaylight.mdsal.binding.java.api.generator;
 import static com.google.common.base.Verify.verify;
 import static java.util.Objects.requireNonNull;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.model.api.ConcreteType;
 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
+import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
 import org.opendaylight.mdsal.binding.model.api.Restrictions;
 import org.opendaylight.mdsal.binding.model.api.Type;
 import org.opendaylight.mdsal.binding.model.util.Types;
+import org.opendaylight.yangtools.yang.binding.CodeHelpers;
 
 /**
  * Base Java file template. Contains a non-null type and imports which the generated code refers to.
  */
 class JavaFileTemplate {
+    /**
+     * {@code java.lang.Class} as a JavaTypeName.
+     */
+    static final @NonNull JavaTypeName CLASS = JavaTypeName.create(Class.class);
+    /**
+     * {@code java.lang.Deprecated} as a JavaTypeName.
+     */
+    static final @NonNull JavaTypeName DEPRECATED = JavaTypeName.create(Deprecated.class);
+    /**
+     * {@code java.lang.Override} as a JavaTypeName.
+     */
+    static final @NonNull JavaTypeName OVERRIDE = JavaTypeName.create(Override.class);
+
+    /**
+     * {@code java.lang.SuppressWarnings} as a JavaTypeName.
+     */
+    static final @NonNull JavaTypeName SUPPRESS_WARNINGS = JavaTypeName.create(SuppressWarnings.class);
+
+    /**
+     * {@code java.util.Arrays} as a JavaTypeName.
+     */
+    static final @NonNull JavaTypeName JU_ARRAYS = JavaTypeName.create(Arrays.class);
+    /**
+     * {@code java.util.List} as a JavaTypeName.
+     */
+    static final @NonNull JavaTypeName JU_LIST = JavaTypeName.create(List.class);
+    /**
+     * {@code java.util.Map} as a JavaTypeName.
+     */
+    static final @NonNull JavaTypeName JU_MAP = JavaTypeName.create(Map.class);
+    /**
+     * {@code java.util.Objects} as a JavaTypeName.
+     */
+    static final @NonNull JavaTypeName JU_OBJECTS = JavaTypeName.create(Objects.class);
+    /**
+     * {@code java.util.regex.Pattern} as a JavaTypeName.
+     */
+    static final @NonNull JavaTypeName JUR_PATTERN = JavaTypeName.create(Pattern.class);
+
+    /**
+     * {@code org.eclipse.jdt.annotation.NonNull} as a JavaTypeName.
+     */
+    static final @NonNull JavaTypeName NONNULL = JavaTypeName.create("org.eclipse.jdt.annotation", "NonNull");
+    /**
+     * {@code org.eclipse.jdt.annotation.Nullable} as a JavaTypeName.
+     */
+    static final @NonNull JavaTypeName NULLABLE = JavaTypeName.create("org.eclipse.jdt.annotation", "Nullable");
+
+    /**
+     * {@code org.opendaylight.yangtools.yang.binding.CodeHelpers} as a JavaTypeName.
+     */
+    static final @NonNull JavaTypeName CODEHELPERS = JavaTypeName.create(CodeHelpers.class);
+
     private final AbstractJavaGeneratedType javaType;
     private final GeneratedType type;
 
-    JavaFileTemplate(final GeneratedType type) {
+    JavaFileTemplate(final @NonNull GeneratedType type) {
         this(new TopLevelJavaGeneratedType(type), type);
     }
 
@@ -62,20 +123,32 @@ class JavaFileTemplate {
                 .collect(Collectors.joining());
     }
 
-    final String importedName(final Type intype) {
+    final @NonNull String importedJavadocName(final @NonNull Type intype) {
+        return importedName(intype instanceof ParameterizedType ? ((ParameterizedType) intype).getRawType() : intype);
+    }
+
+    final @NonNull String importedName(final @NonNull Type intype) {
         return javaType.getReferenceString(intype);
     }
 
-    final String importedName(final Class<?> cls) {
+    final @NonNull String importedName(final @NonNull Type intype, final @NonNull String annotation) {
+        return javaType.getReferenceString(intype, annotation);
+    }
+
+    final @NonNull String importedName(final Class<?> cls) {
         return importedName(Types.typeForClass(cls));
     }
 
-    final String importedName(final JavaTypeName intype) {
+    final @NonNull String importedName(final @NonNull JavaTypeName intype) {
         return javaType.getReferenceString(intype);
     }
 
-    final void addImport(final Class<?> cls) {
-        javaType.getReferenceString(JavaTypeName.create(cls));
+    final @NonNull String importedNonNull(final @NonNull Type intype) {
+        return importedName(intype, importedName(NONNULL));
+    }
+
+    final @NonNull String importedNullable(final @NonNull Type intype) {
+        return importedName(intype, importedName(NULLABLE));
     }
 
     // Exposed for BuilderTemplate
@@ -95,6 +168,17 @@ class JavaFileTemplate {
                 : new ClassTemplate(innerJavaType, gto).generateAsInnerClass();
     }
 
+    /**
+     * Return imported name of java.util class, whose hashCode/equals methods we want to invoke on the property. Returns
+     * {@link Arrays} if the property is an array, {@link Objects} otherwise.
+     *
+     * @param property Generated property
+     * @return Imported class name
+     */
+    final String importedUtilClass(final GeneratedProperty property) {
+        return importedName(property.getReturnType().getName().indexOf('[') != -1 ? JU_ARRAYS : JU_OBJECTS);
+    }
+
     static final Restrictions restrictionsForSetter(final Type actualType) {
         return actualType instanceof GeneratedType ? null : getRestrictions(actualType);
     }