package com.constellio.model.utils;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.text.MaskFormatter;
import org.apache.commons.lang3.StringUtils;
import com.constellio.model.utils.MaskUtilsException.MaskUtilsException_InvalidValue;
public class MaskUtils {
// public static String format(String mask, String rawValue)
// throws MaskUtilsException {
//
// if (rawValue == null || mask == null || isValid(mask, rawValue)) {
// return rawValue;
// }
//
// try {
//
// MaskFormatter maskFormatter = newMaskFormatter(mask);
// maskFormatter.setValueContainsLiteralCharacters(false);
// String formattedValue = maskFormatter.valueToString(rawValue);
//
// if (!isValid(mask, formattedValue)) {
// throw new MaskUtilsException_InvalidValue(mask, rawValue);
// }
//
// return formattedValue;
//
// } catch (ParseException e) {
// throw new MaskUtilsException_InvalidValue(mask, rawValue, e);
// }
//
// }
public static final String REGEX_STRICT_MASK_ITEMS = "[^A9]";
private static Map<String, Pattern> maskRegexPatterns = new HashMap<>();
private static Map<String, Pattern> maskStrictRegexPatterns = new HashMap<>();
public static boolean isValid(String mask, String value) {
try {
validate(mask, value);
return true;
} catch (MaskUtilsException e) {
return false;
}
}
private static Pattern buildRegex(String mask) {
Pattern maskRegexPattern = maskRegexPatterns.get(mask);
if (maskRegexPattern == null) {
String regex = mask.replace("\\9", "__ZE_NEUF__").replace("\\A", "__ZE_FIRST_LETTER__")
.replace("\\*", "__ZE_FLOCON__")
.replace("9", "\\d").replace("A", "[A-Za-z]").replace("*", "[A-Za-z0-9]").replace("(", "\\(")
.replace(")", "\\)")
.replace("__ZE_NEUF__", "9").replace("__ZE_FIRST_LETTER__", "A").replace("__ZE_FLOCON__", "\\*");
maskRegexPattern = Pattern.compile(regex);
maskRegexPatterns.put(mask, maskRegexPattern);
}
return maskRegexPattern;
}
private static Pattern strictBuildRegex(String mask) {
Pattern maskRegexPattern = maskStrictRegexPatterns.get(mask);
if (maskRegexPattern == null) {
String regex = mask.replace("9", "\\d").replace("A", "[A-Za-z]")
.replace("__ZE_NEUF__", "9")
.replace("__ZE_FIRST_LETTER__", "A");
maskRegexPattern = Pattern.compile(regex);
maskStrictRegexPatterns.put(mask, maskRegexPattern);
}
return maskRegexPattern;
}
public static void validate(String mask, String formattedValue)
throws MaskUtilsException {
if (StringUtils.isBlank(mask)) {
return;
}
Pattern pattern = buildRegex(mask);
Matcher matcher = pattern.matcher(formattedValue);
boolean valid = matcher.matches();
if (!valid) {
throw new MaskUtilsException_InvalidValue(mask, formattedValue);
}
//
// if (formattedValue == null) {
// return;
// }
//
// MaskFormatter maskFormatter = newMaskFormatter(mask);
// maskFormatter.setValueContainsLiteralCharacters(false);
// maskFormatter.setAllowsInvalid(false);
// try {
// Object rawValue = maskFormatter.stringToValue(formattedValue);
// String newFormattedValue = maskFormatter.valueToString(rawValue);
// if (!formattedValue.equals(newFormattedValue)) {
// throw new MaskUtilsException_InvalidValue(mask, formattedValue);
// }
// } catch (ParseException e) {
// throw new MaskUtilsException_InvalidValue(mask, formattedValue, e);
// }
}
private static MaskFormatter newMaskFormatter(String mask)
throws MaskUtilsException {
try {
return new MaskFormatter(mask);
} catch (ParseException e) {
throw new MaskUtilsException.MaskUtilsException_InvalidMask(mask);
}
}
static Pattern onlyNumbers = Pattern.compile("[9-9]+");
public static String format(String inputMask, String value) {
if (inputMask == null) {
return value;
} else {
if (value == null) {
return null;
} else {
if (onlyNumbers.matcher(inputMask).matches()) {
String concat = "000000000000000" + value;
return concat.substring(concat.length() - inputMask.length());
} else {
return value;
}
}
}
}
public static boolean strictValidate(String inputMask, String rawValue) {
Pattern pattern = strictBuildRegex(inputMask.replaceAll(REGEX_STRICT_MASK_ITEMS, ""));
Matcher matcher = pattern.matcher(rawValue);
return matcher.matches();
}
public static String strictFormat(String inputMask, String rawValues) throws MaskUtilsException {
String formattedString;
if (strictValidate(inputMask, rawValues)) {
formattedString = formatValueWithMask(inputMask, rawValues);
} else {
throw new MaskUtilsException.MaskUtilsException_InvalidValue(inputMask, rawValues);
}
return formattedString;
}
private static String formatValueWithMask(String inputMask, String rawValue) {
int offSetInFinalFormated = 0;
StringBuilder finalFormattedItem = new StringBuilder(rawValue);
char[] maskAsChar = inputMask.toCharArray();
String maskItemAsString;
for (char maskItem : maskAsChar) {
maskItemAsString = String.valueOf(maskItem);
if((maskItemAsString).matches(REGEX_STRICT_MASK_ITEMS))
{
finalFormattedItem.insert(offSetInFinalFormated, maskItemAsString);
}
offSetInFinalFormated++;
}
return finalFormattedItem.toString();
}
}