package com.nvarghese.beowulf.scs.services;
import java.net.UnknownHostException;
import org.apache.commons.configuration.ConfigurationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.code.morphia.Datastore;
import com.nvarghese.beowulf.common.BeowulfCommonConfigManager;
import com.nvarghese.beowulf.common.ds.DataStoreUtil;
import com.nvarghese.beowulf.common.http.txn.AbstractHttpTransaction;
import com.nvarghese.beowulf.common.http.txn.HttpTxnDAO;
import com.nvarghese.beowulf.common.http.txn.HttpTxnDocument;
import com.nvarghese.beowulf.common.rpc.BwControllerRpcInterface;
import com.nvarghese.beowulf.common.scan.dao.WebScanDAO;
import com.nvarghese.beowulf.common.scan.model.WebScanDocument;
import com.nvarghese.beowulf.common.webtest.CategorizerType;
import com.nvarghese.beowulf.common.webtest.JobStatus;
import com.nvarghese.beowulf.common.webtest.scs.jobs.CategorizationJobDAO;
import com.nvarghese.beowulf.common.webtest.scs.jobs.CategorizationJobDocument;
import com.nvarghese.beowulf.common.webtest.scs.jobs.CategorizerJob;
import com.nvarghese.beowulf.scs.ScsManager;
import com.nvarghese.beowulf.scs.categorizers.MetaCategorizer;
import com.nvarghese.beowulf.scs.categorizers.TransactionCategorizer;
public class CategorizationService {
static Logger logger = LoggerFactory.getLogger(CategorizationService.class);
public void processCategorization(CategorizerJob categorizerJob) {
BwControllerService bwControllerService = new BwControllerService();
WebScanDAO webScanDAO = new WebScanDAO(ScsManager.getInstance().getDataStore());
WebScanDocument webScanDocument = webScanDAO.getWebScanDocument(categorizerJob.getWebScanObjId());
try {
//BwControllerRpcInterface bwContollerRpcClient = bwControllerService.getRpcClient(webScanDocument.getBwControllerIPAddress(),
// webScanDocument.getBwControllerPort());
Datastore ds = DataStoreUtil.createOrGetDataStore(BeowulfCommonConfigManager.getDbUri(), categorizerJob.getDatabaseName());
CategorizationJobDAO categJobDAO = new CategorizationJobDAO(ds);
CategorizationJobDocument categJobDocument = categJobDAO.getCategorizationJobDocument(categorizerJob.getCategorizerJobObjId());
if (categJobDocument != null) {
try {
categJobDocument.setJobStatus(JobStatus.PROCESSING);
categJobDAO.updateCategorizationJobDocument(categJobDocument);
routeCategorizationJob(ds, webScanDocument, categJobDocument);
categJobDocument.setJobStatus(JobStatus.COMPLETED);
categJobDAO.updateCategorizationJobDocument(categJobDocument);
} catch (CategorizationJobException e) {
logger.error("Failed to execute categ job with id: {}. Reason: {}", categJobDocument.getId(), e.getMessage());
e.printStackTrace();
categJobDocument.setJobStatus(JobStatus.ERROR);
categJobDAO.updateCategorizationJobDocument(categJobDocument);
}
} else {
}
//String reply = bwContollerRpcClient.sayHello("BW-Categorization System");
//logger.info("RPC Message was sent to server. Server replied: {}", reply);
} catch (ConfigurationException e) {
logger.error("Failed to create/get datastore for scan instance. Reason: {}", e.getMessage(), e);
} catch (UnknownHostException e) {
logger.error("Failed to create RPC client for the bw-controller. Reason: {}", e.getMessage(), e);
}
}
private void routeCategorizationJob(Datastore ds, WebScanDocument webScanDocument, CategorizationJobDocument categJobDocument) throws CategorizationJobException {
if (categJobDocument.getCategorizerType() == CategorizerType.META) {
processMetaCategorization(ds, webScanDocument, categJobDocument);
}
}
private void processMetaCategorization(Datastore ds, WebScanDocument webScanDocument, CategorizationJobDocument categJobDocument) {
HttpTxnDAO txnDAO = new HttpTxnDAO(ds);
HttpTxnDocument httpTxnDocument = txnDAO.getHttpTxnDocument(categJobDocument.getTxnObjId());
if (httpTxnDocument != null) {
AbstractHttpTransaction httpTransaction = AbstractHttpTransaction.getObject(httpTxnDocument);
doProcessMetaCategorization(ds, webScanDocument, httpTransaction);
} else {
}
}
private void doProcessMetaCategorization(Datastore ds, WebScanDocument webScanDocument, AbstractHttpTransaction httpTransaction) {
logger.info("Running meta categorization on transaction with id: {}", httpTransaction.getObjId());
MetaCategorizer metaCategorizer = new MetaCategorizer();
metaCategorizer.initTransactionCategorizers(ds, webScanDocument);
for (TransactionCategorizer tc : metaCategorizer.getTransactionCategorizers()) {
tc.analyzeTransaction(httpTransaction);
}
}
}