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

br.com.objectos.way.io.TableWriterBuilderPojo Maven / Gradle / Ivy

/*
 * Copyright 2013 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.io;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import br.com.objectos.core.collections.MoreCollectors;

/**
 * @author [email protected] (Marcio Endo)
 */
class TableWriterBuilderPojo implements TableWriterBuilder {

  private final TableProxy proxy;

  private final List columns = new ArrayList<>();

  private TableWriterBuilderPojo(TableProxy proxy) {
    this.proxy = proxy;
  }

  static  TableWriterBuilderPojo builderFor(Class type) {
    TableProxy proxy = TableProxy.proxyOf(type);
    return new TableWriterBuilderPojo(proxy);
  }

  @Override
  public TableWriter build() {
    return TableWriter.writerOf(columns.stream()
        .map(ColumnBuilderPojo::build)
        .collect(MoreCollectors.toImmutableList()));
  }

  @Override
  public ColumnBuilder addColumn() {
    int size = columns.size();
    int index = size;
    ColumnBuilderPojo column = new ColumnBuilderPojo(index);
    columns.add(column);
    return column;
  }

  private class ColumnBuilderPojo implements ColumnBuilder {

    private final int index;

    private Dimension width = Dimension.undefined();

    private final HeaderBuilderPojo header;

    public ColumnBuilderPojo(int index) {
      this.index = index;
      this.header = new HeaderBuilderPojo(index);
    }

    @Override
    public TableColumn build() {
      TableColumnHeader theHeader = header.build();
      ColBody body = header.body;
      TableColumnBody theBody = body.build();
      return new TableColumn(index, theHeader, theBody)
          .width(width);
    }

    @Override
    public ColumnBuilder widthOf(int val, Unit unit) {
      this.width = unit.dimensionOf(val);
      return this;
    }

    @Override
    public HeaderBuilder withHeader(String title) {
      return header.addTitle(title);
    }

  }

  private class HeaderBuilderPojo implements HeaderBuilder {

    private final int index;

    private final List> titles = new ArrayList<>();

    private TableColumnTitleBuilder title;

    private ColBody body;

    public HeaderBuilderPojo(int index) {
      this.index = index;
    }

    @Override
    public TableColumnHeader build() {
      List _title = TableColumnTitleBuilder.transform(titles);
      return new TableColumnHeader(index, _title);
    }

    public HeaderBuilder addTitle(String title) {
      this.title = this.title != null ?
          this.title.next(title, this) :
          new TableColumnTitleBuilder(title, this);
      this.titles.add(this.title);
      return this;
    }

    @Override
    public StyleBuilder> styledAs() {
      return this.title.styleBuilder;
    }

    @Override
    public HeaderBuilder withHeader(String title) {
      return addTitle(title);
    }

    @Override
    public ColumnBodyBooleanTrueBuilder writeBoolean() {
      return newAndSet(new ColumnBodyBooleanBuilderPojo());
    }

    @Override
    public ColumnBodyDoubleBuilder writeDouble() {
      return newAndSet(new ColumnBodyDoubleBuilderPojo());
    }

    @Override
    public ColumnBodyIntegerBuilder writeInteger() {
      return newAndSet(new ColumnBodyIntegerBuilderPojo());
    }

    @Override
    public ColumnBodyLocalDateBuilder writeLocalDate() {
      return newAndSet(new ColumnBodyLocalDateBuilderPojo());
    }

    @Override
    public ColumnBodyLocalDateTimeBuilder writeLocalDateTime() {
      return newAndSet(new ColumnBodyLocalDateTimeBuilderPojo());
    }

    @Override
    public ColumnBodyStringBuilder writeString() {
      return newAndSet(new ColumnBodyStringBuilderPojo());
    }

    private , V> W newAndSet(W body) {
      this.body = body;
      body.setIndex(index);
      return body;
    }

  }

  abstract class ColBody implements ColumnBodyBuilder {

    int index;

    TableMethodWrapper method;

    TableFormat format = EmptyTableFormat.INSTANCE;

    @Override
    public T byCalling() {
      return proxy.registerCall(this);
    }

    void setIndex(int index) {
      this.index = index;
    }

    void setMethod(TableMethodWrapper method) {
      this.method = method;
    }

  }

  private class ColumnBodyBooleanBuilderPojo
      extends ColBody
      implements ColumnBodyBooleanBuilder,
      ColumnBodyBooleanTrueBuilder,
      ColumnBodyBooleanFalseBuilder {

    String trueValue = "";

    String falseValue = "";

    TableStyleBuilder style = TableStyleBuilder.of(this);

    @Override
    public TableColumnBody build() {
      return TableColumnBody.forBoolean(index, method, trueValue, falseValue)
          .style(style.build(), format);
    }

    @Override
    public ColumnBodyBooleanFalseBuilder trueValue(String trueValue) {
      this.trueValue = Objects.requireNonNull(trueValue);
      return this;
    }

    @Override
    public ColumnBodyBooleanBuilder falseValue(String falseValue) {
      this.falseValue = Objects.requireNonNull(falseValue);
      return this;
    }

    @Override
    public StyleBuilder> styledAs() {
      return style;
    }

  }

  private class ColumnBodyDoubleBuilderPojo
      extends ColBody
      implements ColumnBodyDoubleBuilder {

    TableStyleBuilder style = TableStyleBuilder.of(this);

    @Override
    public TableColumnBody build() {
      return TableColumnBody.forDouble(index, method)
          .style(style.build(), format);
    }

    @Override
    public StyleBuilder> styledAs() {
      return style;
    }

    @Override
    public ColumnBodyDoubleBuilder formattedWith(NumericTableFormat format) {
      this.format = format;
      return this;
    }

  }

  private class ColumnBodyIntegerBuilderPojo
      extends ColBody
      implements ColumnBodyIntegerBuilder {

    TableStyleBuilder style = TableStyleBuilder.of(this);

    @Override
    public TableColumnBody build() {
      return TableColumnBody.forInteger(index, method)
          .style(style.build(), format);
    }

    @Override
    public StyleBuilder> styledAs() {
      return style;
    }

    @Override
    public ColumnBodyIntegerBuilder formattedWith(NumericTableFormat format) {
      this.format = format;
      return this;
    }

  }

  private class ColumnBodyLocalDateBuilderPojo
      extends ColBody
      implements ColumnBodyLocalDateBuilder {

    TableStyleBuilder style = TableStyleBuilder.of(this);

    @Override
    public TableColumnBody build() {
      return TableColumnBody.forLocalDate(index, method)
          .style(style.build(), format);
    }

    @Override
    public StyleBuilder> styledAs() {
      return style;
    }

    @Override
    public ColumnBodyLocalDateBuilder formattedWith(DateTimeTableFormat format) {
      this.format = format;
      return this;
    }

  }

  private class ColumnBodyLocalDateTimeBuilderPojo
      extends ColBody
      implements ColumnBodyLocalDateTimeBuilder {

    TableStyleBuilder style = TableStyleBuilder.of(this);

    @Override
    public TableColumnBody build() {
      return TableColumnBody.forLocalDateTime(index, method)
          .style(style.build(), format);
    }

    @Override
    public StyleBuilder> styledAs() {
      return style;
    }

    @Override
    public ColumnBodyLocalDateTimeBuilder formattedWith(DateTimeTableFormat format) {
      this.format = format;
      return this;
    }

  }

  private class ColumnBodyStringBuilderPojo
      extends ColBody
      implements ColumnBodyStringBuilder {

    TableStyleBuilder style = TableStyleBuilder.of(this);

    @Override
    public TableColumnBody build() {
      return TableColumnBody.forString(index, method)
          .style(style.build(), format);
    }

    @Override
    public StyleBuilder> styledAs() {
      return style;
    }

  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy