package com.nexr.platform.search.generator.transaction;
import com.nexr.platform.search.entity.sdp.BaseClass;
import org.apache.log4j.Logger;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* Created by IntelliJ IDEA.
* User: hcnah
* Date: 11. 8. 9.
* Time: 오후 4:29
* To change this template use File | Settings | File Templates.
*/
public class Transaction {
private Logger logger = Logger.getLogger(Transaction.class);
private static final int START_SEQ_NUM = 1;
private static final int END_SEQ_NUM = 9999;
private int userId;
private int screenId;
private String transId;
private String objectName;
private String methodName;
private long startTime;
private long endTime;
private String payload;
private List<TransactionSequence> sequenceList;
private static final Random random = new Random(System.currentTimeMillis());
public Transaction(int userId, int screenId, String txID, String oName, String mName, long startTime, long maxTransTime, int seqCount, boolean isDebug) {
this.userId = userId;
this.screenId = screenId;
this.transId = txID;
this.objectName = oName;
this.methodName = mName;
this.startTime = startTime;
this.payload = BaseClass.generateCData(mName, oName, txID);
generateSequence(maxTransTime, seqCount, isDebug);
}
public int getUserId() {
return userId;
}
public int getScreenId() {
return screenId;
}
public String getTransId() {
return transId;
}
public String getObjectName() {
return objectName;
}
public String getMethodName() {
return methodName;
}
public String getPayload() {
return payload;
}
public List<TransactionSequence> getSequenceList() {
return sequenceList;
}
private void generateSequence(long maxTransTime, int seqCount, boolean isDebug) {
long[] intervals = generateRandomIntervals(maxTransTime, seqCount);
String[] numbers = generateSeqNumber(seqCount);
sequenceList = new ArrayList<TransactionSequence>(seqCount);
for (int i=0; i<seqCount; i++) {
TransactionSequence transSequence = new TransactionSequence(this, numbers[i], startTime+intervals[i]);
sequenceList.add(transSequence);
}
if (isDebug) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
logger.debug(dateFormat.format(new Date(startTime)) + " - " + Arrays.toString(intervals));
}
}
private String[] generateSeqNumber(int count) {
String[] numbers = new String[count];
for (int i=0; i<count-1; i++) {
numbers[i] = String.valueOf(i+START_SEQ_NUM);
}
numbers[count-1] = String.valueOf(END_SEQ_NUM);
return numbers;
}
public long[] generateRandomIntervals(long maxTotalInterval, int count) {
long[] intervals = new long[count];
long min = maxTotalInterval - 100 < 0 ? maxTotalInterval : 100;
long totalInterval = Math.abs(random.nextLong()%(maxTotalInterval-min)+min);
intervals[0] = 0;
for (int i=1; i<count; i++) {
intervals[i] = intervals[i-1]+totalInterval/count;
}
return intervals;
}
public boolean isRemovable() {
boolean isRemovable = true;
for (TransactionSequence eachSequence : sequenceList) {
if (!eachSequence.getUsed()) {
isRemovable = false;
break;
}
}
return isRemovable;
}
}