package fr.openwide.core.commons.util.functional.builder.function.generic;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.text.WordUtils;
import com.google.common.base.CharMatcher;
import com.google.common.base.Function;
import com.google.common.base.Strings;
import fr.openwide.core.commons.util.functional.builder.function.BigDecimalFunctionBuildState;
import fr.openwide.core.commons.util.functional.builder.function.BooleanFunctionBuildState;
import fr.openwide.core.commons.util.functional.builder.function.DateFunctionBuildState;
import fr.openwide.core.commons.util.functional.builder.function.DoubleFunctionBuildState;
import fr.openwide.core.commons.util.functional.builder.function.IntegerFunctionBuildState;
import fr.openwide.core.commons.util.functional.builder.function.LongFunctionBuildState;
import fr.openwide.core.commons.util.functional.builder.function.StringFunctionBuildState;
public abstract class GenericStringFunctionBuildStateImpl
<
TBuildResult,
TStateSwitcher extends FunctionBuildStateSwitcher<TBuildResult, String, TBooleanState, TDateState, TIntegerState, TLongState, TDoubleState, TBigDecimalState, TStringState>,
TBooleanState extends BooleanFunctionBuildState<?, TBooleanState, TDateState, TIntegerState, TLongState, TDoubleState, TBigDecimalState, TStringState>,
TDateState extends DateFunctionBuildState<?, TBooleanState, TDateState, TIntegerState, TLongState, TDoubleState, TBigDecimalState, TStringState>,
TIntegerState extends IntegerFunctionBuildState<?, TBooleanState, TDateState, TIntegerState, TLongState, TDoubleState, TBigDecimalState, TStringState>,
TLongState extends LongFunctionBuildState<?, TBooleanState, TDateState, TIntegerState, TLongState, TDoubleState, TBigDecimalState, TStringState>,
TDoubleState extends DoubleFunctionBuildState<?, TBooleanState, TDateState, TIntegerState, TLongState, TDoubleState, TBigDecimalState, TStringState>,
TBigDecimalState extends BigDecimalFunctionBuildState<?, TBooleanState, TDateState, TIntegerState, TLongState, TDoubleState, TBigDecimalState, TStringState>,
TStringState extends StringFunctionBuildState<TBuildResult, TBooleanState, TDateState, TIntegerState, TLongState, TDoubleState, TBigDecimalState, TStringState>
>
extends GenericFunctionBuildStateImpl<TBuildResult, String, TStateSwitcher, TBooleanState, TDateState, TIntegerState, TLongState, TDoubleState, TBigDecimalState, TStringState>
implements StringFunctionBuildState<TBuildResult, TBooleanState, TDateState, TIntegerState, TLongState, TDoubleState, TBigDecimalState, TStringState> {
private static final char[] DEFAULT_WORD_DELIMITERS = { ' ', '\t', '\'' };
private static String stripToNull(CharSequence charSequence) {
if (charSequence == null) {
return null;
}
return Strings.emptyToNull(CharMatcher.WHITESPACE.trimFrom(charSequence));
}
@Override
public TBuildResult withDefault(final String defaultValue) {
return toString(new Function<String, String>() {
@Override
public String apply(String input) {
return StringUtils.defaultIfEmpty(input, defaultValue);
}
}).build();
}
@Override
public TStringState strip() {
return toString(new Function<String, String>() {
@Override
public String apply(String input) {
return stripToNull(input);
}
});
}
@Override
public TStringState trim() {
return toString(new Function<String, String>() {
@Override
public String apply(String input) {
return StringUtils.trimToNull(input);
}
});
}
@Override
public TStringState clean() {
return toString(new Function<String, String>() {
@Override
public String apply(String input) {
return stripToNull(StringUtils.trimToNull(input));
}
});
}
@Override
public TStringState capitalize(char... delimiters) {
final char[] actualDelimiters = (delimiters == null || delimiters.length == 0) ? DEFAULT_WORD_DELIMITERS : delimiters;
return toString(new Function<String, String>() {
@Override
public String apply(String input) {
return WordUtils.capitalize(input, actualDelimiters);
}
});
}
@Override
public TStringState capitalizeFully(char... delimiters) {
final char[] actualDelimiters = (delimiters == null || delimiters.length == 0) ? DEFAULT_WORD_DELIMITERS : delimiters;
return toString(new Function<String, String>() {
@Override
public String apply(String input) {
return WordUtils.capitalizeFully(input, actualDelimiters);
}
});
}
@Override
public TStringState replaceAll(final Pattern pattern, final String replacement) {
return toString(new Function<String, String>() {
@Override
public String apply(String input) {
if (input == null) {
return null;
} else {
Matcher matcher = pattern.matcher(input);
return matcher.replaceAll(replacement);
}
}
});
}
@Override
public TStringState replaceAll(final CharMatcher charMatcher, final CharSequence replacement) {
return toString(new Function<String, String>() {
@Override
public String apply(String input) {
if (input == null) {
return null;
} else {
return charMatcher.replaceFrom(input, replacement);
}
}
});
}
@Override
public TStringState removeAll(Pattern pattern) {
return replaceAll(pattern, "");
}
@Override
public TStringState removeAll(final CharMatcher charMatcher) {
return toString(new Function<String, String>() {
@Override
public String apply(String input) {
if (input == null) {
return null;
} else {
return charMatcher.removeFrom(input);
}
}
});
}
@Override
public TStringState extract(Pattern pattern) {
return extract(pattern, 0);
}
@Override
public TStringState extract(final Pattern pattern, final int group) {
return toString(new Function<String, String>() {
@Override
public String apply(String input) {
if (input == null) {
return null;
} else {
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
return matcher.group(group);
} else {
return null;
}
}
}
});
}
@Override
public TStringState stripLineBreaks() {
return toString(new Function<String, String>() {
@Override
public String apply(String input) {
if (input == null) {
return null;
}
String cleanString = input.replace(StringUtils.CR + StringUtils.LF, " ");
cleanString = cleanString.replace(StringUtils.LF, " ");
cleanString = cleanString.replace(StringUtils.CR, " ");
return cleanString;
}
});
}
}