package husacct.control;
import husacct.ServiceProvider;
import husacct.common.OSDetector;
import husacct.common.dto.ApplicationDTO;
import husacct.common.enums.States;
import husacct.common.savechain.ISaveable;
import husacct.common.services.IConfigurable;
import husacct.common.services.ObservableService;
import husacct.control.domain.Workspace;
import husacct.control.presentation.util.DialogUtils;
import husacct.control.presentation.util.GeneralConfigurationPanel;
import husacct.control.presentation.util.LoadingDialog;
import husacct.control.presentation.viewcontrol.ViewController;
import husacct.control.task.ApplicationController;
import husacct.control.task.BootstrapHandler;
import husacct.control.task.ExternalComplianceCheck;
import husacct.control.task.FileController;
import husacct.control.task.IFileChangeListener;
import husacct.control.task.MainController;
import husacct.control.task.StateController;
import husacct.control.task.WorkspaceController;
import husacct.control.task.configuration.ConfigPanel;
import husacct.control.task.configuration.ConfigurationManager;
import husacct.control.task.threading.ThreadWithLoader;
import husacct.externalinterface.SaccCommandDTO;
import husacct.externalinterface.ViolationReportDTO;
import husacct.validate.domain.validation.Severity;
import java.awt.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import javax.swing.JDialog;
import org.apache.log4j.Logger;
import org.jdom2.Element;
public class ControlServiceImpl extends ObservableService implements IControlService, ISaveable, IConfigurable {
private Logger logger = Logger.getLogger(ControlServiceImpl.class);
ArrayList<ILocaleChangeListener> listeners = new ArrayList<ILocaleChangeListener>();
private boolean isGuiEnabled = false;
private MainController mainController;
private WorkspaceController workspaceController;
private ApplicationController applicationController;
private StateController stateController;
private ViewController viewController;
private GeneralConfigurationPanel generalConfigurationPanel;
private FileController fileController;
private Thread eventHandlerThread;
public ControlServiceImpl(){
mainController = new MainController();
workspaceController = mainController.getWorkspaceController();
applicationController = mainController.getApplicationController();
stateController = mainController.getStateController();
viewController = mainController.getViewController();
mainController.initialiseCodeViewerController();
fileController = mainController.getFileController();
setDefaultSettings();
}
private void setDefaultSettings() {
String appDataFolderPath = OSDetector.getAppFolder();
logger.info("App data folder (platform specific): " + appDataFolderPath);
ConfigurationManager.setPropertyIfEmpty("LastUsedLoadXMLWorkspacePath", appDataFolderPath + "husacct_workspace.xml");
ConfigurationManager.setPropertyIfEmpty("LastUsedSaveXMLWorkspacePath", appDataFolderPath + "husacct_workspace.xml");
ConfigurationManager.setPropertyIfEmpty("LastUsedAddProjectPath", appDataFolderPath);
ConfigurationManager.setPropertyIfEmpty("ApplicationHistoryXMLFilename", "applicationanalysishistory.xml");
ConfigurationManager.setPropertyIfEmpty("ActionLogger", "false");
ConfigurationManager.setPropertyIfEmpty("Language", "en");
}
@Override
public void parseCommandLineArguments(String[] commandLineArguments){
mainController.parseCommandLineArguments(commandLineArguments);
}
@Override
public ViolationReportDTO performSoftwareArchitectureComplianceCheck(SaccCommandDTO saccCommandDTO) {
ExternalComplianceCheck externalComplianceCheck = new ExternalComplianceCheck();
ViolationReportDTO violationReport = externalComplianceCheck.performSoftwareArchitectureComplianceCheck(saccCommandDTO);
return violationReport;
}
@Override
public void startApplication() {
mainController.startGui();
isGuiEnabled = true;
if(mainController.getCommandLineController().getResult().contains("bootstrap")){
new BootstrapHandler(mainController.getCommandLineController().getResult().getStringArray("bootstrap"));
}
}
@Override
public boolean isGuiEnabled() {
return isGuiEnabled;
}
@Override
public Element getWorkspaceData() {
Element data = new Element("workspace");
Workspace workspace = workspaceController.getCurrentWorkspace();
if (workspace != null) {
data.setAttribute("name", workspace.getName());
data.setAttribute("language", ServiceProvider.getInstance().getLocaleService().getLocale().getLanguage());
}
return data;
}
@Override
public void loadWorkspaceData(Element workspaceData) {
String languageName = "en";
try {
String workspaceName = workspaceData.getAttributeValue("name");
languageName = workspaceData.getAttributeValue("language");
workspaceController.createWorkspace(workspaceName);
} catch (Exception e){
logger.debug("WorkspaceData corrupt: " + e);
}
try {
ServiceProvider.getInstance().getLocaleService().setLocale(new Locale(languageName));
} catch (Exception e){
logger.warn(" LocaleService not found at specified path ");
}
}
@Override
public void showErrorMessage(String message){
applicationController.showErrorMessage(message);
}
@Override
public void showInfoMessage(String message){
applicationController.showInfoMessage(message);
}
@Override
public void centerDialog(JDialog dialog){
DialogUtils.alignCenter(dialog);
}
@Override
public ThreadWithLoader getThreadWithLoader(String progressInfoText, Runnable threadTask) {
ThreadWithLoader loader = new ThreadWithLoader(mainController, progressInfoText, threadTask);
mainController.getApplicationController().setCurrentLoadingDialog(loader.getLoadingDialog());
return loader;
}
@Override
public void setServiceListeners(){
stateController.setServiceListeners();
viewController.setLocaleListeners();
}
public MainController getMainController(){
return mainController;
}
@Override
public List<States> getStates() {
return this.getMainController().getStateController().getStates();
}
@Override
public void updateProgress(int progressPercentage) {
try{
LoadingDialog loadingDialog = mainController.getApplicationController().getCurrentLoadingDialog();
if (loadingDialog != null) {
loadingDialog.setProgressText(progressPercentage);
}
}catch(Exception e){
logger.warn(" Error while updating progress in thread loader dialog.");
}
}
@Override
public void setValidating(boolean isValidating) {
this.mainController.getStateController().setValidating(isValidating);
}
@Override
public ApplicationDTO getApplicationDTO() {
return mainController.getWorkspaceController().getCurrentWorkspace().getApplicationData();
}
@Override
public void displayErrorsInFile(String fileName, HashMap<Integer, Severity> errors) {
mainController.getCodeViewerController().displayErrorsInFile(fileName, errors);
}
@Override
public void displayErrorInFile(String fileName, int lineNumber, Severity severity) {
HashMap<Integer, Severity> errors = new HashMap<Integer, Severity>();
if ((lineNumber > 0) && (severity != null)) {
errors.put(lineNumber, severity);
}
mainController.getCodeViewerController().displayErrorsInFile(fileName, errors);
}
@Override
public String getConfigurationName() {
return ServiceProvider.getInstance().getLocaleService().getTranslatedString("ConfigGeneral");
}
@Override
public ConfigPanel getConfigurationPanel() {
if (generalConfigurationPanel == null)
generalConfigurationPanel = new GeneralConfigurationPanel(mainController);
return generalConfigurationPanel;
}
@Override
public HashMap<String, ConfigPanel> getSubItems() {
HashMap<String, ConfigPanel> subitems = new HashMap<String, ConfigPanel>();
return subitems;
}
@Override
public void showHelpDialog(Component comp) {
mainController.getApplicationController().showHelpGUI(comp);
}
@Override
public String showMojoExportImportDialog(boolean isExport) {
return mainController.getExportImportController().showExportImportMojoGUI(isExport);
}
@Override
public void addProjectForListening(String path) {
try {
fileController.addProject(path);
} catch (IOException e) {
e.printStackTrace();
}
eventHandlerThread = new Thread() {
@Override
public void run() {
try {
fileController.processEvents();
} catch (IOException e) {
e.printStackTrace();
}
}
};
eventHandlerThread.start();
}
@Override
public void addFileChangeListener(IFileChangeListener listener) {
fileController.addFileChangeListener(listener);
}
}