Java tutorial
/* * Copyright (C) 2013 MILLAU Julien * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.devnied.emvnfccard.utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Collection; import org.apache.commons.collections4.MultiMap; import org.apache.commons.collections4.map.MultiValueMap; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.CharEncoding; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Class used to find ATR description * * @author Millau Julien * */ public final class AtrUtils { /** * Class logger */ private static final Logger LOGGER = LoggerFactory.getLogger(AtrUtils.class); /** * MultiMap containing ATR */ private static final MultiMap<String, String> MAP = new MultiValueMap<String, String>(); static { InputStream is = null; InputStreamReader isr = null; BufferedReader br = null; try { is = AtrUtils.class.getResourceAsStream("/smartcard_list.txt"); isr = new InputStreamReader(is, CharEncoding.UTF_8); br = new BufferedReader(isr); int lineNumber = 0; String line; String currentATR = null; while ((line = br.readLine()) != null) { ++lineNumber; if (line.startsWith("#") || line.trim().length() == 0) { // comment ^#/ empty line ^$/ continue; } else if (line.startsWith("\t") && currentATR != null) { MAP.put(currentATR, line.replace("\t", "").trim()); } else if (line.startsWith("3")) { // ATR hex currentATR = StringUtils.deleteWhitespace(line.toUpperCase()); } else { LOGGER.error("Encountered unexpected line in atr list: currentATR=" + currentATR + " Line(" + lineNumber + ") = " + line); } } } catch (IOException e) { throw new RuntimeException(e); } finally { IOUtils.closeQuietly(br); IOUtils.closeQuietly(isr); IOUtils.closeQuietly(is); } } /** * Method used to find description from ATR * * @param pAtr * Card ATR * @return list of description */ @SuppressWarnings("unchecked") public static final Collection<String> getDescription(final String pAtr) { Collection<String> ret = null; if (StringUtils.isNotBlank(pAtr)) { String val = StringUtils.deleteWhitespace(pAtr); for (String key : MAP.keySet()) { if (val.matches("^" + key + "$")) { ret = (Collection<String>) MAP.get(key); break; } } } return ret; } /** * Method used to find ATR description from ATS (Answer to select) * * @param pAts * EMV card ATS * @return card description */ @SuppressWarnings("unchecked") public static final Collection<String> getDescriptionFromAts(final String pAts) { Collection<String> ret = null; if (StringUtils.isNotBlank(pAts)) { String val = StringUtils.deleteWhitespace(pAts); for (String key : MAP.keySet()) { if (key.contains(val)) { // TODO Fix this ret = (Collection<String>) MAP.get(key); break; } } } return ret; } /** * Private constructor */ private AtrUtils() { } }