package com.nvarghese.beowulf.smf.scan.services;
import java.util.Map;
import javax.jms.JMSException;
import org.bson.types.ObjectId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.nvarghese.beowulf.common.exception.ServiceException;
import com.nvarghese.beowulf.common.jobs.NewScanJob;
import com.nvarghese.beowulf.common.scan.dao.MasterScanConfigDAO;
import com.nvarghese.beowulf.common.scan.dao.MasterScanReportDAO;
import com.nvarghese.beowulf.common.scan.dao.WebScanDAO;
import com.nvarghese.beowulf.common.scan.dto.config.Profile;
import com.nvarghese.beowulf.common.scan.model.MasterScanConfigDocument;
import com.nvarghese.beowulf.common.scan.model.MasterScanReportDocument;
import com.nvarghese.beowulf.common.scan.model.TestModuleScanConfigDocument;
import com.nvarghese.beowulf.common.scan.model.WebScanDocument;
import com.nvarghese.beowulf.common.webtest.ScanPhase;
import com.nvarghese.beowulf.common.webtest.dao.TestModuleMetaDataDAO;
import com.nvarghese.beowulf.common.webtest.model.TestModuleMetaDataDocument;
import com.nvarghese.beowulf.smf.SmfManager;
import com.nvarghese.beowulf.smf.scan.dto.scanrequest.Baseuris;
import com.nvarghese.beowulf.smf.scan.dto.scanrequest.Comments;
import com.nvarghese.beowulf.smf.scan.dto.scanrequest.Jobs;
import com.nvarghese.beowulf.smf.scan.dto.scanrequest.ScanRequest;
import com.nvarghese.beowulf.smf.scan.transformers.ScanProfileTransformer;
public class ScanManagementService {
static Logger logger = LoggerFactory.getLogger(ScanManagementService.class);
public ScanRequest createWebScanRequest(Profile profile) throws ServiceException {
MasterScanConfigDocument scanConfigDocument = new MasterScanConfigDocument();
// transform
ScanProfileTransformer profileTransformer = new ScanProfileTransformer();
scanConfigDocument.setHttpClientScanConfig(profileTransformer.transformToHttpClientScanConfigDocument(profile.getHttpClient()));
scanConfigDocument.setSettingScanConfig(profileTransformer.transformToSettingScanConfigDocument(profile.getScanSettings()));
scanConfigDocument.setReportScanConfig(profileTransformer.transformToReportScanConfigDocument(profile.getReportSettings()));
scanConfigDocument.setSessionScanConfig(profileTransformer.transformToSessionSettingScanConfigDocument(profile.getSessionSettings()));
scanConfigDocument.setTestModules(profileTransformer.transformToMappedTestModuleScanConfigDocument(profile.getTestModules()));
updateTestModulesWithTestType(scanConfigDocument.getTestModules());
// persist
MasterScanConfigDAO scanConfigDAO = new MasterScanConfigDAO(SmfManager.getInstance().getDataStore());
scanConfigDAO.createMasterScanConfigDocument(scanConfigDocument);
MasterScanReportDAO reportDAO = new MasterScanReportDAO(SmfManager.getInstance().getDataStore());
MasterScanReportDocument scanReport = new MasterScanReportDocument();
reportDAO.createMasterScanReportDocument(scanReport);
WebScanDocument webScanDocument = new WebScanDocument();
webScanDocument.setScanConfig(scanConfigDocument);
webScanDocument.setScanReport(scanReport);
webScanDocument.setBaseUris(scanConfigDocument.getSettingScanConfig().getBaseURIList());
webScanDocument.setScanPhase(ScanPhase.INITIALIZATION.getName());
// persist
WebScanDAO webScanDAO = new WebScanDAO(SmfManager.getInstance().getDataStore());
webScanDAO.createWebScanDocument(webScanDocument);
try {
NewScanJob newScanJob = new NewScanJob(webScanDocument.getId().toString());
BwControllerService bwControllerService = new BwControllerService();
bwControllerService.submitJob(newScanJob);
} catch (JMSException e) {
logger.error("Failed to submit the new scan job. Reason: {}", e.getMessage(), e);
ServiceException se = new ServiceException();
se.initCause(e.getCause());
throw se;
}
return transformToScanRequest(webScanDocument);
}
private void updateTestModulesWithTestType(Map<Long, TestModuleScanConfigDocument> testModules) {
TestModuleMetaDataDAO testModuleMetaDataDAO = new TestModuleMetaDataDAO(SmfManager.getInstance().getDataStore());
for (TestModuleScanConfigDocument scanConfigDocument : testModules.values()) {
TestModuleMetaDataDocument metaTestModule = testModuleMetaDataDAO.findByModuleNumber(scanConfigDocument.getModuleNumber());
if (metaTestModule != null) {
scanConfigDocument.setTestType(metaTestModule.getTestType());
} else {
logger.warn("Failed to find metaTestModule with module_number: {}", scanConfigDocument.getModuleNumber());
}
}
}
/**
*
* @param objectId
* @return
* @throws ResourceNotFoundException
*/
public ScanRequest getWebScanRequest(ObjectId objectId) throws ResourceNotFoundException {
WebScanDAO webScanDAO = new WebScanDAO(SmfManager.getInstance().getDataStore());
WebScanDocument webScanDocument = webScanDAO.getWebScanDocument(objectId);
if (webScanDocument != null) {
return transformToScanRequest(webScanDocument);
} else {
throw new ResourceNotFoundException();
}
}
private ScanRequest transformToScanRequest(WebScanDocument webScanDocument) {
ScanRequest scanRequest = new ScanRequest();
Baseuris baseuris = new Baseuris();
baseuris.setBaseuri(webScanDocument.getBaseUris());
scanRequest.setBaseuris(baseuris);
Comments comments = new Comments();
comments.setComment(webScanDocument.getComments());
scanRequest.setComments(comments);
Jobs jobs = new Jobs();
long completed = webScanDocument.getCompletedCategorizationJobs() + webScanDocument.getCompletedExecutionJobs();
long pending = webScanDocument.getPendingCategorizationJobs() + webScanDocument.getPendingExecutionJobs();
long created = webScanDocument.getCreatedCategorizationJobs() + webScanDocument.getCreatedExecutionJobs();
jobs.setCompleted(completed);
jobs.setCreated(created);
jobs.setPending(pending);
scanRequest.setJobs(jobs);
scanRequest.setId(webScanDocument.getId().toString());
scanRequest.setPercentagedone(webScanDocument.getPercentageDone());
scanRequest.setScanphase(webScanDocument.getScanPhase());
scanRequest.setStartedtime(webScanDocument.getScanStartTime().getTime());
scanRequest.setEstimatedtime(webScanDocument.getScanEndTime().getTime());
return scanRequest;
}
}