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

net.autobuilder.core.PerThreadFactory Maven / Gradle / Ivy

There is a newer version: 2.9.3
Show newest version
package net.autobuilder.core;

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

import static javax.lang.model.element.Modifier.FINAL;
import static javax.lang.model.element.Modifier.PRIVATE;
import static javax.lang.model.element.Modifier.STATIC;

final class PerThreadFactory {

  private final Model model;
  private final MethodSpec initMethod;
  private final FieldSpec builder;
  private final FieldSpec inUse;

  private PerThreadFactory(
      Model model,
      MethodSpec initMethod,
      FieldSpec inUse) {
    this.model = model;
    this.initMethod = initMethod;
    this.builder = FieldSpec.builder(model.generatedClass, "builder")
        .build();
    this.inUse = inUse;
  }

  static PerThreadFactory create(
      Model model,
      MethodSpec initMethod,
      FieldSpec inUse) {
    return new PerThreadFactory(model, initMethod, inUse);
  }

  TypeSpec define() {
    return TypeSpec.classBuilder(model.perThreadFactoryClass())
        .addField(builder)
        .addMethod(builderMethod())
        .addMethod(builderMethodWithoutParam())
        .addModifiers(PRIVATE, STATIC, FINAL)
        .build();
  }

  private MethodSpec builderMethod() {
    ParameterSpec input = ParameterSpec.builder(TypeName.get(model.sourceElement().asType()), "input").build();
    CodeBlock.Builder block = CodeBlock.builder()
        .beginControlFlow("if ($N == null || $N.$N)", builder, builder, inUse)
        .addStatement("$N = new $T()", builder, model.generatedClass)
        .endControlFlow()
        .addStatement("$N.$N($N)", builder, initMethod, input)
        .addStatement("$N.$N = $L", builder, inUse, true)
        .addStatement("return $N", builder);
    return MethodSpec.methodBuilder("builder")
        .addParameter(input)
        .addCode(block.build())
        .returns(model.generatedClass)
        .build();
  }

  private MethodSpec builderMethodWithoutParam() {
    CodeBlock.Builder block = CodeBlock.builder()
        .beginControlFlow("if ($N == null || $N.$N)", builder, builder, inUse)
        .addStatement("$N = new $T()", builder, model.generatedClass)
        .endControlFlow()
        .addStatement("$N.$N = $L", builder, inUse, true)
        .addStatement("return $N", builder);
    return MethodSpec.methodBuilder("builder")
        .addCode(block.build())
        .returns(model.generatedClass)
        .build();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy