/* * Commons eID Project. * Copyright (C) 2008-2013 FedICT. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version * 3.0 as published by the Free Software Foundation. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, see * http://www.gnu.org/licenses/. */ package be.fedict.commons.eid.consumer.tlv; import java.io.UnsupportedEncodingException; import java.util.GregorianCalendar; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Convertor for eID date of birth field. * * @author Frank Cornelis * */ public class DateOfBirthDataConvertor implements DataConvertor<GregorianCalendar> { private static final Log LOG = LogFactory .getLog(DateOfBirthDataConvertor.class); @Override public GregorianCalendar convert(final byte[] value) throws DataConvertorException { String dateOfBirthStr; try { dateOfBirthStr = new String(value, "UTF-8").trim(); } catch (final UnsupportedEncodingException uex) { throw new DataConvertorException("UTF-8 not supported"); } LOG.debug("\"" + dateOfBirthStr + "\""); /* * First try to detect the German format as there are cases in which a * German format contains both dots and spaces. */ int spaceIdx = dateOfBirthStr.indexOf('.'); if (-1 == spaceIdx) { spaceIdx = dateOfBirthStr.indexOf(' '); } if (spaceIdx > 0) { final String dayStr = dateOfBirthStr.substring(0, spaceIdx); LOG.debug("day: \"" + dayStr + "\""); final int day = Integer.parseInt(dayStr); String monthStr = dateOfBirthStr.substring(spaceIdx + 1, dateOfBirthStr.length() - 4 - 1); if (monthStr.endsWith(".")) { monthStr = monthStr.substring(0, monthStr.length() - 1); } LOG.debug("month: \"" + monthStr + "\""); final String yearStr = dateOfBirthStr.substring(dateOfBirthStr .length() - 4); LOG.debug("year: \"" + yearStr + "\""); final int year = Integer.parseInt(yearStr); final int month = toMonth(monthStr); return new GregorianCalendar(year, month, day); } if (dateOfBirthStr.length() == 4) { /* * "case II2b2". Only a birth year is given * * there's no way of representing "missing" fields via * GregorianCalendar, so we set Jan 1st */ return new GregorianCalendar(Integer.parseInt(dateOfBirthStr), 0, 1); } throw new DataConvertorException("Unsupported Birth Date Format [" + dateOfBirthStr + "]"); } private static final String[][] MONTHS = new String[][]{ new String[]{"JAN"}, new String[]{"FEV", "FEB"}, new String[]{"MARS", "MAAR", "MÄR"}, new String[]{"AVR", "APR"}, new String[]{"MAI", "MEI"}, new String[]{"JUIN", "JUN"}, new String[]{"JUIL", "JUL"}, new String[]{"AOUT", "AUG"}, new String[]{"SEPT", "SEP"}, new String[]{"OCT", "OKT"}, new String[]{"NOV"}, new String[]{"DEC", "DEZ"}}; private int toMonth(String monthStr) throws DataConvertorException { monthStr = monthStr.trim(); for (int monthIdx = 0; monthIdx < MONTHS.length; monthIdx++) { final String[] monthNames = MONTHS[monthIdx]; for (String monthName : monthNames) { if (monthName.equals(monthStr)) { return monthIdx; } } } throw new DataConvertorException("unknown month: " + monthStr); } }