NullConvert.java
package com.github.mygreen.supercsv.cellprocessor.conversion;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import org.supercsv.cellprocessor.CellProcessorAdaptor;
import org.supercsv.cellprocessor.ift.StringCellProcessor;
import org.supercsv.util.CsvContext;
/**
* 値が比較対象の値と一致する場合、nullに変換する。
* <p>nullに変換した後も処理を続行する。</p>
*
* @since 2.0
* @author T.TSUCHIE
*
*/
public class NullConvert extends CellProcessorAdaptor implements StringCellProcessor {
private final Set<String> tokens = new HashSet<>();
private final boolean ignoreCase;
/**
*
* @param tokens 比較対象の値
* @param ignoreCase 大文字・小文字の区別を行うかどうか。
* @throws NullPointerException {@literal tokens is null.}
* @throws IllegalArgumentException {@literal tokens size is zero.}
*/
public NullConvert(final Collection<String> tokens, final boolean ignoreCase) {
super();
checkPreconditions(tokens);
this.tokens.addAll(toIgnoreCase(tokens, ignoreCase));
this.ignoreCase = ignoreCase;
}
/**
*
* @param tokens 比較対象の値
* @param ignoreCase 大文字・小文字の区別を行うかどうか
* @param next チェインとして次に実行されるCellProcessor
* @throws NullPointerException {@literal tokens is null.}
* @throws IllegalArgumentException {@literal tokens size is zero.}
*/
public NullConvert(final Collection<String> tokens, final boolean ignoreCase, final StringCellProcessor next) {
super(next);
checkPreconditions(tokens);
this.tokens.addAll(toIgnoreCase(tokens, ignoreCase));
this.ignoreCase = ignoreCase;
}
private static void checkPreconditions(final Collection<String> tokens) {
if(tokens == null) {
throw new NullPointerException("tokens should not be null.");
} else if(tokens.isEmpty()) {
throw new IllegalArgumentException("tokens should not be empty.");
}
}
private static Collection<String> toIgnoreCase(final Collection<String> value, boolean ignoreCase) {
if(!ignoreCase) {
return value;
}
return value.stream()
.map(v -> v.toLowerCase())
.collect(Collectors.toList());
}
private static String toIgnoreCase(final String value, boolean ignoreCase) {
if(!ignoreCase) {
return value;
}
return value.toLowerCase();
}
@Override
public <T> T execute(final Object value, final CsvContext context) {
if(value == null) {
return next.execute(value, context);
}
final String str = toIgnoreCase(value.toString(), ignoreCase);
if(tokens.contains(str)) {
return next.execute(null, context);
}
return next.execute(value, context);
}
/**
* 比較対象の値
* @return ignoreCase=trueの場合、小文字に変換している。
*/
public Set<String> getTokens() {
return tokens;
}
/**
* 大文字・小文字の区別を行うかどうか。
* @return
*/
public boolean isIgnoreCase() {
return ignoreCase;
}
}