com.github.devnied.emvnfccard.utils.TrackUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.github.devnied.emvnfccard.utils.TrackUtils.java

Source

/*
 * 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.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.github.devnied.emvnfccard.iso7816emv.EmvTags;
import com.github.devnied.emvnfccard.model.EmvCard;
import com.github.devnied.emvnfccard.model.Service;

import fr.devnied.bitlib.BytesUtils;

/**
 * Extract track data
 * 
 * @author MILLAU Julien
 * 
 */
public final class TrackUtils {

    /**
     * Class logger
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(TrackUtils.class);

    /**
     * Track 2 pattern
     */
    private static final Pattern TRACK2_PATTERN = Pattern.compile("([0-9]{1,19})D([0-9]{4})([0-9]{3})?(.*)");

    /**
     * Extract track 2 data
     * 
     * @param pEmvCard
     *            Object card representation
     * @param pData
     *            data to parse
     * @return true if the extraction succeed false otherwise
     */
    public static boolean extractTrack2Data(final EmvCard pEmvCard, final byte[] pData) {
        boolean ret = false;
        byte[] track2 = TlvUtil.getValue(pData, EmvTags.TRACK_2_EQV_DATA, EmvTags.TRACK2_DATA);

        if (track2 != null) {
            String data = BytesUtils.bytesToStringNoSpace(track2);
            Matcher m = TRACK2_PATTERN.matcher(data);
            // Check pattern
            if (m.find()) {
                // read card number
                pEmvCard.setCardNumber(m.group(1));
                // Read expire date
                SimpleDateFormat sdf = new SimpleDateFormat("yyMM", Locale.getDefault());
                try {
                    pEmvCard.setExpireDate(DateUtils.truncate(sdf.parse(m.group(2)), Calendar.MONTH));
                } catch (ParseException e) {
                    LOGGER.error("Unparsable expire card date : {}", e.getMessage());
                    return ret;
                }
                // Read service
                pEmvCard.setService(new Service(m.group(3)));
                ret = true;
            }
        }
        return ret;
    }

    /**
     * Private constructor
     */
    private TrackUtils() {
    }

}