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

br.com.objectos.flat.FlatEntityPojoInfo 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.List;

import br.com.objectos.pojo.plugin.BuilderProperty;
import br.com.objectos.pojo.plugin.BuilderPropertyAction;
import br.com.objectos.pojo.plugin.Contribution;
import br.com.objectos.pojo.plugin.PojoInfo;
import br.com.objectos.pojo.plugin.PojoProperty;
import br.com.objectos.pojo.plugin.PojoPropertyAction;
import br.com.objectos.pojo.plugin.Property;

import com.squareup.javapoet.MethodSpec;

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

  private final List constructorList;
  private final List readMethodSpec;
  private final MethodSpec writeToMethodSpec;

  private FlatEntityPojoInfo(List constructorList,
                             List readMethodSpec,
                             MethodSpec writeToMethodSpec) {
    this.constructorList = constructorList;
    this.readMethodSpec = readMethodSpec;
    this.writeToMethodSpec = writeToMethodSpec;
  }

  public static FlatEntityPojoInfo of(PojoInfo pojoInfo) {
    FlatEntityConstructor constructor = new FlatEntityConstructor(pojoInfo);
    ReadMethodSpec read = ReadMethodSpec.of(pojoInfo);
    WriteToMethodSpec writeTo = new WriteToMethodSpec();

    pojoInfo.propertyStream()
        .map(FieldMethod::code)
        .forEach(method -> {
          method.accept(constructor);
          method.accept(read);
          method.accept(writeTo);
        });

    return new FlatEntityPojoInfo(
        constructor.build(),
        read.build(),
        writeTo.build());
  }

  public Contribution execute() {
    return Contribution.builder()
        .addBuilderPropertyAction(ThisBuilderPropertyAction.INSTANCE)
        .addPojoPropertyAction(ThisPojoPropertyAction.INSTANCE)
        .addMethods(constructorList)
        .addMethods(readMethodSpec)
        .addMethod(writeToMethodSpec)
        .build();
  }

  List constructor() {
    return constructorList;
  }

  List readMethodSpec() {
    return readMethodSpec;
  }

  MethodSpec writeToMethodSpec() {
    return writeToMethodSpec;
  }

  private static enum ThisBuilderPropertyAction implements BuilderPropertyAction {

    INSTANCE;

    @Override
    public BuilderProperty execute(Property property) {
      return FieldMethod.code(property).builderProperty();
    }

  }

  private static enum ThisPojoPropertyAction implements PojoPropertyAction {

    INSTANCE;

    @Override
    public PojoProperty execute(Property property) {
      return FieldMethod.code(property).pojoProperty();
    }

  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy