BeanInstructionsImpl.java
/*
* CSVeed (https://github.com/42BV/CSVeed)
*
* Copyright 2013-2023 CSVeed.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of The Apache Software License,
* Version 2.0 which accompanies this distribution, and is available at
* https://www.apache.org/licenses/LICENSE-2.0.txt
*/
package org.csveed.bean;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.csveed.bean.conversion.Converter;
import org.csveed.common.Column;
import org.csveed.row.RowInstructions;
import org.csveed.row.RowInstructionsImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The Class BeanInstructionsImpl.
*/
public class BeanInstructionsImpl implements BeanInstructions {
/** The Constant LOG. */
private static final Logger LOG = LoggerFactory.getLogger(BeanInstructionsImpl.class);
/** The row instructions. */
private RowInstructions rowInstructions = new RowInstructionsImpl();
/** The properties. */
private BeanProperties properties;
/** The mapping strategy. */
private Class<? extends AbstractMapper> mappingStrategy = ColumnIndexMapper.class;
/** The bean class. */
private Class beanClass;
/** The settings logged. */
private boolean settingsLogged;
/** The start index dynamic columns. */
private Column startIndexDynamicColumns;
/** The use header. */
private boolean useHeader = true;
/**
* Instantiates a new bean instructions impl.
*
* @param beanClass
* the bean class
*/
public BeanInstructionsImpl(Class beanClass) {
this.properties = new BeanProperties(beanClass);
this.beanClass = beanClass;
}
@Override
public void logSettings() {
if (settingsLogged) {
return;
}
LOG.info("- CSV config / mapping strategy: {}", this.getMappingStrategy());
for (BeanProperty property : properties) {
LOG.info("{}", getPropertyLogLine(property));
}
settingsLogged = true;
}
/**
* Gets the property log line.
*
* @param property
* the property
*
* @return the property log line
*/
protected String getPropertyLogLine(BeanProperty property) {
List<String> lineParts = new ArrayList<>();
lineParts.add("- CSV config");
if (mappingStrategy.equals(ColumnIndexMapper.class)) {
lineParts.add(
"Column index " + property.getColumnIndex() + " -> property [" + property.getPropertyName() + "]");
} else if (mappingStrategy.equals(ColumnNameMapper.class)) {
lineParts.add(
"Column name [" + property.getColumnName() + "] -> property [" + property.getPropertyName() + "]");
}
lineParts.add("Required: " + (property.isRequired() ? "yes" : "no"));
if (property.getConverter() != null) {
lineParts.add("Converter: " + property.getConverter().getClass().getSimpleName() + " for "
+ property.getPropertyType());
}
StringBuilder logLine = new StringBuilder();
boolean first = true;
for (String linePart : lineParts) {
if (!first) {
logLine.append(" | ");
}
logLine.append(linePart);
first = false;
}
return logLine.toString();
}
@Override
public RowInstructions getRowInstructions() {
return this.rowInstructions;
}
@Override
public BeanInstructions setUseHeader(boolean useHeader) {
this.rowInstructions.setUseHeader(useHeader);
this.useHeader = useHeader;
return this;
}
@Override
public BeanInstructions setStartRow(int startRow) {
this.rowInstructions.setStartRow(startRow);
return this;
}
@Override
public BeanInstructions setEscape(char symbol) {
this.rowInstructions.setEscape(symbol);
return this;
}
@Override
public BeanInstructions setQuote(char symbol) {
this.rowInstructions.setQuote(symbol);
return this;
}
@Override
public BeanInstructions setQuotingEnabled(boolean enabled) {
this.rowInstructions.setQuotingEnabled(enabled);
return this;
}
@Override
public BeanInstructions setSeparator(char symbol) {
this.rowInstructions.setSeparator(symbol);
return this;
}
@Override
public BeanInstructions setComment(char symbol) {
this.rowInstructions.setComment(symbol);
return this;
}
@Override
public BeanInstructions setEndOfLine(char[] symbols) {
this.rowInstructions.setEndOfLine(symbols);
return this;
}
@Override
public BeanInstructions skipEmptyLines(boolean skip) {
this.rowInstructions.skipEmptyLines(skip);
return this;
}
@Override
public BeanInstructions skipCommentLines(boolean skip) {
this.rowInstructions.skipCommentLines(skip);
return this;
}
@Override
public BeanInstructions setMapper(Class<? extends AbstractMapper> mapper) {
this.mappingStrategy = mapper;
return this;
}
@Override
public BeanInstructions setDate(String propertyName, String dateFormat) {
this.getProperties().setDate(propertyName, dateFormat);
return this;
}
@Override
public BeanInstructions setLocalizedNumber(String propertyName, Locale locale) {
this.getProperties().setLocalizedNumber(propertyName, locale);
return this;
}
@Override
public BeanInstructions setRequired(String propertyName, boolean required) {
this.getProperties().setRequired(propertyName, required);
return this;
}
@Override
public BeanInstructions setConverter(String propertyName, Converter converter) {
this.getProperties().setConverter(propertyName, converter);
return this;
}
@Override
public BeanInstructions ignoreProperty(String propertyName) {
this.getProperties().ignoreProperty(propertyName);
return this;
}
@Override
public BeanInstructions mapColumnIndexToProperty(int columnIndex, String propertyName) {
this.getProperties().mapIndexToProperty(columnIndex, propertyName);
return this;
}
@Override
public BeanInstructions mapColumnNameToProperty(String columnName, String propertyName) {
this.getProperties().mapNameToProperty(columnName, propertyName);
return this;
}
@Override
public BeanInstructions setHeaderNameToProperty(String propertyName) {
this.getProperties().setHeaderNameProperty(propertyName);
return this;
}
@Override
public BeanInstructions setHeaderValueToProperty(String propertyName) {
this.getProperties().setHeaderValueProperty(propertyName);
return this;
}
@Override
public BeanInstructions setStartIndexDynamicColumns(int startIndex) {
this.startIndexDynamicColumns = startIndex == 0 ? null : new Column(startIndex);
return this;
}
@Override
public Class<? extends AbstractMapper> getMappingStrategy() {
return this.mappingStrategy;
}
@Override
public BeanProperties getProperties() {
return this.properties;
}
@Override
public Column getStartIndexDynamicColumns() {
return this.startIndexDynamicColumns;
}
@Override
public Class getBeanClass() {
return this.beanClass;
}
@Override
public boolean useHeader() {
return useHeader;
}
}