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

br.com.objectos.flat.RepoInfo Maven / Gradle / Ivy

There is a newer version: 0.5.2
Show newest version
/*
 * Copyright 2016 Objectos, Fábrica de Software LTDA.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package br.com.objectos.flat;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import javax.lang.model.element.Modifier;

import br.com.objectos.code.Artifact;
import br.com.objectos.code.ConstructorInfo;
import br.com.objectos.code.ParameterInfo;
import br.com.objectos.code.TypeInfo;
import br.com.objectos.code.TypeParameterInfo;

import com.squareup.javapoet.CodeBlock;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterSpec;
import com.squareup.javapoet.TypeSpec;

/**
 * @author [email protected] (Marcio Endo)
 */
class RepoInfo {

  private final TypeInfo typeInfo;
  private final RepoInfoHelper helper;

  private RepoInfo(TypeInfo typeInfo, RepoInfoHelper helper) {
    this.typeInfo = typeInfo;
    this.helper = helper;
  }

  public static Optional of(TypeInfo typeInfo) {
    TypeInfo pojoTypeInfo = typeInfo.superClassTypeInfo()
        .get()
        .typeParameterInfoList()
        .stream()
        .findFirst()
        .flatMap(TypeParameterInfo::typeInfo)
        .get();

    List pojoConstructorInfoList = pojoTypeInfo.constructorInfoList();
    if (pojoConstructorInfoList.size() > 1) {
      typeInfo.compilationError("FlatEntity must have a single constructor.");
      return Optional.empty();
    }

    RepoInfoHelperBuilder helper = new RepoInfoHelperBuilder(pojoTypeInfo);

    ConstructorInfo pojoConstructorInfo = pojoConstructorInfoList.get(0);
    pojoConstructorInfo.parameterInfoStream()
        .forEach(helper::add);

    RepoInfo info = new RepoInfo(typeInfo, helper.build());
    return Optional.of(info);
  }

  public Artifact generate() {
    JavaFile javaFile = typeInfo.toJavaFile(typeSpec());
    return Artifact.of(javaFile);
  }

  @Override
  public String toString() {
    return typeInfo.toString();
  }

  MethodSpec constructor() {
    return helper.constructor();
  }

  List fieldList() {
    return helper.fieldList();
  }

  MethodSpec mapperMethodSpec() {
    return helper.mapperMethodSpec();
  }

  MethodSpec ofFileMethodSpec() {
    return helper.ofFileMethodSpec(typeInfo);
  }

  MethodSpec recordSizeMethodSpec() {
    return helper.recordSizeMethodSpec();
  }

  TypeSpec typeSpec() {
    return TypeSpec.classBuilder(typeInfo.classNameSuffix("Repo"))
        .addAnnotation(RepoProcessor.GENERATED)
        .addModifiers(Modifier.FINAL)
        .superclass(typeInfo.className())
        .addFields(fieldList())
        .addMethod(constructor())
        .addMethod(ofFileMethodSpec())
        .addMethod(mapperMethodSpec())
        .addMethod(recordSizeMethodSpec())
        .build();
  }

  private static class RepoInfoHelperBuilder {

    private final TypeInfo pojoTypeInfo;

    private final List fieldList = new ArrayList<>();
    private final List parameterSpecList = new ArrayList<>();
    private final CodeBlock.Builder parameterAssignment = CodeBlock.builder();
    private final StringBuilder parameterNames = new StringBuilder();

    private RepoInfoHelperBuilder(TypeInfo pojoTypeInfo) {
      this.pojoTypeInfo = pojoTypeInfo;
    }

    public void add(ParameterInfo parameterInfo) {
      FieldSpec fieldSpec = parameterInfo.fieldWriter()
          .modifiers(Modifier.PRIVATE, Modifier.FINAL)
          .write();
      fieldList.add(fieldSpec);

      ParameterSpec parameterSpec = parameterInfo.parameterSpec();
      parameterSpecList.add(parameterSpec);
      parameterAssignment.addStatement("this.$1L = $1L", parameterInfo.name());

      parameterNames.append(parameterInfo.name());
      parameterNames.append(", ");
    }

    public RepoInfoHelper build() {
      return new RepoInfoHelper(
          pojoTypeInfo,
          fieldList,
          parameterSpecList,
          parameterAssignment.build(),
          parameterNames.toString());
    }

  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy