package husacct.define.task; import husacct.ServiceProvider; import husacct.common.enums.ModuleTypes; import husacct.define.domain.appliedrule.AppliedRuleStrategy; import husacct.define.domain.module.ModuleStrategy; import husacct.define.domain.module.modules.Component; import husacct.define.domain.services.AppliedRuleDomainService; import husacct.define.domain.services.DefaultRuleDomainService; import husacct.define.domain.services.ModuleDomainService; import husacct.define.domain.services.SoftwareUnitDefinitionDomainService; import husacct.define.domain.services.WarningMessageService; import husacct.define.presentation.DefineInternalFrame; import husacct.define.presentation.jpanel.DefinitionJPanel; import husacct.define.presentation.utils.UiDialogs; import husacct.define.task.components.AbstractDefineComponent; import husacct.define.task.components.AnalyzedModuleComponent; import husacct.define.task.components.DefineComponentFactory; import husacct.define.task.components.SoftwareArchitectureComponent; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Observable; import java.util.Observer; import org.apache.log4j.Logger; public class DefinitionController extends Observable implements Observer { private static DefinitionController instance; public static DefinitionController getInstance() { return instance == null ? (instance = new DefinitionController()) : instance; } public static void setInstance(DefinitionController dC) { instance = dC; } private DefineInternalFrame defineInternalFrame; private AppliedRuleDomainService appliedRuleService; private DefaultRuleDomainService defaultRuleService; private SoftwareUnitDefinitionDomainService softwareUnitDefinitionDomainService; private ModuleDomainService moduleService; private List<Observer> observersWithinDefine; private List<Observer> observersWithinDefineOfAnalyse; private Logger logger; private long selectedModuleId = -1; public DefinitionController() { observersWithinDefine = new ArrayList<Observer>(); observersWithinDefineOfAnalyse = new ArrayList<Observer>(); logger = Logger.getLogger(DefinitionController.class); moduleService = new ModuleDomainService(); appliedRuleService = new AppliedRuleDomainService(); softwareUnitDefinitionDomainService = new SoftwareUnitDefinitionDomainService(); defaultRuleService = new DefaultRuleDomainService(); } private void addChildComponents(AbstractDefineComponent parentComponent, ModuleStrategy module) { AbstractDefineComponent childComponent = DefineComponentFactory.getDefineComponent(module); for (ModuleStrategy subModule : module.getSubModules()) { //logger.debug(module.getName() + " ]" + module.getType()); addChildComponents(childComponent, subModule); } parentComponent.addChild(childComponent); } @Override public void addObserver(Observer o) { if (!observersWithinDefine.contains(o)) { observersWithinDefine.add(o); } } public void addObserverWithinDefineOfAnalyse(Observer o) { if (!observersWithinDefineOfAnalyse.contains(o)) { observersWithinDefineOfAnalyse.add(o); } } public ArrayList<Long> getAppliedRuleIdsBySelectedModule() { return appliedRuleService.getAppliedRulesIdsByModuleFromId(getSelectedModuleId()); } /** * This function will return a HashMap with the details of the requested * module, or an empty HashMap if the module is not found. */ public HashMap<String, Object> getModuleDetails(long moduleId) { HashMap<String, Object> moduleDetails = new HashMap<String, Object>(); if (moduleId != -1) { try { ModuleStrategy module = moduleService.getModuleById(moduleId); if (module != null) { moduleDetails.put("id", module.getId()); moduleDetails.put("name", module.getName()); moduleDetails.put("description", module.getDescription()); moduleDetails.put("type", module.getType()); } } catch (Exception e) { logger.error("getModuleDetails() - exception: " + e.getMessage()); //UiDialogs.errorDialog(getDefinitionPanel(), e.getMessage()); } } return moduleDetails; } public String getModuleName(long moduleId) { String moduleName = "Root"; if (getSelectedModuleId() != -1) { moduleName = moduleService.getModuleNameById(getSelectedModuleId()); } return moduleName; } public AbstractDefineComponent getModuleTreeComponents() { SoftwareArchitectureComponent rootComponent = new SoftwareArchitectureComponent(); ArrayList<ModuleStrategy> modules = moduleService.getSortedModules(); for (ModuleStrategy module : modules) { addChildComponents(rootComponent, module); } return rootComponent; } /** * Returns an DefineInternalFrame with an added DefenitionJPanel. */ public DefineInternalFrame getNewDefineInternalFrame() { clearObserversWithinDefine(); defineInternalFrame = new DefineInternalFrame(); return defineInternalFrame; } public HashMap<String, Object> getRuleDetailsByAppliedRuleId( long appliedRuleId) { AppliedRuleStrategy rule = appliedRuleService.getAppliedRuleById(appliedRuleId); HashMap<String, Object> ruleDetails = new HashMap<String, Object>(); ruleDetails.put("id", rule.getId()); ruleDetails.put("description", rule.getDescription()); ruleDetails.put("dependencies", rule.getDependencyTypes()); ruleDetails.put("moduleFromName", rule.getModuleFrom().getName()); ruleDetails.put("moduleToName", rule.getModuleTo().getName()); ruleDetails.put("enabled", rule.isEnabled()); ruleDetails.put("regex", rule.getRegex()); ruleDetails.put("ruleTypeKey", rule.getRuleTypeKey()); ruleDetails.put("numberofexceptions", rule.getExceptions().size()); return ruleDetails; } public long getSelectedModuleId() { return selectedModuleId; } public ArrayList<String> getSoftwareUnitNamesBySelectedModule(long selectedModuleId) { return softwareUnitDefinitionDomainService.getSoftwareUnitNames(selectedModuleId); } public String getSoftwareUnitTypeBySoftwareUnitName(String softwareUnitName) { return softwareUnitDefinitionDomainService.getSoftwareUnitType(softwareUnitName); } public void clearObserversWithinDefine() { observersWithinDefine.clear(); observersWithinDefineOfAnalyse.clear(); } public DefineInternalFrame getDefineInternalFrame() { if (defineInternalFrame != null) { return defineInternalFrame; } else { getNewDefineInternalFrame(); return defineInternalFrame; } } public DefinitionJPanel getDefinitionPanel() { return getDefineInternalFrame().getDefinitionPanel(); } public boolean isAnalysed() { return ServiceProvider.getInstance().getAnalyseService().isAnalysed(); } public void moveLayerDown(long layerId) { try { if (layerId != -1) { moduleService.moveLayerDown(layerId); this.notifyObservers(); } } catch (Exception e) { logger.error("moveLayerDown() - exception: " + e.getMessage()); UiDialogs.errorDialog(getDefinitionPanel(), e.getMessage()); } } public void moveLayerUp(long layerId) { try { if (layerId != -1) { moduleService.moveLayerUp(layerId); this.notifyObservers(); } } catch (Exception e) { logger.error("moveLayerUp() - exception: " + e.getMessage()); UiDialogs.errorDialog(getDefinitionPanel(), e.getMessage()); } } @Override public void notifyObservers() { long moduleId = getSelectedModuleId(); for (Observer o : observersWithinDefine) { o.update(this, moduleId); } } public void notifyAnalyzedObservers() { for (Observer o : observersWithinDefineOfAnalyse) { o.update(this, "updateSoftwareTree"); } } /** * This function will load notify all to update their data */ public void notifyObservers(long moduleId) { for (Observer o : observersWithinDefine) { o.update(this, moduleId); } } public void passModuleToService(long selectedModuleId, ModuleStrategy module) { String exceptionMessage = ""; exceptionMessage = moduleService.addModuleToParent(selectedModuleId, module); this.notifyObservers(); if (!exceptionMessage.isEmpty()) { UiDialogs.errorDialog(getDefinitionPanel(), exceptionMessage); } else { logger.info("Adding module with Id: " + module.getId() + ", Name: " + module.getName()); } } /** * Remove a module by Id */ public void removeModuleById(long moduleId) { try { long parentId = moduleService.getParentModuleIdByChildId(moduleId); moduleService.removeModuleById(moduleId); setSelectedModuleId(parentId); this.notifyObservers(); } catch (Exception e) { logger.error("removeModuleById(" + moduleId + ") - exception: " + e.getMessage()); UiDialogs.errorDialog(getDefinitionPanel(), e.getMessage()); e.printStackTrace(); } } public void removeObserver(Observer o) { if (observersWithinDefine.contains(o)) { observersWithinDefine.remove(o); } } public void removeRules(List<Long> appliedRuleIds) { boolean mandatory = false; try { if (getSelectedModuleId() != -1L && !appliedRuleIds.isEmpty()) { for (long appliedRuleID : appliedRuleIds) { AppliedRuleStrategy rule = appliedRuleService .getAppliedRuleById(appliedRuleID); if (defaultRuleService.isMandatoryRule(rule)) { mandatory = true; UiDialogs.errorDialog(getDefinitionPanel(), ServiceProvider .getInstance().getLocaleService() .getTranslatedString("DefaultRule") + "\n- " + rule.getRuleTypeKey()); break; } } if (!mandatory) { boolean confirm = UiDialogs.confirmDialog( getDefinitionPanel(), ServiceProvider .getInstance() .getLocaleService() .getTranslatedString( "ConfirmRemoveAppliedRule"), "Remove?"); if (confirm) { for (long appliedRuleID : appliedRuleIds) { logger.info("Removing rule " + appliedRuleID); appliedRuleService.removeAppliedRule(appliedRuleID); } this.notifyObservers(); } } } } catch (Exception e) { logger.error("removeRule() - exception: " + e.getMessage()); UiDialogs.errorDialog(getDefinitionPanel(), e.getMessage()); } } /** * Remove the selected software unit */ public void removeSoftwareUnits(List<String> softwareUnitNames, List<String> types) { try { long moduleId = getSelectedModuleId(); int location = 0; boolean confirm = UiDialogs.confirmDialog(getDefinitionPanel(), ServiceProvider.getInstance().getLocaleService() .getTranslatedString("ConfirmRemoveSoftwareUnit"), "Remove?"); for (String softwareUnit : softwareUnitNames) { String type = types.get(location); logger.info("Removing software unit " + softwareUnit + ", Type: " + type); if (moduleId != -1 && softwareUnit != null && !softwareUnit.equals("")) { if (confirm) { JtreeController.instance().restoreTreeItemm(softwareUnitNames, types); boolean chekHasCodelevelWarning = WarningMessageService.getInstance().isCodeLevelWarning(softwareUnit); if (chekHasCodelevelWarning) { boolean confirm2 = UiDialogs.confirmDialog(getDefinitionPanel(), "Your about to remove a software unit that does exist at code level", "Remove?"); if (confirm2) { softwareUnitDefinitionDomainService.removeSoftwareUnit(moduleId, softwareUnit); } } else { softwareUnitDefinitionDomainService.removeSoftwareUnit(moduleId, softwareUnit); } this.notifyObservers(); } } location++; } } catch (Exception e) { logger.error("removeSoftwareUnit() - exception: " + e.getMessage()); e.printStackTrace(); UiDialogs.errorDialog(getDefinitionPanel(), e.getMessage()); } } public void setSelectedModuleId(long moduleId) { if (moduleId != selectedModuleId) { selectedModuleId = moduleId; notifyObservers(moduleId); } } @Override public void update(Observable o, Object arg) { logger.info("update(" + o + ", " + arg + ")"); long moduleId = getSelectedModuleId(); notifyObservers(moduleId); } public void updateModuleDetails(String moduleName, String moduleDescription, ModuleTypes moduleType) { try { long moduleId = getSelectedModuleId(); if (moduleId != -1) { moduleService.updateModuleDetails(moduleId, moduleName, moduleDescription, moduleType.toString()); } this.notifyObservers(); getDefinitionPanel().modulePanel.updateModuleTree(); } catch (Exception e) { logger.error("updateModule() - exception: " + e.getMessage()); UiDialogs.errorDialog(getDefinitionPanel(), e.getMessage()); } } public void addModule(String name, String description, String type) { ModuleStrategy module= moduleService.createNewModule(type); module.set(name, description); if (module instanceof Component) { ModuleStrategy facade= moduleService.createNewModule("Facade"); facade.set("Interface<"+name+">", "This module represents the interface(s) of the component."); module.addSubModule(facade); } this.passModuleToService(getSelectedModuleId(), module); setSelectedModuleId(module.getId()); } public boolean saveAnalzedModule(ArrayList<AnalyzedModuleComponent> units) { long id = DefinitionController.getInstance().getSelectedModuleId(); SoftwareUnitController softwareUnitController = new SoftwareUnitController(id); softwareUnitController.save(units); notifyObservers(); return true; } }