Fix YANG snippet escaping
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / JavaFileTemplate.java
index f8aeba321c4ab282c171940648669303511ff239..58282d64e275cc6dc1ea7ae0ef110f2d05e7f0fd 100644 (file)
@@ -10,12 +10,16 @@ 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.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
+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.Restrictions;
 import org.opendaylight.mdsal.binding.model.api.Type;
 import org.opendaylight.mdsal.binding.model.util.Types;
 
@@ -23,6 +27,9 @@ import org.opendaylight.mdsal.binding.model.util.Types;
  * Base Java file template. Contains a non-null type and imports which the generated code refers to.
  */
 class JavaFileTemplate {
+    static final JavaTypeName NONNULL = JavaTypeName.create("org.eclipse.jdt.annotation", "NonNull");
+    static final JavaTypeName NULLABLE = JavaTypeName.create("org.eclipse.jdt.annotation", "Nullable");
+
     private final AbstractJavaGeneratedType javaType;
     private final GeneratedType type;
 
@@ -64,10 +71,26 @@ class JavaFileTemplate {
         return javaType.getReferenceString(intype);
     }
 
+    final String importedName(final Type intype, final String... annotations) {
+        return javaType.getReferenceString(intype, annotations);
+    }
+
     final String importedName(final Class<?> cls) {
         return importedName(Types.typeForClass(cls));
     }
 
+    final String importedName(final JavaTypeName intype) {
+        return javaType.getReferenceString(intype);
+    }
+
+    final String importedNonNull(final Type intype) {
+        return importedName(intype, importedName(NONNULL));
+    }
+
+    final String importedNullable(final Type intype) {
+        return importedName(intype, importedName(NULLABLE));
+    }
+
     final void addImport(final Class<?> cls) {
         javaType.getReferenceString(JavaTypeName.create(cls));
     }
@@ -77,4 +100,40 @@ class JavaFileTemplate {
         final Optional<JavaTypeName> optEnc = name.immediatelyEnclosingClass();
         return optEnc.isPresent() && type.getIdentifier().equals(optEnc.get());
     }
+
+    final CharSequence generateInnerClass(final GeneratedType innerClass) {
+        if (!(innerClass instanceof GeneratedTransferObject)) {
+            return "";
+        }
+
+        final GeneratedTransferObject gto = (GeneratedTransferObject) innerClass;
+        final NestedJavaGeneratedType innerJavaType = javaType.getEnclosedType(innerClass.getIdentifier());
+        return gto.isUnionType() ? new UnionTemplate(innerJavaType, gto).generateAsInnerClass()
+                : 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 ? Arrays.class : Objects.class);
+    }
+
+    static final Restrictions restrictionsForSetter(final Type actualType) {
+        return actualType instanceof GeneratedType ? null : getRestrictions(actualType);
+    }
+
+    static final Restrictions getRestrictions(final Type type) {
+        if (type instanceof ConcreteType) {
+            return ((ConcreteType) type).getRestrictions();
+        }
+        if (type instanceof GeneratedTransferObject) {
+            return ((GeneratedTransferObject) type).getRestrictions();
+        }
+        return null;
+    }
 }