All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.blossomproject.generator.classes.EntityGenerator Maven / Gradle / Ivy

package com.blossomproject.generator.classes;

import com.blossomproject.generator.configuration.model.impl.EnumField;
import com.helger.jcodemodel.*;
import com.blossomproject.core.common.entity.AbstractEntity;
import com.blossomproject.generator.configuration.model.Field;
import com.blossomproject.generator.configuration.model.Settings;
import com.blossomproject.generator.configuration.model.StringField;
import com.blossomproject.generator.configuration.model.TemporalField;
import com.blossomproject.generator.configuration.model.impl.BlobField;
import com.blossomproject.generator.utils.GeneratorUtils;

import javax.persistence.*;
import java.util.EnumSet;

public class EntityGenerator implements ClassGenerator {

  @Override
  public void prepare(Settings settings, JCodeModel codeModel) {

  }

  @Override
  public JDefinedClass generate(Settings settings, JCodeModel codeModel) {
    try {
      JDefinedClass definedClass = codeModel
        ._class(GeneratorUtils.getEntityFullyQualifiedClassName(settings));
      definedClass._extends(AbstractEntity.class);

      // Entity name annotation
      JAnnotationUse entityAnnotation = definedClass.annotate(Entity.class);
      entityAnnotation.param("name", settings.getEntityName());

      // Table name annotation
      JAnnotationUse tableAnnotation = definedClass.annotate(Table.class);
      tableAnnotation.param("name", settings.getEntityNameLowerUnderscore());

      // Fields
      for (Field field : settings.getFields()) {
        addField(codeModel, definedClass, field);
      }

      return definedClass;
    } catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException("Can't generate PO", e);
    }
  }

  private void addField(JCodeModel codeModel, JDefinedClass definedClass, Field field) {



    // Field
    JFieldVar fieldVar = definedClass
      .field(JMod.PRIVATE, codeModel.ref(field.getClassName()), field.getName());
    JAnnotationUse columnAnnotation = fieldVar.annotate(Column.class);
    columnAnnotation.param("name", field.getColumnName().toLowerCase());



    if (field instanceof StringField) {
      if (((StringField) field).getMaxLength() != null) {
        columnAnnotation.param("length", ((StringField) field).getMaxLength());
      }

      if (((StringField) field).isLob()) {
        fieldVar.annotate(Lob.class);
      }
    }

    if (field instanceof TemporalField) {
      if (((TemporalField) field).getTemporalType() != null) {
        JAnnotationUse temporalTypeAnnotation = fieldVar.annotate(Temporal.class);
        temporalTypeAnnotation.param("value", ((TemporalField) field).getTemporalType());
      }
    }

    if(field instanceof BlobField){
      fieldVar.annotate(Lob.class);
    }


    if(field instanceof EnumField){
      try {
        JDefinedClass definedEnum = definedClass._enum(field.getClassName().getSimpleName());

        for(Object enumObj : EnumSet.allOf((Class)field.getClassName()) ){
          Enum enumCasted =  (Enum) enumObj;
          definedEnum.direct(enumCasted.toString()+",");
        }
        fieldVar.type(codeModel.ref(definedEnum.name()));
        fieldVar.annotate(Enumerated.class).param("value",EnumType.STRING);
      }
      catch (Exception e){
        System.out.println(e.getMessage());
      }
    }




    // Getter
    JMethod getter = definedClass.method(JMod.PUBLIC, fieldVar.type(), field.getGetterName());
    getter.body()._return(fieldVar);

    // Setter
    JMethod setter = definedClass.method(JMod.PUBLIC, void.class, field.getSetterName());
    JVar param = setter.param(fieldVar.type(), field.getName());
    setter.body().assign(JExpr.refthis(fieldVar.name()), param);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy