package fr.openwide.core.basicapp.core.business.common.model; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; import com.google.common.base.CharMatcher; import fr.openwide.core.jpa.hibernate.usertype.AbstractMaterializedPrimitiveValue; public final class PhoneNumber extends AbstractMaterializedPrimitiveValue<String, PhoneNumber> { private static final long serialVersionUID = 7055290426664681655L; public static final int TAILLE_FR = 10; private static final CharMatcher SEPARATOR_MATCHER = CharMatcher.WHITESPACE.or(CharMatcher.anyOf(".-")); private static final Pattern LOCAL_FRENCH_NUMBER_PATTERN = Pattern.compile("^\\d{10}$"); private static final Pattern INTERNATIONAL_FRENCH_NUMBER_PATTERN = Pattern.compile("^(\\((00|\\+33)\\)0|(00|\\+)33)(?=\\d{9}$)"); private static final String INTERNATION_FRENCH_NUMBER_TO_LOCAL_REPLACEMENT = "0$1"; private static String clean(String value) { String noSeparator = SEPARATOR_MATCHER.removeFrom(value); if (StringUtils.isEmpty(noSeparator)) { return null; } else { if (LOCAL_FRENCH_NUMBER_PATTERN.matcher(noSeparator).find()) { return noSeparator; } else { Matcher internationalMatcher = INTERNATIONAL_FRENCH_NUMBER_PATTERN.matcher(noSeparator); if (internationalMatcher.find()) { return internationalMatcher.replaceFirst(INTERNATION_FRENCH_NUMBER_TO_LOCAL_REPLACEMENT); } } // Si le format n'est ni un numéro français tel que composé depuis la France, // ni un numéro français au format internationnal, on remplace simplement les séparateurs par des espaces return SEPARATOR_MATCHER.trimAndCollapseFrom(value, ' '); } } public static PhoneNumber buildClean(String value) { String cleaned = clean(value); if (StringUtils.isEmpty(cleaned)) { return null; } else { return new PhoneNumber(cleaned); } } /** * @deprecated Ne pas utiliser, présent uniquement pour la récupération depuis la BDD (type hibernate). */ @Deprecated public static PhoneNumber buildNoCleaning(String value) { return new PhoneNumber(value); } private PhoneNumber(String value) { super(value); } public boolean isLocalFrench() { return LOCAL_FRENCH_NUMBER_PATTERN.matcher(getValue()).find(); } }