// ============================================================================ // // Copyright (C) 2006-2016 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.dataquality.datamasking.functions; import java.util.ArrayList; import java.util.List; /** * * @author jteuladedenantes * * French patter: a-bb-cc-dd-eee-fff a: 1 -> 2 bb: 1 -> 99 cc: 1 -> 12 dd: 1 -> 19 ; (2A, 2B) ; 20 -> 99 eee: 1 -> 990 * fff: 1 -> 999 */ public class GenerateUniqueSsnFr extends AbstractGenerateUniqueSsn { private static final long serialVersionUID = 4514471121590047091L; private static final int MOD97 = 97; // $NON-NLS-1$ @Override protected StringBuilder doValidGenerateMaskedField(String str) { // read the input str List<String> strs = new ArrayList<String>(); strs.add(str.substring(0, 1)); strs.add(str.substring(1, 3)); strs.add(str.substring(3, 5)); strs.add(str.substring(5, 7)); strs.add(str.substring(7, 10)); strs.add(str.substring(10, 13)); StringBuilder result = ssnPattern.generateUniqueString(strs); if (result == null) { return null; } // add the security key specified for french SSN String key = computeFrenchKey(result.toString()); result.append(key); return result; } private String computeFrenchKey(String string) { StringBuilder keyResult = new StringBuilder(string); if (keyResult.charAt(5) == '2') { keyResult.setCharAt(5, '1'); keyResult.setCharAt(6, (keyResult.charAt(6) == 'A') ? '9' : '8'); } int controlKey = 97 - (int) (Long.valueOf(keyResult.toString()) % MOD97); StringBuilder res = new StringBuilder(); if (controlKey < 10) res.append("0"); return res.append(controlKey).toString(); } /** * * @return the list of each field */ @Override protected List<AbstractField> createFieldsListFromPattern() { List<AbstractField> fields = new ArrayList<AbstractField>(); fields.add(new FieldInterval(1, 2)); fields.add(new FieldInterval(0, 99)); fields.add(new FieldInterval(1, 12)); List<String> departments = new ArrayList<String>(); for (int department = 1; department <= 99; department++) { if (department < 10) departments.add("0" + department); else if (department == 20) { departments.add("2A"); departments.add("2B"); } else departments.add(String.valueOf(department)); } fields.add(new FieldEnum(departments, 2)); fields.add(new FieldInterval(1, 990)); fields.add(new FieldInterval(1, 999)); checkSumSize = 2; return fields; } }