Do not generate prime when not needed
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / BuilderGenerator.java
index 3bada347ead919c809978659a9b0d2ec5741af4f..1ce36f92a7ce84696020bbe733d14c5f821d581c 100644 (file)
@@ -7,34 +7,19 @@
  */
 package org.opendaylight.mdsal.binding.java.api.generator;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.AUGMENTABLE_AUGMENTATION_NAME;
-
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableSortedSet;
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.xtext.xbase.lib.StringExtensions;
 import org.opendaylight.mdsal.binding.model.api.CodeGenerator;
-import org.opendaylight.mdsal.binding.model.api.DefaultType;
 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.MethodSignature;
-import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
 import org.opendaylight.mdsal.binding.model.api.Type;
-import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
-import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
-import org.opendaylight.mdsal.binding.model.util.Types;
-import org.opendaylight.mdsal.binding.model.util.generated.type.builder.CodegenGeneratedTypeBuilder;
-import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
+import org.opendaylight.mdsal.binding.model.ri.generated.type.builder.CodegenGeneratedTOBuilder;
+import org.opendaylight.mdsal.binding.model.ri.generated.type.builder.CodegenGeneratedTypeBuilder;
 import org.opendaylight.yangtools.yang.binding.Augmentable;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
+import org.opendaylight.yangtools.yang.binding.YangData;
+import org.opendaylight.yangtools.yang.binding.contract.Naming;
 
 /**
  * Transformator of the data from the virtual form to JAVA programming language. The result source code represent java
@@ -43,20 +28,7 @@ import org.opendaylight.yangtools.yang.binding.Augmentation;
 public final class BuilderGenerator implements CodeGenerator {
     private static final JavaTypeName AUGMENTABLE = JavaTypeName.create(Augmentable.class);
     private static final JavaTypeName AUGMENTATION = JavaTypeName.create(Augmentation.class);
-
-    private static final Comparator<MethodSignature> METHOD_COMPARATOR = new AlphabeticallyTypeMemberComparator<>();
-    private static final Type AUGMENTATION_RET_TYPE;
-
-    static {
-        final Method m;
-        try {
-            m = Augmentable.class.getDeclaredMethod(AUGMENTABLE_AUGMENTATION_NAME, Class.class);
-        } catch (NoSuchMethodException e) {
-            throw new ExceptionInInitializerError(e);
-        }
-
-        AUGMENTATION_RET_TYPE = DefaultType.of(JavaTypeName.create(m.getReturnType()));
-    }
+    private static final JavaTypeName YANG_DATA = JavaTypeName.create(YangData.class);
 
     /**
      * Passes via list of implemented types in <code>type</code>.
@@ -66,11 +38,11 @@ public final class BuilderGenerator implements CodeGenerator {
      */
     @Override
     public boolean isAcceptable(final Type type) {
-        if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) {
-            for (Type t : ((GeneratedType) type).getImplements()) {
+        if (type instanceof GeneratedType generated && !(type instanceof GeneratedTransferObject)) {
+            for (Type t : generated.getImplements()) {
                 // "rpc" and "grouping" elements do not implement Augmentable
                 final JavaTypeName name = t.getIdentifier();
-                if (name.equals(AUGMENTABLE) || name.equals(AUGMENTATION)) {
+                if (name.equals(AUGMENTABLE) || name.equals(AUGMENTATION) || name.equals(YANG_DATA)) {
                     return true;
                 }
             }
@@ -84,136 +56,36 @@ public final class BuilderGenerator implements CodeGenerator {
      */
     @Override
     public String generate(final Type type) {
-        if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) {
-            return templateForType((GeneratedType) type).generate();
+        if (type instanceof GeneratedType generated && !(type instanceof GeneratedTransferObject)) {
+            return templateForType(generated).generate();
         }
         return "";
     }
 
     @Override
     public String getUnitName(final Type type) {
-        return type.getName() + BuilderTemplate.BUILDER_STR;
+        return type.getName() + Naming.BUILDER_SUFFIX;
     }
 
     @VisibleForTesting
     static BuilderTemplate templateForType(final GeneratedType type) {
-        final GeneratedType genType = type;
-        final JavaTypeName origName = genType.getIdentifier();
-
-        final Set<MethodSignature> methods = new LinkedHashSet<>();
-        final Type augmentType = createMethods(genType, methods);
-        final Set<MethodSignature> sortedMethods = ImmutableSortedSet.orderedBy(METHOD_COMPARATOR)
-                .addAll(methods).build();
-
-        final GeneratedTypeBuilder builderTypeBuilder = new CodegenGeneratedTypeBuilder(
-            origName.createSibling(origName.simpleName() + BuilderTemplate.BUILDER_STR));
-
-        final GeneratedTOBuilder implTypeBuilder = builderTypeBuilder.addEnclosingTransferObject(
-            origName.simpleName() + "Impl");
-        implTypeBuilder.addImplementsType(genType);
-
-        return new BuilderTemplate(builderTypeBuilder.build(), genType, propertiesFromMethods(sortedMethods),
-            augmentType, getKey(genType));
+        final JavaTypeName origName = type.getIdentifier();
+        final JavaTypeName builderName = origName.createSibling(origName.simpleName() + Naming.BUILDER_SUFFIX);
+
+        return new BuilderTemplate(new CodegenGeneratedTypeBuilder(builderName)
+            .addEnclosingTransferObject(new CodegenGeneratedTOBuilder(
+                builderName.createEnclosed(origName.simpleName() + "Impl"))
+                .addImplementsType(type)
+                .build())
+            .build(), type, getKey(type));
     }
 
     private static Type getKey(final GeneratedType type) {
         for (MethodSignature m : type.getMethodDefinitions()) {
-            if (BindingMapping.IDENTIFIABLE_KEY_NAME.equals(m.getName())) {
+            if (Naming.KEY_AWARE_KEY_NAME.equals(m.getName())) {
                 return m.getReturnType();
             }
         }
         return null;
     }
-
-    /**
-     * Returns set of method signature instances which contains all the methods of the <code>genType</code>
-     * and all the methods of the implemented interfaces.
-     *
-     * @returns set of method signature instances
-     */
-    private static ParameterizedType createMethods(final GeneratedType type, final Set<MethodSignature> methods) {
-        methods.addAll(type.getMethodDefinitions());
-        return collectImplementedMethods(type, methods, type.getImplements());
-    }
-
-    /**
-     * Adds to the <code>methods</code> set all the methods of the <code>implementedIfcs</code>
-     * and recursively their implemented interfaces.
-     *
-     * @param methods set of method signatures
-     * @param implementedIfcs list of implemented interfaces
-     */
-    private static ParameterizedType collectImplementedMethods(final GeneratedType type,
-            final Set<MethodSignature> methods, final List<Type> implementedIfcs) {
-        if (implementedIfcs == null || implementedIfcs.isEmpty()) {
-            return null;
-        }
-
-        ParameterizedType augmentType = null;
-        for (Type implementedIfc : implementedIfcs) {
-            if (implementedIfc instanceof GeneratedType && !(implementedIfc instanceof GeneratedTransferObject)) {
-                final GeneratedType ifc = (GeneratedType) implementedIfc;
-                methods.addAll(ifc.getMethodDefinitions());
-
-                final ParameterizedType t = collectImplementedMethods(type, methods, ifc.getImplements());
-                if (t != null && augmentType == null) {
-                    augmentType = t;
-                }
-            } else if (Augmentable.class.getName().equals(implementedIfc.getFullyQualifiedName())) {
-                augmentType = Types.parameterizedTypeFor(AUGMENTATION_RET_TYPE, DefaultType.of(type.getIdentifier()));
-            }
-        }
-
-        return augmentType;
-    }
-
-    /**
-     * Creates set of generated property instances from getter <code>methods</code>.
-     *
-     * @param set of method signature instances which should be transformed to list of properties
-     * @return set of generated property instances which represents the getter <code>methods</code>
-     */
-    private static Set<BuilderGeneratedProperty> propertiesFromMethods(final Collection<MethodSignature> methods) {
-        if (methods == null || methods.isEmpty()) {
-            return Collections.emptySet();
-        }
-        final Set<BuilderGeneratedProperty> result = new LinkedHashSet<>();
-        for (MethodSignature m : methods) {
-            final BuilderGeneratedProperty createdField = propertyFromGetter(m);
-            if (createdField != null) {
-                result.add(createdField);
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Creates generated property instance from the getter <code>method</code> name and return type.
-     *
-     * @param method method signature from which is the method name and return type obtained
-     * @return generated property instance for the getter <code>method</code>
-     * @throws IllegalArgumentException <ul>
-     *  <li>if the <code>method</code> equals <code>null</code></li>
-     *  <li>if the name of the <code>method</code> equals <code>null</code></li>
-     *  <li>if the name of the <code>method</code> is empty</li>
-     *  <li>if the return type of the <code>method</code> equals <code>null</code></li>
-     * </ul>
-     */
-    private static BuilderGeneratedProperty propertyFromGetter(final MethodSignature method) {
-        checkArgument(method != null);
-        checkArgument(method.getReturnType() != null);
-        checkArgument(method.getName() != null);
-        checkArgument(!method.getName().isEmpty());
-        if (method.isDefault()) {
-            return null;
-        }
-
-        final String prefix = BindingMapping.getGetterPrefix(Types.BOOLEAN.equals(method.getReturnType()));
-        if (!method.getName().startsWith(prefix)) {
-            return null;
-        }
-
-        return new BuilderGeneratedProperty(StringExtensions.toFirstLower(method.getName().substring(prefix.length())),
-            method);
-    }
 }