package br.com.concretesolutions.canarinho.formatador; import java.util.regex.Pattern; /** */ public final class FormatadorBoleto implements Formatador { private static final Pattern TRIBUTO_FORMATADO = Pattern .compile("(\\d{12})\\s(\\d{12})\\s(\\d{12})\\s(\\d{12})"); private static final Pattern TRIBUTO_DESFORMATADO = Pattern .compile("(\\d{12})(\\d{12})(\\d{12})(\\d{12})"); private static final FormatadorBase FORMATADOR_TRIBUTOS = new FormatadorBase(TRIBUTO_FORMATADO, "$1 $2 $3 $4", TRIBUTO_DESFORMATADO, "$1$2$3$4"); private static final Pattern NORMAL_FORMATADO = Pattern .compile("(\\d{5})[.](\\d{5})\\s(\\d{5})[.](\\d{6})\\s(\\d{5})[.](\\d{6})\\s(\\d)\\s(\\d{14})"); private static final Pattern NORMAL_DESFORMATADO = Pattern .compile("(\\d{5})(\\d{5})(\\d{5})(\\d{6})(\\d{5})(\\d{6})(\\d{1})(\\d{14})"); private static final FormatadorBase FORMATADOR_NORMAL = new FormatadorBase(NORMAL_FORMATADO, "$1.$2 $3.$4 $5.$6 $7 $8", NORMAL_DESFORMATADO, "$1$2$3$4$5$6$7$8"); // No instance creation private FormatadorBoleto() { } @Override public String formata(String value) { if (ehTributo(value)) { return FORMATADOR_TRIBUTOS.formata(value); } return FORMATADOR_NORMAL.formata(value); } @Override public String desformata(String value) { if (ehTributo(value)) { return FORMATADOR_TRIBUTOS.desformata(value); } return FORMATADOR_NORMAL.desformata(value); } @Override public boolean estaFormatado(String value) { if (ehTributo(value)) { return FORMATADOR_TRIBUTOS.estaFormatado(value); } return FORMATADOR_NORMAL.estaFormatado(value); } @Override public boolean podeSerFormatado(String value) { if (ehTributo(value)) { return FORMATADOR_TRIBUTOS.podeSerFormatado(value); } return FORMATADOR_NORMAL.podeSerFormatado(value); } private boolean ehTributo(String value) { if (value == null) { throw new IllegalArgumentException("Valor não pode ser nulo"); } return value.charAt(0) == '8'; } static FormatadorBoleto getInstance() { return SingletonHolder.INSTANCE; } private static class SingletonHolder { private static final FormatadorBoleto INSTANCE = new FormatadorBoleto(); } }