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

br.com.objectos.way.flat.FlatEntityPojoInfo Maven / Gradle / Ivy

There is a newer version: 0.6.0
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.way.flat;

import java.util.List;

import br.com.objectos.core.util.MoreCollectors;
import br.com.objectos.way.pojo.plugin.BuilderProperty;
import br.com.objectos.way.pojo.plugin.BuilderPropertyAction;
import br.com.objectos.way.pojo.plugin.Contribution;
import br.com.objectos.way.pojo.plugin.PojoInfo;
import br.com.objectos.way.pojo.plugin.PojoProperty;
import br.com.objectos.way.pojo.plugin.PojoPropertyAction;
import br.com.objectos.way.pojo.plugin.Property;

import com.squareup.javapoet.MethodSpec;

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

  private final List constructorList;
  private final MethodSpec writeTo;

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

  public static FlatEntityPojoInfo of(PojoInfo pojoInfo) {
    List fieldMethodList = pojoInfo.propertyStream()
        .map(FieldMethod::code)
        .collect(MoreCollectors.toImmutableList());
    int fieldMethodSize = fieldMethodList.size();

    FlatEntityConstructor constructor = FlatEntityConstructor.of(pojoInfo, fieldMethodSize);
    FlatEntityWriteTo writeTo = new FlatEntityWriteTo();

    for (int i = 0; i < fieldMethodSize; i++) {
      constructor.setIndex(i);
      FieldMethod method = fieldMethodList.get(i);
      method.accept(constructor);
      method.accept(writeTo);
    }

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

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

  List constructorList() {
    return constructorList;
  }

  MethodSpec writeTo() {
    return writeTo;
  }

  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