package com.nexr.platform.search.generator;
import com.nexr.platform.search.entity.sdp.BodyEntity;
import com.nexr.platform.search.entity.sdp.DataHeaderEntity;
import com.nexr.platform.search.entity.sdp.SDPLogEntity;
import com.nexr.platform.search.entity.sdp.SystemHeaderEntity;
import com.nexr.platform.search.generator.transaction.Transaction;
import com.nexr.platform.search.generator.transaction.TransactionSequence;
import com.nexr.platform.search.utils.XmlUtils;
import com.nexr.platform.search.utils.FileUtils;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.lang.*;import java.lang.Integer;import java.lang.Long;import java.lang.Math;import java.lang.String;import java.lang.System;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;import java.util.ArrayList;import java.util.Arrays;import java.util.Date;import java.util.List;import java.util.Random;
import org.apache.log4j.Logger;
public class SdpXmlGenerator2 {
private Random rnd;
private final int idMaxCount;
private final int seqMaxCount;
private final long maxTransTime;
private final long maxTransInterval;
private final long startTime;
private String prefixTxLog;
private final int startSeqNum = 1;
private final int endSeqNum = 9999;
private Logger logger = Logger.getLogger(SdpXmlGenerator2.class);
private static final boolean IS_DEBUG = true;
public SdpXmlGenerator2(int idMaxCount, int seqMaxCount, long startTime, long maxTransTime, long maxTransInterval) {
this.idMaxCount = idMaxCount;
this.seqMaxCount = seqMaxCount;
this.startTime = startTime;
this.prefixTxLog = FieldData.serverIPs[0].replaceAll("\\.", "\\-");
this.maxTransTime = maxTransTime;
this.maxTransInterval = maxTransInterval;
}
public void generate(String saveFilePath, int transactionCount, String moduleType, String serverName, String serverIP, String logType) throws ParserConfigurationException, IOException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
prefixTxLog = prefixTxLog + "-" + dateFormat.format(new Date(System.currentTimeMillis())) + "-";
long lastWriteTime = startTime;
long currentStartTime = startTime;
List<Transaction> transList = new ArrayList<Transaction>();
Random rnd = new Random(System.currentTimeMillis());
TransactionWriter transWriter;
transWriter = new TransactionWriter(moduleType, serverName, serverIP, logType, saveFilePath);
transWriter.open();
for (int transNum=0; transNum<transactionCount; transNum++) {
String TXID = prefixTxLog + String.format("%09d", transNum);
String objectName = FieldData.objectNames[transNum % FieldData.objectNames.length];
String methodName = FieldData.methodNames[transNum % FieldData.methodNames.length];
Transaction transaction = new Transaction(Math.abs(rnd.nextInt()%idMaxCount), Math.abs(rnd.nextInt()%3), TXID, objectName, methodName,
currentStartTime, maxTransTime, this.seqMaxCount, IS_DEBUG);
transList.add(transaction);
currentStartTime += Math.abs(rnd.nextLong() % maxTransInterval);
if (currentStartTime - lastWriteTime > 1000*60) {
transWriter.write(transList, currentStartTime);
lastWriteTime = currentStartTime;
}
}
transWriter.write(transList, Long.MAX_VALUE);
transWriter.close();
}
public static void main(String[] args) throws IOException, ParserConfigurationException, ParseException {
int userCount, seqMaxCount, transactionCount;
String dateString;
String saveFilePath;
String moduleType;
String serverName;
String serverIP;
String logType;
long logStartTime;
long maxTransTime;
long maxTransInterval;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Logger logger = Logger.getLogger(SdpXmlGenerator2.class);
if(args.length > 0) {
userCount = java.lang.Integer.parseInt(args[0]);
seqMaxCount = Integer.parseInt(args[1]);
transactionCount = Integer.parseInt(args[2]);
dateString = args[3];
maxTransTime = Long.parseLong(args[4]);
maxTransInterval = Long.parseLong(args[5]);
moduleType = args[6];
serverName = args[7];
serverIP = args[8];
logType = args[9];
saveFilePath = args[10];
} else {
userCount = 100;
seqMaxCount = 8;
// transaction 당 10k 생성
// 20000 transaction 으로 시험시 14 시간 가량 데이터 생성
// 14*60*60*1000 = 50400000
transactionCount = 3;
dateString = "2011-08-01";
maxTransTime = 60000;
// 시험상으로 transactionCount*maxTransInterval/2 정도의 기간으로 transaction 이 생성
maxTransInterval = 5000;
moduleType = FieldData.moduleTypes[0];
serverName = FieldData.serverNames[0];
serverIP = FieldData.serverIPs[0];
logType = FieldData.logTypes[0];
saveFilePath = "/data/SDP/generateParseData.log";
}
dateString = dateString.trim() + " 00:00:00.000";
logStartTime = dateFormat.parse(dateString).getTime();
long startTime = System.currentTimeMillis();
logger.info("**********************************************************");
logger.info("Log Generator START");
logger.info("**********************************************************");
logger.info("Configurations:");
logger.info("- USER COUNT : " + userCount);
logger.info("- SEQ/TRANSACTION : " + seqMaxCount);
logger.info("- TRANSACTION COUNT : " + transactionCount);
logger.info("- START TIME : " + dateString);
logger.info("- MAX TRANSACTION TIME : " + maxTransTime);
logger.info("- TRANSACTION INTERVAL : " + maxTransInterval);
logger.info("- SAVE FILE PATH : " + saveFilePath);
logger.info("");
logger.info("* Start generating log...");
SdpXmlGenerator2 sdpXmlGenerator = new SdpXmlGenerator2(userCount, seqMaxCount, logStartTime, maxTransTime, maxTransInterval);
sdpXmlGenerator.generate(saveFilePath, transactionCount, moduleType, serverName, serverIP, logType);
long endTime = System.currentTimeMillis();
logger.info("..finished.");
logger.info("");
logger.info("TOTAL SPEND TIME :::::: " + (endTime - startTime));
}
public static class TransactionWriter {
private FileUtils fileUtil;
private XmlUtils xmlUtils;
private String moduleType;
private String serverName;
private String serverIP;
private String logType;
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
public TransactionWriter(String moduleType, String serverName, String serverIP, String logType, String logPath) throws IOException, ParserConfigurationException {
this.moduleType = moduleType;
this.serverName = serverName;
this.serverIP = serverIP;
this.logType = logType;
fileUtil = new FileUtils(logPath);
xmlUtils = new XmlUtils();
}
public void open() throws IOException {
fileUtil.createNewFile();
fileUtil.setWritable(true);
}
public void close() throws IOException {
fileUtil.close();
xmlUtils.close();
}
public void write(List<Transaction> transList, long time) throws IOException {
List<TransactionSequence> sequenceList = getWritableSequence(transList, time);
SDPLogEntity entity = new SDPLogEntity(xmlUtils.getDocument());
TransactionSequence[] sequenceArray = sequenceList.toArray(new TransactionSequence[sequenceList.size()]);
Arrays.sort(sequenceArray);
for (TransactionSequence eachSequence : sequenceArray) {
Transaction seqTransaction = eachSequence.getTransaction();
makeSystemHeaderData(entity.getSystemHeaderEntity(), eachSequence);
makeDataHeaderData(entity.getDataHeaderEntity(), eachSequence);
makeBodyData(entity.getBodyEntity(), eachSequence);
fileUtil.writeLine(entity.toString());
}
}
private List<TransactionSequence> getWritableSequence(List<Transaction> transList, long time) {
List<TransactionSequence> writable = new ArrayList<TransactionSequence>();
List<Transaction> removeTransList = new ArrayList<Transaction>();
for (Transaction eachTrans : transList) {
List<TransactionSequence> sequenceList = eachTrans.getSequenceList();
for (TransactionSequence eachSequence : sequenceList) {
if (eachSequence.getTimestamp() < time && eachSequence.getUsed() == false) {
writable.add(eachSequence);
eachSequence.setUsed(true);
}
}
if (eachTrans.isRemovable()) {
removeTransList.add(eachTrans);
}
}
for (Transaction eachTrans : removeTransList) {
transList.remove(eachTrans);
}
return writable;
}
private void makeSystemHeaderData(SystemHeaderEntity entity, TransactionSequence sequence) {
entity.setCID(FieldData.CID);
entity.setSysId(FieldData.SYSID);
entity.setLT(FieldData.LT);
entity.setUID(FieldData.prefixUserId + String.format("%04d", sequence.getTransaction().getUserId()));
entity.setScId(FieldData.prefixScreenId + String.format("%04d", sequence.getTransaction().getScreenId()));
}
//private void makeDataHeaderData(DataHeaderEntity entity, int totalCount, String TXID, String strTimeStamp, String objectName, String methodName, int payLoadSize) {
private void makeDataHeaderData(DataHeaderEntity entity, TransactionSequence sequence) {
Transaction seqTransaction = sequence.getTransaction();
entity.setTxId(seqTransaction.getTransId());
entity.setSeq(sequence.getSeqNumber());
entity.setTS(dateFormat.format(sequence.getTimestamp()));
// temporary, use index 0
entity.setMT(this.moduleType);
entity.setSN(this.serverName);
entity.setSIP(this.serverIP);
entity.setON(seqTransaction.getObjectName());
entity.setMN(seqTransaction.getMethodName());
entity.setPLS(String.valueOf(seqTransaction.getPayload().length()));
}
private void makeBodyData(BodyEntity entity, TransactionSequence sequence) {
entity.setLTP(this.logType);
if(logType.toUpperCase().equals("IN_RES") || logType.toUpperCase().equals("OUT_RES")) {
String codeVal = String.valueOf(sequence.getTransaction().getScreenId() % 2);
entity.setRC(codeVal);
if(codeVal.equals("0")) entity.setEC(codeVal);
else entity.setEC(" ");
}
entity.setRD(" ");
entity.setED(" ");
entity.setPL(sequence.getTransaction().getPayload());
}
}
private static class FieldData {
private static final String CID = "KT";
private static final String SYSID = "SDP";
private static final String LT = "Transaction";
private static final String prefixUserId = "USER";
private static final String prefixScreenId = "SCREEN";
private static final String[] objectNames = {
"RetrievePartyProfile",
"IdAndPasswordAuthentication",
"CheckOllehIDExistForQookInternet",
"RetrieveCredentialsByUsername",
"RetrieveServiceDomains",
"RetrieveProductList",
"RetrievePartyReal1NameCheck",
"RetrieveQookAndShowInfo",
"UnregisterProduct",
"RegisterProduct"
};
private static final String[] methodNames = {
"handleRequest",
"executeRetrieveServiceDomains",
"executeCheckOllehMembership",
"executeRetrieveCredentials"
};
private static final String[] serverNames = {
"david Server"
};
private static final String[] moduleTypes = {
"WAMUI",
"CSMUI",
"OCSG",
"SO",
"CSM"
};
private static final String[] serverIPs = {
"127.0.0.1"
};
private static final String[] logTypes = {
"IN_REQ",
"OUT_REQ",
"IN_RES",
"OUT_RES"
};
}
}