com.acmetech.cc
Class MagStripeCard

java.lang.Object
  extended bycom.acmetech.cc.MagStripeCard

public class MagStripeCard
extends java.lang.Object

Parse magstripe Track 1 & Track 2 data.

Object for parsing magstripe track 1 and track 2 data strings.

Example Track 1 & 2 card data string

%B1234123412341234^CardUser/John^030510100000019301000000877000000?;1234123412341234=0305101193010877?
This class should be able to recognize and standardize any of the following input data strings:
  1. Track 1 & Track 2 strings combined (w/sentinels)
  2. Track 1 string only w/out sentinels
  3. Track 2 data only w/out sentinels


You can set a number of properties for controlling the classes behavior.

Author:
Wayne K. Walrath, Acme Technologies

Version History
0.1 - 2005-03-23 - First release


Copyright 2005 © Acme Technologies. All rights reserved. Permission granted to incorporate these classes into non-commercial (shareware applications ARE allowed) derivative works. You may not post these classes on the internet or otherwise distribute them EXCEPT as part of a derivative work which includes the Acme Technologies copyright and the address of our website (www.acmetech.com).

For an easy flat-fee redistribution license for commercial use, please contact Acme Technologies through one of the means listed at www.acmetech.com.

Field Summary
(package private)  java.lang.String _AccountHolder
          Raw account name (something like "Creditmeister/Steven P")
static boolean _AutoGenerateTrack2
          If set to true (default) track2 data is automatically generated if it was not supplied.
protected static boolean _Debug
          if set to true, parsing and debugging info written to System.out
(package private)  java.lang.String _ExpMonthStr
          Expiration month (two digit)
(package private)  java.lang.String _ExpYearStr
          Expiration year (four digit)
(package private)  boolean _HasTrack1
          true if track 1 data present
(package private)  boolean _HasTrack2
          true if track 2 data present (note: track 2 is autmatically generated if _AutoGenerateTrack2 is set to true -- default's to true)
(package private)  java.lang.String _InputStripeStr
          raw input string containing track 1, track 2 or track 1 & 2 data.
(package private)  java.lang.String _NameFirst
          Account holder first name (plus possibly middle initial, title, etc)
(package private)  java.lang.String _NameLast
          Account holder surname
(package private)  boolean _NeedsParsing
          set to true after input magnetic stripe string has been parsed.
(package private)  java.lang.String _PAN
          Primary Account Number
(package private)  java.lang.String _Track1Data
          track 1 data string (parsed from input) including sentinel characters.
(package private)  java.lang.String _Track2Data
          track 2 data string (parsed from input) including sentinel characters.
(package private)  boolean _Track2WasAutoGenerated
          True if Track 2 magnetic stripe data was auto-generated from the Track 1 data.
 
Constructor Summary
MagStripeCard(java.lang.String trackString)
          Create a MagStripeCard using magnetic stripe data string (tracks 1, 2 or both)
 
Method Summary
protected  void _parse()
          parse the magstripe string.
 java.lang.String getAccountName()
          Get the raw account holder name (ex.: "Spears/Brintney S").
 java.lang.String getAccountNumber()
          Get primary account number (PAN field from Track 1 or Track 2 data)
 java.lang.String getExpirationMonth()
          Get expiration month from track 1 or track 2 data.
 java.lang.String getExpirationYear()
          Get expiration year from track 1 or track 2 data.
 java.lang.String getFirstName()
          Get account holder first name
 java.lang.String getLastName()
          Get account holder last name
 java.lang.String getTrack1()
          Get Track 1 magstripe string.
 java.lang.String getTrack2()
          Get Track 2 magstripe string.
 boolean getTrack2WasAutoGenerated()
          Determine whether the Track 2 data string was auto-generated during parsing.
 java.lang.String getTrackData()
          Get the combined Track 1 & 2 data string if both are available.
 boolean hasTrack1()
          Determine if track 1 data is present.
 boolean hasTrack2()
          Determine if track 2 data is present.
static void main(java.lang.String[] args)
          Static test method called with a single parameter (the track 1, 2 or combined mag data string) Call with no parameters for sample usage string.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

_InputStripeStr

java.lang.String _InputStripeStr
raw input string containing track 1, track 2 or track 1 & 2 data.


_Track1Data

java.lang.String _Track1Data
track 1 data string (parsed from input) including sentinel characters.


_Track2Data

java.lang.String _Track2Data
track 2 data string (parsed from input) including sentinel characters.

See Also:
_AutoGenerateTrack2

_Debug

protected static boolean _Debug
if set to true, parsing and debugging info written to System.out


_NeedsParsing

boolean _NeedsParsing
set to true after input magnetic stripe string has been parsed.


_HasTrack1

boolean _HasTrack1
true if track 1 data present


_HasTrack2

boolean _HasTrack2
true if track 2 data present (note: track 2 is autmatically generated if _AutoGenerateTrack2 is set to true -- default's to true)


_AutoGenerateTrack2

public static boolean _AutoGenerateTrack2
If set to true (default) track2 data is automatically generated if it was not supplied.


_Track2WasAutoGenerated

boolean _Track2WasAutoGenerated
True if Track 2 magnetic stripe data was auto-generated from the Track 1 data.


_AccountHolder

java.lang.String _AccountHolder
Raw account name (something like "Creditmeister/Steven P")


_NameFirst

java.lang.String _NameFirst
Account holder first name (plus possibly middle initial, title, etc)


_NameLast

java.lang.String _NameLast
Account holder surname


_PAN

java.lang.String _PAN
Primary Account Number


_ExpMonthStr

java.lang.String _ExpMonthStr
Expiration month (two digit)


_ExpYearStr

java.lang.String _ExpYearStr
Expiration year (four digit)

Constructor Detail

MagStripeCard

public MagStripeCard(java.lang.String trackString)
              throws MagstripeParseException
Create a MagStripeCard using magnetic stripe data string (tracks 1, 2 or both)

Parameters:
trackString - track 1,2, or both data strings.
Throws:
MagstripeParseException
Method Detail

hasTrack1

public boolean hasTrack1()
Determine if track 1 data is present.

Returns:
boolean indicating whether track 1 data is present

hasTrack2

public boolean hasTrack2()
Determine if track 2 data is present.

Returns:
boolean indicating whether track 2 data is present

getTrack1

public java.lang.String getTrack1()
Get Track 1 magstripe string.

Returns:
the Track 1 magnetic stripe data string or null if no Track 1 data exists.
Throws:
MagstripeParseException
See Also:
getTrack2()

getTrack2

public java.lang.String getTrack2()
Get Track 2 magstripe string.

Returns:
the Track 2 magnetic stripe data string or null if no Track 1 data exists
See Also:
getTrack1()

getTrackData

public java.lang.String getTrackData()
Get the combined Track 1 & 2 data string if both are available.

Returns:
the magnetic track data string if both are available (possibly Track 2 was auto-generated), or null if both are not available.
See Also:
getTrack1(), getTrack2()

getTrack2WasAutoGenerated

public boolean getTrack2WasAutoGenerated()
Determine whether the Track 2 data string was auto-generated during parsing.

Returns:
true if the Track 2 data was auto-generated.

getAccountName

public java.lang.String getAccountName()
Get the raw account holder name (ex.: "Spears/Brintney S").

Returns:
The raw account holder name as parsed from Track 1 data or null if no Track 1 data.

getFirstName

public java.lang.String getFirstName()
Get account holder first name

Returns:
account holder first name or null if no Track 1 data.

getLastName

public java.lang.String getLastName()
Get account holder last name

Returns:
account holder last name or null if no Track 1 data.

getAccountNumber

public java.lang.String getAccountNumber()
Get primary account number (PAN field from Track 1 or Track 2 data)

Returns:
PAN or null if account not found.

getExpirationMonth

public java.lang.String getExpirationMonth()
Get expiration month from track 1 or track 2 data.

Returns:
two-digit expiration month string.

getExpirationYear

public java.lang.String getExpirationYear()
Get expiration year from track 1 or track 2 data.

Returns:
four-digit expiration year string.

_parse

protected void _parse()
               throws MagstripeParseException
parse the magstripe string. Called automatically as needed.

Throws:
MagstripeParseException

main

public static void main(java.lang.String[] args)
Static test method called with a single parameter (the track 1, 2 or combined mag data string) Call with no parameters for sample usage string.

Parameters:
args - a string containing magnetic track 1, 2 or combined data.
Returns:
nothing. writes to stdout.

Sample cmd line and output:

java -classpath . -Dcom.acmetech.cc.magstripe.debug=true \ 
        -Dcom.acmetech.cc.magstripe.autoGenerateTrack2=false 	\
        com.acmetech.cc.MagStripeCard 	\
        '%B1234123412341234^CardUser/John^030510100000019301000000877000000?;1234123412341234=0305101193010877?'

==> ==== Parsing Input String ====
==> Track 1=%B1234123412341234^CardUser/John^030510100000019301000000877000000?
==> Track 2=;1234123412341234=0305101193010877?
==> Track 1 Account: 1234123412341234
==> Track 1 Acct Name: CardUser/John
==> First Name: CardUser
==> Last Name: John
==> Track 1 Acct Exp Date: 0305
==> Exp Year: 2003
==> Exp Month: 05
==> 
==> ===== Testing Public Methods =====
==> Has Track 1?	true
==> Has Track 2?	true
==> Track 1 String=%B1234123412341234^CardUser/John^030510100000019301000000877000000?
==> Track 2 String=;1234123412341234=0305101193010877?
==> Track 2 AUTO-GENERATED: false
==> Combined Tracks=%B1234123412341234^CardUser/John^030510100000019301000000877000000?;1234123412341234=0305101193010877?
==> Account Name (RAW): CardUser/John
==> First Name: CardUser
==> Last Name: John
==> Primary Account Num (PAN): 1234123412341234
==> Expiration Month: 05
==> Expiration Year: 2003
==> -- DONE --