BooleanFormatter.java
package com.gh.mygreen.xlsmapper.textformatter;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import com.github.mygreen.cellformatter.lang.ArgUtils;
/**
* Booleanのフォーマッタ。
*
* @since 2.0
* @author T.TSUCHIE
*
*/
public class BooleanFormatter implements TextFormatter<Boolean> {
private static final String[] DEFAULT_READ_TRUE_VALUES = new String[] {"true", "1", "yes", "on", "y", "t"};
private static final String[] DEFAULT_READ_FALSE_VALUES = new String[] {"false", "0", "no", "off", "f", "n"};
private static final String DEFAULT_WRITE_TRUE_VALUE = "true";
private static final String DEFAULT_WRITE_FALSE_VALUE = "false";
private final Set<String> loadTrueValues;
private final Set<String> loadFalseValues;
private final String saveTrueValue;
private final String saveFalseValue;
private boolean ignoreCase;
private boolean failToFalse;
public BooleanFormatter() {
this(DEFAULT_READ_TRUE_VALUES, DEFAULT_READ_FALSE_VALUES,
DEFAULT_WRITE_TRUE_VALUE, DEFAULT_WRITE_FALSE_VALUE,
true, false);
}
public BooleanFormatter(final String[] loadTrueValues, final String[] loadFalseValues,
final String saveTrueValue, final String saveFalseValue,
final boolean ignoreCase, boolean failToFalse) {
ArgUtils.notNull(loadTrueValues, "loadTrueValues");
ArgUtils.notNull(loadFalseValues, "loadFalseValues");
this.loadTrueValues = toSet(loadTrueValues);
this.loadFalseValues = toSet(loadFalseValues);
this.saveTrueValue = saveTrueValue;
this.saveFalseValue = saveFalseValue;
this.ignoreCase = ignoreCase;
this.failToFalse = failToFalse;
}
private static Set<String> toSet(final String[] values) {
Set<String> set = new LinkedHashSet<>();
Collections.addAll(set, values);
return Collections.unmodifiableSet(set);
}
@Override
public Boolean parse(final String text) {
if(contains(loadTrueValues, text, ignoreCase) ) {
return Boolean.TRUE;
} else if(contains(loadFalseValues, text, ignoreCase) ) {
return Boolean.FALSE;
} else {
if(failToFalse) {
return Boolean.FALSE;
} else {
final Map<String, Object> vars = new HashMap<>();
vars.put("trueValues", loadTrueValues);
vars.put("falseValues", loadFalseValues);
vars.put("ignoreCase", ignoreCase);
vars.put("failToFalse", failToFalse);
throw new TextParseException(text, Boolean.class, vars);
}
}
}
private static boolean contains(final Set<String> set, final String value, final boolean ignoreCase) {
if(ignoreCase) {
for(String element : set) {
if(element.equalsIgnoreCase(value)) {
return true;
}
}
return false;
} else {
return set.contains(value);
}
}
@Override
public String format(final Boolean object) {
return object ? saveTrueValue : saveFalseValue;
}
public boolean isIgnoreCase() {
return ignoreCase;
}
public void setIgnoreCase(boolean ignoreCase) {
this.ignoreCase = ignoreCase;
}
public boolean isFailToFalse() {
return failToFalse;
}
public void setFailToFalse(boolean failToFalse) {
this.failToFalse = failToFalse;
}
public Set<String> getLoadTrueValues() {
return loadTrueValues;
}
public Set<String> getLoadFalseValues() {
return loadFalseValues;
}
public String getSaveTrueValue() {
return saveTrueValue;
}
public String getSaveFalseValue() {
return saveFalseValue;
}
}