
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 extends HeaderBuilder> 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 extends ColumnBodyBooleanBuilder> 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 extends ColumnBodyDoubleBuilder> 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 extends ColumnBodyIntegerBuilder> 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 extends ColumnBodyLocalDateBuilder> 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 extends ColumnBodyLocalDateTimeBuilder> 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 extends ColumnBodyStringBuilder> styledAs() {
return style;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy