package husacct.control.task;
import husacct.ServiceProvider;
import husacct.common.dto.ApplicationDTO;
import husacct.common.dto.ProjectDTO;
import husacct.control.ControlServiceImpl;
import husacct.control.task.MainController;
import husacct.control.task.WorkspaceController;
import husacct.externalinterface.SaccCommandDTO;
import husacct.externalinterface.ViolationReportDTO;
import java.io.File;
import java.util.Date;
import java.util.HashMap;
import org.apache.log4j.Logger;
public class ExternalComplianceCheck {
private ControlServiceImpl controlService;
private MainController mainController;
private WorkspaceController workspaceController;
private ViolationReportDTO violationReport;
private Logger logger = Logger.getLogger(ExternalComplianceCheck.class);
/**
* Read service definition in class ExternalServiceProvider.
* @param saccCommandDTO: Read Javadoc of class SaccCommandDTO.
*/
public ViolationReportDTO performSoftwareArchitectureComplianceCheck(SaccCommandDTO saccCommandDTO) {
violationReport = new ViolationReportDTO();
try {
logger.info(String.format(" Start: Software Architecture Compliance Check"));
if ((saccCommandDTO.getHusacctWorkspaceFile() == null) || saccCommandDTO.getHusacctWorkspaceFile().equals("")) {
logger.warn(" Parameter not set: husacctWorkspaceFile");
} else {
setControllers();
loadWorkspace(saccCommandDTO.getHusacctWorkspaceFile());
setSourceCodePaths(saccCommandDTO);
analyseApplication();
checkConformance();
violationReport = getViolationReportDTO(saccCommandDTO.getImportFilePreviousViolations(), saccCommandDTO.getExportAllViolations(), saccCommandDTO.getExportNewViolations());
}
logger.info(String.format(" Finished: Software Architecture Compliance Check"));
} catch (Exception e){
logger.warn(" Exception: " + e.getMessage());
}
return violationReport;
}
private void setControllers(){
controlService = (ControlServiceImpl) ServiceProvider.getInstance().getControlService();
mainController = controlService.getMainController();
workspaceController = mainController.getWorkspaceController();
}
private void loadWorkspace(String location) {
logger.info(String.format("Loading workspace: %s", location));
File file = new File(location);
if(file.exists()){
HashMap<String, Object> dataValues = new HashMap<String, Object>();
dataValues.put("file", file);
workspaceController.loadWorkspace("Xml", dataValues);
if(workspaceController.isAWorkspaceOpened()){
logger.info(String.format(new Date().toString() + " Workspace %s loaded", location));
} else {
logger.warn(String.format("Unable to open workspace: %s", file.getAbsoluteFile()));
}
} else {
logger.warn(String.format("Unable to locate: %s", file.getAbsoluteFile()));
}
}
private void setSourceCodePaths(SaccCommandDTO saccCommandDTO) {
if ((saccCommandDTO.getSourceCodePaths() != null) && (saccCommandDTO.getSourceCodePaths().size() >= 1)) {
ApplicationDTO applicationDTO = ServiceProvider.getInstance().getDefineService().getApplicationDetails();
for (ProjectDTO project : applicationDTO.projects) {
project.paths = saccCommandDTO.getSourceCodePaths();
}
ServiceProvider.getInstance().getDefineService().createApplication(applicationDTO.name, applicationDTO.projects, applicationDTO.version);
}
}
private void analyseApplication() {
controlService = (ControlServiceImpl) ServiceProvider.getInstance().getControlService();
mainController = controlService.getMainController();
mainController.getApplicationController().analyseApplication();
//analyseApplication() starts a different Thread, and needs some time to finish
boolean isAnalysing = true;
while(isAnalysing){
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
isAnalysing = mainController.getStateController().isAnalysing();
}
}
private void checkConformance() {
ServiceProvider.getInstance().getControlService().setValidating(true);
logger.info(new Date().toString() + " CheckConformanceTask is Starting: IValidateService.checkConformance()" );
ServiceProvider.getInstance().getValidateService().checkConformance();
ServiceProvider.getInstance().getControlService().setValidating(false);
logger.info(new Date().toString() + " CheckConformanceTask sets state Validating to false" );
//checkConformance() starts a different Thread, and needs some time
boolean isValidating = true;
controlService = (ControlServiceImpl) ServiceProvider.getInstance().getControlService();
mainController = controlService.getMainController();
while(isValidating){
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
isValidating = mainController.getStateController().isValidating();
}
}
private ViolationReportDTO getViolationReportDTO(String importFilePreviousViolations, boolean exportAllViolations, boolean exportNewViolations) {
ViolationReportDTO violationReport = new ViolationReportDTO();
if (importFilePreviousViolations != null && !importFilePreviousViolations.equals("")) {
File previousViolationsFile = new File(importFilePreviousViolations);
if(previousViolationsFile.exists()){
controlService = (ControlServiceImpl) ServiceProvider.getInstance().getControlService();
mainController = controlService.getMainController();
violationReport = mainController.getExportImportController().getViolationReportData(previousViolationsFile, exportAllViolations, exportNewViolations);
} else {
logger.warn(String.format("Unable to locate importFilePreviousViolations: %s", previousViolationsFile.getAbsoluteFile()));
violationReport = mainController.getExportImportController().getViolationReportData(null, exportAllViolations, exportNewViolations);
}
} else {
violationReport = mainController.getExportImportController().getViolationReportData(null, exportAllViolations, exportNewViolations);
}
return violationReport;
}
}