blob: f3824cba35edfcb56f511cce5172d89bccb8f60c [file] [log] [blame]
/*
* Copyright (c) 2013 DataTorrent, Inc. ALL Rights Reserved.
*
* 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.datatorrent.demos.frauddetect;
import com.datatorrent.api.*;
import com.datatorrent.demos.frauddetect.util.JsonUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.*;
/**
* Information tuple generator with randomness.
*
* @since 0.9.0
*/
public class MerchantTransactionGenerator extends BaseOperator implements InputOperator
{
private final Random randomNum = new Random();
public static final int zipCodes[] = {94086, 94087, 94088, 94089, 94090, 94091, 94092, 94093};
public static final String merchantIds[] = {"Wal-Mart", "Target", "Amazon", "Apple", "Sears", "Macys", "JCPenny", "Levis"};
// public static final String bankIdNums[] = { "1111 1111 1111", "2222 2222 2222", "3333 3333 3333", "4444 4444 4444", "5555 5555 5555", "6666 6666 6666", "7777 7777 7777", "8888 8888 8888"};
// public static final String ccNums[] = { "0001", "0002", "0003", "0004", "0005", "0006", "0007", "0008"};
// public static final String bankIdNums[] = { "1111 1111 1111", "2222 2222 2222", "3333 3333 3333", "4444 4444 4444"};
// public static final String ccNums[] = { "0001", "0002", "0003", "0004"};
// public static final int zipCodes[] = { 94086, 94087, 94088, 94089, 94090};
// public static final String merchantIds[] = { "Wal-Mart", "Target", "Amazon", "Apple"};
// private int bankIdNumMin = 0;
// private int bankIdNumMax = bankIdNums.length - 1;
// private int ccMin = 0;
// private int ccMax = ccNums.length - 1;
private int amountMin = 1;
private int amountMax = 400;
private int merchantIdMin = 0;
private int merchantIdMax = merchantIds.length - 1;
private int terminalIdMin = 1;
private int terminalIdMax = 8;
private int zipMin = 0;
private int zipMax = zipCodes.length - 1;
private int tupleBlastSize = 2000;
private boolean stopGeneration = false;
@Override
public void setup(Context.OperatorContext context)
{
super.setup(context);
}
public transient DefaultOutputPort<MerchantTransaction> txOutputPort =
new DefaultOutputPort<MerchantTransaction>();
public transient DefaultOutputPort<String> txDataOutputPort =
new DefaultOutputPort<String>();
@Override
public void emitTuples()
{
int count = 0;
List<MerchantTransaction> txList = new ArrayList();
while (!stopGeneration && count < getTupleBlastSize()) {
String bankIdNum = genBankIdNum();
String ccNum = genCC();
int merchant = genMerchantId();
int terminal = genTerminalId();
int zip = genZip();
long amount = genAmount();
// int bankIdNum = 1;
// int ccNum = 2;
// long amount = 5000;
// int merchant = 3;
// int terminal = 4;
// int zip = 0;
MerchantTransaction tx = new MerchantTransaction();
tx.bankIdNum = bankIdNum;
tx.ccNum = ccNum;
tx.fullCcNum = tx.bankIdNum + " " + tx.ccNum;
tx.amount = amount;
tx.merchantId = merchantIds[merchant];
// its INTERNET merchant
tx.merchantType = merchant == 2 || merchant == 3
? MerchantTransaction.MerchantType.INTERNET
: MerchantTransaction.MerchantType.BRICK_AND_MORTAR;
tx.transactionType = MerchantTransaction.TransactionType.POS;
// set terminal only for a BRICK_AND_MORTAR merchant
if (merchant != 2 && merchant != 3) {
tx.terminalId = terminal;
}
tx.zipCode = zipCodes[zip];
tx.country = "USA";
tx.time = System.currentTimeMillis();
tx.userGenerated = false;
txOutputPort.emit(tx);
txList.add(tx);
count++;
}
for (MerchantTransaction txData : txList) {
try {
txDataOutputPort.emit(JsonUtils.toJson(txData));
}
catch (IOException e) {
logger.warn("Exception while converting object to JSON", e);
}
}
txList.clear();
try {
Thread.sleep(100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
public String genBankIdNum()
{
// Bank ID will be between 1000 0000 and 3500 0000 (25 BINs)
int base = randomNum.nextInt(100) + 100;
return base + "0 0000";
}
public String genCC()
{
// CC will be 1000 0000 to 1400 0000 (400,000 cards per BIN)
int base = (randomNum.nextInt(100000) + 10000000);
String baseString = Integer.toString(base);
return baseString.substring(0, 4) + " " + baseString.substring(4);
}
public int genAmount()
{
int lowRange = 50;
int range = amountMax - amountMin + randomNum.nextInt(lowRange);
return amountMin + randomNum.nextInt(range);
}
public int genMerchantId()
{
int range = merchantIdMax - merchantIdMin + 1;
return merchantIdMin + randomNum.nextInt(range);
}
public int genTerminalId()
{
int range = terminalIdMax - terminalIdMin + 1;
return terminalIdMin + randomNum.nextInt(range);
}
public int genZip()
{
int range = zipMax - zipMin + 1;
return zipMin + randomNum.nextInt(range);
}
public void setStopGeneration(boolean stopGeneration)
{
this.stopGeneration = stopGeneration;
}
/**
* @return the tupleBlastSize
*/
public int getTupleBlastSize()
{
return tupleBlastSize;
}
/**
* @param tupleBlastSize the tupleBlastSize to set
*/
public void setTupleBlastSize(int tupleBlastSize)
{
this.tupleBlastSize = tupleBlastSize;
}
private static final Logger logger = LoggerFactory.getLogger(MerchantTransactionGenerator.class);
}