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

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

package com.blossomproject.generator.classes;

import com.helger.jcodemodel.AbstractJClass;
import com.helger.jcodemodel.JBlock;
import com.helger.jcodemodel.JCodeModel;
import com.helger.jcodemodel.JDefinedClass;
import com.helger.jcodemodel.JExpr;
import com.helger.jcodemodel.JMethod;
import com.helger.jcodemodel.JMod;
import com.helger.jcodemodel.JVar;
import com.blossomproject.core.common.dto.AbstractDTO;
import com.blossomproject.core.common.event.CreatedEvent;
import com.blossomproject.core.common.event.UpdatedEvent;
import com.blossomproject.core.common.service.AssociationServicePlugin;
import com.blossomproject.core.common.service.GenericCrudServiceImpl;
import com.blossomproject.generator.configuration.model.Field;
import com.blossomproject.generator.configuration.model.Settings;
import com.blossomproject.generator.utils.GeneratorUtils;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.plugin.core.PluginRegistry;

public class ServiceImplGenerator implements ClassGenerator {

  private AbstractJClass entityClass;
  private AbstractJClass daoClass;
  private AbstractJClass mapperClass;
  private AbstractJClass dtoClass;
  private AbstractJClass serviceClass;
  private AbstractJClass createFormClass;
  private AbstractJClass updateFormClass;

  @Override
  public void prepare(Settings settings, JCodeModel codeModel) {
    this.entityClass = codeModel.ref(GeneratorUtils.getEntityFullyQualifiedClassName(settings));
    this.daoClass = codeModel.ref(GeneratorUtils.getDaoFullyQualifiedClassName(settings));
    this.mapperClass = codeModel.ref(GeneratorUtils.getMapperFullyQualifiedClassName(settings));
    this.dtoClass = codeModel.ref(GeneratorUtils.getDtoFullyQualifiedClassName(settings));
    this.serviceClass = codeModel.ref(GeneratorUtils.getServiceFullyQualifiedClassName(settings));
    this.createFormClass = codeModel
      .ref(GeneratorUtils.getCreateFormFullyQualifiedClassName(settings));
    this.updateFormClass = codeModel
      .ref(GeneratorUtils.getUpdateFormFullyQualifiedClassName(settings));
  }

  @Override
  public JDefinedClass generate(Settings settings, JCodeModel codeModel) {
    try {

      JDefinedClass definedClass = codeModel
        ._class(GeneratorUtils.getServiceImplFullyQualifiedClassName(settings));
      definedClass
        ._extends(codeModel.ref(GenericCrudServiceImpl.class).narrow(dtoClass, entityClass));
      definedClass._implements(serviceClass);

      JMethod constructor = definedClass.constructor(JMod.PUBLIC);
      constructor.body().invoke("super")
        .arg(constructor.param(daoClass, "dao"))
        .arg(constructor.param(mapperClass, "mapper"))
        .arg(constructor.param(ApplicationEventPublisher.class, "publisher"))
        .arg(constructor.param(codeModel.ref(PluginRegistry.class)
            .narrow(codeModel.ref(AssociationServicePlugin.class),
              codeModel.ref(Class.class).narrow(codeModel.ref(AbstractDTO.class).wildcardExtends())),
          "associationRegistry"));

      buildCreate(settings, definedClass, codeModel);
      buildUpdate(settings, definedClass, codeModel);

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

  private void buildCreate(Settings settings, JDefinedClass definedClass, JCodeModel codeModel) {
    JMethod create = definedClass.method(JMod.PUBLIC, dtoClass, "create");
    create.annotate(Override.class);
    JVar form = create.param(createFormClass, "createForm");

    JBlock body = create.body();
    JVar toCreate = body.decl(dtoClass, "toCreate", JExpr._new(dtoClass));
    for (Field field : settings.getFields()) {
      if (field.isRequiredCreate()) {
        body.add(toCreate.invoke(field.getSetterName()).arg(form.invoke(field.getGetterName())));
      }
    }
    body._return(JExpr._this().invoke("create").arg(toCreate));
  }

  private void buildUpdate(Settings settings, JDefinedClass definedClass, JCodeModel codeModel) {
    JMethod update = definedClass.method(JMod.PUBLIC, dtoClass, "update");
    update.annotate(Override.class);
    JVar id = update.param(Long.class, "id");
    JVar form = update.param(updateFormClass, "updateForm");

    JBlock body = update.body();
    JVar toUpdate = body.decl(dtoClass, "toUpdate", JExpr._this().invoke("getOne").arg(id));
    for (Field field : settings.getFields()) {
      if (field.isPossibleUpdate()) {
        body.add(toUpdate.invoke(field.getSetterName()).arg(form.invoke(field.getGetterName())));
      }
    }

    body._return(JExpr._this().invoke("update").arg(id).arg(toUpdate));

  }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy