package org.mobicents.smsc.tools.stresstool;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Queue;
import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ThreadLocalRandom;
import org.apache.log4j.Logger;
import org.mobicents.smsc.cassandra.PersistenceException;
import org.mobicents.smsc.cassandra.Schema;
import org.mobicents.smsc.library.Sms;
import org.mobicents.smsc.library.SmsSet;
import org.mobicents.smsc.library.TargetAddress;
import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
/**
* host, port, keyspace
* -hlocalhost -p9042 -kRestCommSMSC
* -s<smsSetRange>
* -c<recordCount> -t<threadCountW> -T<threadCountR>
* -da<filling LIVE_SMS> / -db<deleting LIVE_SMS>
* @author sergey vetuyutnev
*
*/
public class StressTool {
// private String host = "localhost";
// private int port = 9042;
// private String keyspace = "RestCommSMSC";
// private int smsSetRange = 100000;
// private int recordCount = 10000000;
// private int threadCountW = 0;
// private int threadCountR = 3;
// private CTask task = CTask.Live_Sms_Cycle;
//
// private static final Logger logger = Logger.getLogger(StressTool.class);
// private String persistFile = "stresstool.xml";
// private static final String TAB_INDENT = "\t";
//
// private TT_DBOperationsProxy dbOperations;
//
// public static void main(final String[] args) {
//
// EventQueue.invokeLater(new Runnable() {
// public void run() {
// try {
// StressTool tool = new StressTool();
// tool.start(args);
// } catch (Exception e) {
// logger.error("General exception: " + e.toString(), e);
// e.printStackTrace();
// }
// }
// });
// }
//
// public void start(String[] args) throws Exception {
// this.parseParameters(args);
//
// logInfo("Stress tool starting ...");
// logInfo("host : " + host);
// logInfo("port : " + port);
// logInfo("keyspace : " + keyspace);
// logInfo("smsSetRange : " + smsSetRange);
// logInfo("recordCount : " + recordCount);
// logInfo("threadCountW : " + threadCountW);
// logInfo("threadCountR : " + threadCountR);
// logInfo("task : " + task);
//
// this.dbOperations = new TT_DBOperationsProxy();
// this.dbOperations.start(host, port, keyspace);
//
// ProcessTask ta = null;
// if (this.task == CTask.Live_Sms_Filling) {
// ta = new TA();
// } else if (this.task == CTask.Live_Sms_Deleting) {
// ta = new TB();
// } else if (this.task == CTask.Live_Sms_Cycle) {
// ta = new TX();
// }
// if (ta != null) {
// while (!ta.isReady()) {
// logInfo(ta.getResults());
// Thread.sleep(10000);
// }
// }
//
// this.dbOperations.stop();
// }
//
// private void logInfo(String s) {
// logger.info(s);
// System.out.print("\n");
// System.out.print(s);
// }
//
// private void parseParameters(String[] args) {
// for (String s : args) {
// if(s.length()>2){
// String s1 = s.substring(0, 2);
// String s2 = s.substring(2);
// if (s1.equals("-h")) {
// this.host = s2;
// } else if (s1.equals("-p")) {
// this.port = Integer.parseInt(s2);
// } else if (s1.equals("-k")) {
// this.keyspace = s2;
// } else if (s1.equals("-s")) {
// this.smsSetRange = Integer.parseInt(s2);
// } else if (s1.equals("-c")) {
// this.recordCount = Integer.parseInt(s2);
// } else if (s1.equals("-t")) {
// this.threadCountW = Integer.parseInt(s2);
// } else if (s1.equals("-T")) {
// this.threadCountR = Integer.parseInt(s2);
// } else if (s1.equals("-d")) {
// if (s2.equals("a")) {
// this.task = CTask.Live_Sms_Filling;
// } else if (s2.equals("b")) {
// this.task = CTask.Live_Sms_Deleting;
// }
// }
// }
// }
// }
//
// private String generateAddr() {
// Integer res = ThreadLocalRandom.current().nextInt(this.smsSetRange) + 1000000000;
// return res.toString();
// }
//
// enum CTask {
// Live_Sms_Filling,
// Live_Sms_Deleting,
// Live_Sms_Cycle,
// };
//
// class TA implements ProcessTask, Runnable {
// private ArrayList<TA> threads = new ArrayList<TA>();
//
// private int startNum;
// private int endNum;
// private int curNum;
// private boolean ready;
// private boolean isMaster = false;
//
// public TA() {
// isMaster = true;
// int num = 1000000;
// int step = recordCount / threadCountW;
// for (int i1 = 0; i1 < threadCountW; i1++) {
// TA ta = new TA(num, num + step);
// num += step;
// threads.add(ta);
// Thread t = new Thread(ta);
// t.start();
// }
// }
//
// public TA(int startNum, int endNum) {
// this.startNum = startNum;
// this.endNum = endNum;
// this.curNum = startNum;
// }
//
// @Override
// public boolean isReady() {
// if (this.isMaster) {
// for (TA el : threads) {
// if (!el.isReady())
// return false;
// }
// return true;
// } else
// return ready;
// }
//
// @Override
// public String getResults() {
// int i1 = 0;
// for (TA el : threads) {
// i1 += el.curNum - el.startNum;
// }
// int i2 = recordCount;
// return "Processed " + i1 + " out of " + i2;
// }
//
// @Override
// public void run() {
// try {
// while (true) {
// SmsSet smsSet = new SmsSet();
// Integer ii1 = this.curNum;
// String s1 = ii1.toString();
// smsSet.setDestAddr(s1);
// smsSet.setDestAddrNpi(1);
// smsSet.setDestAddrTon(1);
//
// Sms sms = new Sms();
// sms.setSmsSet(smsSet);
// sms.setMessageId(this.curNum);
// sms.setDbId(UUID.randomUUID());
// sms.setShortMessage(new byte[10]);
// try {
// dbOperations.createLiveSms(sms);
// } catch (PersistenceException e) {
// logger.error("Exception in task A: " + e.toString(), e);
// }
//
// this.curNum++;
// if (this.curNum >= this.endNum)
// break;
// }
// } finally {
// ready = true;
// }
// }
//
// @Override
// public void terminate() {
// // TODO Auto-generated method stub
//
// }
//
// }
//
// class TB implements ProcessTask, Runnable {
// private ArrayList<TB> threads = new ArrayList<TB>();
//
// private int startNum;
// private int endNum;
// private int curNum;
// private boolean ready;
// private boolean isMaster = false;
//
// public TB() {
// isMaster = true;
// int num = 1000000;
// int step = recordCount / threadCountW;
// for (int i1 = 0; i1 < threadCountW; i1++) {
// TB ta = new TB(num, num + step);
// num += step;
// threads.add(ta);
// Thread t = new Thread(ta);
// t.start();
// }
// }
//
// public TB(int startNum, int endNum) {
// this.startNum = startNum;
// this.endNum = endNum;
// this.curNum = startNum;
// }
//
// @Override
// public boolean isReady() {
// if (this.isMaster) {
// for (TB el : threads) {
// if (!el.isReady())
// return false;
// }
// return true;
// } else
// return ready;
// }
//
// @Override
// public String getResults() {
// int i1 = 0;
// for (TB el : threads) {
// i1 += el.curNum - el.startNum;
// }
// int i2 = recordCount;
// return "Processed " + i1 + " out of " + i2;
// }
//
// @Override
// public void run() {
// try {
// while (true) {
// Session sess = dbOperations.getSession();
// PreparedStatement obtainSmsSet = sess.prepare("SELECT * FROM \"LIVE_SMS\" LIMIT 100;");
//
// BoundStatement boundStatement = new BoundStatement(obtainSmsSet);
// // boundStatement.bind(ta.getTargetId());
// ResultSet res = sess.execute(boundStatement);
//
// Row row = res.one();
// UUID id = row.getUUID(Schema.COLUMN_ID);
//
// PreparedStatement deleteLiveSms = sess.prepare("delete from \"" + Schema.FAMILY_LIVE_SMS + "\" where \"" + Schema.COLUMN_ID + "\"=?;");
// boundStatement = new BoundStatement(deleteLiveSms);
// boundStatement.bind(id);
// ResultSet rs = sess.execute(boundStatement);
//
// this.curNum++;
// if (this.curNum >= this.endNum)
// break;
// }
// } finally {
// ready = true;
// }
// }
//
// @Override
// public void terminate() {
// // TODO Auto-generated method stub
//
// }
//
// }
//
// class TX implements ProcessTask, Runnable {
// private ArrayList<TX1> tx1 = new ArrayList<TX1>();
// private TX2 tx2;
// private ArrayList<TX3> tx3 = new ArrayList<TX3>();
//
// public TX() {
// if (threadCountW > 0) {
// int num = 1000000;
// int step = recordCount / threadCountW;
// for (int i1 = 0; i1 < threadCountW; i1++) {
// TX1 ta = new TX1(num, num + step);
// num += step;
// tx1.add(ta);
// Thread t = new Thread(ta);
// t.start();
// }
// }
//
// tx2 = new TX2(0, recordCount);
// Thread t = new Thread(tx2);
// t.start();
//
// for (int i1 = 0; i1 < threadCountR; i1++) {
// TX3 ta = new TX3();
// tx3.add(ta);
// t = new Thread(ta);
// t.start();
// }
// }
//
// @Override
// public boolean isReady() {
// for (TX1 el : tx1) {
// if (!el.isReady())
// return false;
// }
//
// if (!tx2.isReady())
// return false;
//
// return true;
// }
//
// @Override
// public String getResults() {
// int i1 = 0;
// for (TX1 el : tx1) {
// i1 += el.curNum - el.startNum;
// }
// int i2 = recordCount;
// String s1 = "Processed TX1 " + i1 + " out of " + i2 + ", processed TX2 " + tx2.curNum + " out of " + (tx2.endNum - tx2.startNum) + ", queue=" + queue.size();
//
// return s1;
// }
//
// @Override
// public void run() {
// }
//
// @Override
// public void terminate() {
// // TODO Auto-generated method stub
//
// }
// }
//
// class TX1 implements ProcessTask, Runnable {
// private int startNum;
// private int endNum;
// private int curNum;
// private boolean ready;
//
// public TX1(int startNum, int endNum) {
// this.startNum = startNum;
// this.endNum = endNum;
// this.curNum = startNum;
// }
//
// @Override
// public boolean isReady() {
// return ready;
// }
//
// @Override
// public String getResults() {
// return "";
// }
//
// @Override
// public void run() {
// try {
// while (true) {
// Integer ii1 = this.curNum;
// String s1 = ii1.toString();
// TargetAddress ta = new TargetAddress(1, 1, s1, 0);
//
// try {
// SmsSet smsSet = dbOperations.obtainSmsSet(ta);
// dbOperations.setNewMessageScheduled(smsSet, new Date());
//
// ArrayList<byte[]> bb = new ArrayList<byte[]>();
// byte[] bf1 = new byte[10];
// byte[] bf2 = new byte[20];
// byte[] bf3 = new byte[30];
// bf1[0] = 10;
// bf2[1] = 20;
// bf3[3] = 30;
// bb.add(bf1);
// bb.add(bf2);
// bb.add(bf3);
// for (int i1 = 0; i1 < 3; i1++) {
// Sms sms = new Sms();
// sms.setSmsSet(smsSet);
// sms.setMessageId(this.curNum);
// sms.setDbId(UUID.randomUUID());
// sms.setShortMessage(bb.get(i1));
// dbOperations.createLiveSms(sms);
// }
// } catch (PersistenceException e) {
// logger.error("Exception in task X1: " + e.toString(), e);
// }
//
// this.curNum++;
// if (this.curNum >= this.endNum)
// break;
// }
// } finally {
// ready = true;
// }
// }
//
// @Override
// public void terminate() {
// // TODO Auto-generated method stub
//
// }
// }
//
// private Queue<SmsSet> queue = new ConcurrentLinkedQueue<SmsSet>();
//
// class TX2 implements ProcessTask, Runnable {
// private int startNum;
// private int endNum;
// private int curNum;
// private boolean ready;
//
// public TX2(int startNum, int endNum) {
// this.startNum = startNum;
// this.endNum = endNum;
// this.curNum = startNum;
// }
//
// @Override
// public boolean isReady() {
// return ready;
// }
//
// @Override
// public String getResults() {
// return "";
// }
//
// @Override
// public void run() {
// try {
// while (true) {
// try {
// int cnt = 1000;
// List<SmsSet> lst = dbOperations.fetchSchedulableSmsSets(cnt, null);
// this.curNum += cnt;
// for (SmsSet smsSet : lst) {
// boolean b1 = dbOperations.checkSmsSetExists(new TargetAddress(smsSet));
//
// if (b1) {
// dbOperations.setDeliveryStart(smsSet, new Date());
// }
//
// queue.add(smsSet);
// }
// } catch (PersistenceException e) {
// logger.error("Exception in task X2: " + e.toString(), e);
// }
//
// if (this.curNum >= this.endNum)
// break;
//
// while (queue.size() > 10000) {
// Thread.sleep(100);
// }
// }
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } finally {
// ready = true;
// }
// }
//
// @Override
// public void terminate() {
// // TODO Auto-generated method stub
//
// }
//
// }
//
// class TX3 implements ProcessTask, Runnable {
//
// public TX3() {
// }
//
// @Override
// public boolean isReady() {
// return true;
// }
//
// @Override
// public String getResults() {
// return "";
// }
//
// @Override
// public void run() {
// while (true) {
// SmsSet smsSet = queue.poll();
// if (smsSet != null) {
// try {
// dbOperations.fetchSchedulableSms(smsSet, false);
// long ii = smsSet.getSmsCount();
// for (int i1 = 0; i1 < ii; i1++) {
// Sms sms = smsSet.getSms(i1);
// dbOperations.archiveDeliveredSms(sms, new Date());
// }
// dbOperations.deleteSmsSet(smsSet);
// } catch (PersistenceException e) {
// logger.error("Exception in task X1: " + e.toString(), e);
// }
// } else {
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// }
// }
//
// @Override
// public void terminate() {
// // TODO Auto-generated method stub
//
// }
//
// }
}