package org.talend.dataquality.datamasking.functions;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* Created by jteuladedenantes on 21/09/16.
*/
public abstract class AbstractGenerateUniquePhoneNumber extends Function<String> {
private static final long serialVersionUID = -3495285699226639929L;
protected GenerateUniqueRandomPatterns phoneNumberPattern;
private ReplaceNumericString replaceNumeric = new ReplaceNumericString();
public AbstractGenerateUniquePhoneNumber() {
List<AbstractField> fields = createFieldsListFromPattern();
phoneNumberPattern = new GenerateUniqueRandomPatterns(fields);
}
@Override
public void setRandom(Random rand) {
super.setRandom(rand);
replaceNumeric.parse(null, false, rand);
phoneNumberPattern.setKey(Math.abs(rand.nextInt()) % 10000 + 1000);
}
@Override
protected String doGenerateMaskedField(String str) {
if (str == null)
return null;
String strWithoutSpaces = removeFormatInString(str);
// check if the pattern is valid
if (strWithoutSpaces.isEmpty() || strWithoutSpaces.length() < phoneNumberPattern.getFieldsCharsLength()) {
if (keepInvalidPattern)
return str;
else
return replaceNumeric.doGenerateMaskedField(str);
}
StringBuilder result = doValidGenerateMaskedField(strWithoutSpaces);
if (result == null) {
if (keepInvalidPattern)
return str;
else
return replaceNumeric.doGenerateMaskedField(str);
}
if (keepFormat)
return insertFormatInString(str, result);
else
return result.toString();
}
protected List<AbstractField> createFieldsListFromPattern() {
List<AbstractField> fields = new ArrayList<AbstractField>();
long max = (long) Math.pow(10, getDigitsNumberToMask()) - 1;
fields.add(new FieldInterval(0, max));
return fields;
}
protected StringBuilder doValidGenerateMaskedField(String str) {
// read the input str
List<String> strs = new ArrayList<String>();
strs.add(str.substring(str.length() - getDigitsNumberToMask(), str.length()));
StringBuilder result = phoneNumberPattern.generateUniqueString(strs);
if (result == null) {
return null;
}
result.insert(0, str.substring(0, str.length() - getDigitsNumberToMask()));
return result;
}
/**
* Remove all the spaces in the input string
*
* @param input
* @return
*/
@Override
protected String removeFormatInString(String input) {
return nonDigits.matcher(input).replaceAll("");
}
@Override
protected String insertFormatInString(String strWithFormat, StringBuilder resWithoutFormat) {
if (strWithFormat == null || resWithoutFormat == null)
return strWithFormat;
for (int i = 0; i < strWithFormat.length(); i++)
if (!Character.isDigit(strWithFormat.charAt(i)))
resWithoutFormat.insert(i, strWithFormat.charAt(i));
return resWithoutFormat.toString();
}
protected abstract int getDigitsNumberToMask();
}