package com.nvarghese.beowulf.scs.categorizers;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.codec.digest.DigestUtils;
import org.bson.types.ObjectId;
import com.google.code.morphia.Datastore;
import com.nvarghese.beowulf.common.http.txn.AbstractHttpTransaction;
import com.nvarghese.beowulf.common.scan.model.WebScanDocument;
import com.nvarghese.beowulf.common.webtest.JobStatus;
import com.nvarghese.beowulf.common.webtest.WebTestType;
import com.nvarghese.beowulf.common.webtest.sfe.jobs.TestJob;
import com.nvarghese.beowulf.common.webtest.sfe.jobs.TestJobDAO;
import com.nvarghese.beowulf.common.webtest.sfe.jobs.TestJobDocument;
import com.nvarghese.beowulf.common.webtest.sfe.jobs.TestParameterDocument;
import com.nvarghese.beowulf.scs.categorizers.dao.TokenSingleSetTransactionCategorizerDAO;
import com.nvarghese.beowulf.scs.categorizers.model.TokenSingleSetTransactionCategorizerDocument;
import com.nvarghese.beowulf.scs.services.BwExecutorService;
public abstract class TokenSingleSetTransactionCategorizer extends SingleSetCategorizer implements TransactionCategorizer {
private TokenSingleSetTransactionCategorizerDAO tokenSingleSetTransactionCategorizerDAO;
public TokenSingleSetTransactionCategorizer(Datastore ds, WebScanDocument webScanDocument, WebTestType webTestType) {
super(ds, webScanDocument, webTestType);
if (ds != null) {
tokenSingleSetTransactionCategorizerDAO = new TokenSingleSetTransactionCategorizerDAO(ds);
if (tokenSingleSetTransactionCategorizerDAO.getTokenSingleSetTransactionCategorizerDocument() == null) {
tokenSingleSetTransactionCategorizerDAO
.createTokenSingleSetTransactionCategorizerDocument(new TokenSingleSetTransactionCategorizerDocument());
}
}
}
@Override
public void analyzeTransaction(AbstractHttpTransaction transaction) {
Set<TestJob> testJobs = new HashSet<TestJob>();
for (String token : getTokens(transaction)) {
if (token == null) {
continue;
}
String tokenHash = DigestUtils.md5Hex(token);
if (!tokenSingleSetTransactionCategorizerDAO.isTokenHashPresent(tokenHash)) {
tokenSingleSetTransactionCategorizerDAO.addTokenHash(tokenHash);
for (Long moduleNumber : moduleNumbers) {
TestJob testJob = makeTestJob(transaction, moduleNumber, token);
testJobs.add(testJob);
}
}
}
// submit to queue
BwExecutorService bwExecutorService = new BwExecutorService();
bwExecutorService.submitJobs(testJobs);
}
protected abstract String[] getTokens(AbstractHttpTransaction transaction);
protected TestJob makeTestJob(AbstractHttpTransaction transaction, long moduleNumber, String token) {
TestJobDocument testJobDocument = new TestJobDocument();
testJobDocument.setJobStatus(JobStatus.INIT);
testJobDocument.setModuleNumber(moduleNumber);
testJobDocument.setTestType(testType);
testJobDocument.setTxnObjId(transaction.getObjId());
testJobDocument.setWebScanObjId(webScanDocument.getId());
//add test params
List<TestParameterDocument> params = new ArrayList<TestParameterDocument>();
TestParameterDocument parameterDocument = new TestParameterDocument();
parameterDocument.setParameterType(token.getClass().getName());
parameterDocument.setParameterValue(token);
params.add(parameterDocument);
testJobDocument.setTestParameters(params);
TestJobDAO testJobDAO = new TestJobDAO(ds);
ObjectId id = testJobDAO.createTestJobDocument(testJobDocument);
TestJob testJob = new TestJob();
testJob.setDatabaseName(ds.getDB().getName());
testJob.setTestJobObjId(id.toString());
testJob.setWebScanObjId(webScanDocument.getId().toString());
return testJob;
}
}