package husacct.graphics.task; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import husacct.ServiceProvider; import husacct.analyse.IAnalyseService; import husacct.common.dto.AbstractDTO; import husacct.common.dto.DependencyDTO; import husacct.common.dto.ModuleDTO; import husacct.common.dto.RuleDTO; import husacct.common.dto.UmlLinkDTO; import husacct.common.dto.ViolationDTO; import husacct.define.IDefineService; import husacct.graphics.domain.DrawingView; import husacct.graphics.domain.figures.BaseFigure; import husacct.graphics.domain.figures.ModuleFigure; import husacct.graphics.domain.figures.RelationFigure; import husacct.validate.IValidateService; public class ModuleAndRuleController extends DrawingController { protected IAnalyseService analyseService; protected IDefineService defineService; protected IValidateService validateService; public ModuleAndRuleController() { super(); initializeServices(); } @Override public DrawingView drawArchitectureTopLevel() { super.drawArchitectureTopLevel(); ModuleFigure[] shownModules = drawing.getShownModules(); ArrayList<ModuleFigure> modulesInRoot = new ArrayList<ModuleFigure>(Arrays.asList(shownModules)); modulesInRoot.forEach(moduleFigure -> moduleFigure.setVisible(true)); ArrayList<String> parentNames = new ArrayList<String>(); // Parent is a module to-be-zoomed-in for (ModuleFigure moduleFigure : modulesInRoot){ parentNames.add(moduleFigure.getUniqueName()); parentFigureNameAndTypeMap.put(moduleFigure.getUniqueName(), moduleFigure.getType()); } if (parentNames.size() > 0) { resetContextFigures(); // Needed to initialize contextFigures the first time this.gatherChildModuleFiguresAndContextFigures_AndDraw(parentNames.toArray(new String[] {})); } return drawingView; } @Override protected ModuleFigure getModuleFiguresByUniqueName(String uniqueName) { ModuleFigure moduleFigure = null; ModuleDTO module = defineService.getModule_ByUniqueName(uniqueName); if (module != null) { moduleFigure = figureFactory.createModuleFigure(module); } return moduleFigure; } @Override protected ArrayList<ModuleFigure> getModuleFiguresInRoot() { ModuleDTO[] rootModules = defineService.getModule_AllRootModules(); ArrayList<ModuleFigure> rootModuleFigures = new ArrayList<ModuleFigure>(); for (AbstractDTO rootModule : rootModules) { ModuleFigure rootModuleFigure = figureFactory.createModuleFigure(rootModule); rootModuleFigures.add(rootModuleFigure); } return rootModuleFigures; } @Override protected HashSet<String> getChildenOfParent(String parentName) { if (parentName.equals("")) { parentName = "**"; // Root within Define. } ModuleDTO[] children = defineService.getModule_TheChildrenOfTheModule(parentName); HashSet<String> knownChildren = new HashSet<String>(); for (ModuleDTO child : children) { knownChildren.add(child.logicalPath); } return knownChildren; } @Override protected ArrayList<ModuleFigure> getChildModuleFiguresOfParent(String parentName) { if (parentName.equals("")) { parentName = "**"; // Root within Define. } ModuleDTO[] children = defineService.getModule_TheChildrenOfTheModule(parentName); ArrayList<ModuleFigure> knownChildren = new ArrayList<ModuleFigure>(); for (AbstractDTO child : children) { ModuleFigure moduleFigure = figureFactory.createModuleFigure(child); knownChildren.add(moduleFigure); } return knownChildren; } @Override protected RelationFigure getRelationFigureBetween(ModuleFigure figureFrom, ModuleFigure figureTo) { RuleDTO[] matchingRules = defineService.getRulesByLogicalPath(figureFrom.getUniqueName(), figureTo.getUniqueName()); return figureFactory.createRelationFigure_Rule(matchingRules); } @Override protected DependencyDTO[] getDependenciesBetween(ModuleFigure figureFrom, ModuleFigure figureTo) { ArrayList<DependencyDTO> dependencies = new ArrayList<DependencyDTO>(); if ((figureFrom != null) && (figureTo != null) && !figureFrom.getUniqueName().equals(figureTo.getUniqueName())){ HashSet<String> physicalClassPathsFrom = defineService.getModule_AllPhysicalClassPathsOfModule(figureFrom.getUniqueName()); HashSet<String> physicalClassPathsTo = defineService.getModule_AllPhysicalClassPathsOfModule(figureTo.getUniqueName()); for (String physicalClassPathFrom : physicalClassPathsFrom){ for (String physicalClassPathTo : physicalClassPathsTo) { DependencyDTO[] foundDependencies = analyseService.getDependenciesFromClassToClass(physicalClassPathFrom, physicalClassPathTo); for (DependencyDTO tempDependency : foundDependencies) dependencies.add(tempDependency); } } } return dependencies.toArray(new DependencyDTO[] {}); } @Override protected UmlLinkDTO[] getUmlLinksBetween(ModuleFigure figureFrom, ModuleFigure figureTo){ ArrayList<UmlLinkDTO> umlLinks = new ArrayList<UmlLinkDTO>(); if ((figureFrom != null) && (figureTo != null) && !figureFrom.getUniqueName().equals(figureTo.getUniqueName())){ HashSet<String> physicalClassPathsFrom = defineService.getModule_AllPhysicalClassPathsOfModule(figureFrom.getUniqueName()); HashSet<String> physicalClassPathsTo = defineService.getModule_AllPhysicalClassPathsOfModule(figureTo.getUniqueName()); for (String physicalClassPathFrom : physicalClassPathsFrom){ for (String physicalClassPathTo : physicalClassPathsTo) { UmlLinkDTO[] foundDependencies = analyseService.getUmlLinksFromClassToToClass(physicalClassPathFrom, physicalClassPathTo); for (UmlLinkDTO tempDependency : foundDependencies) umlLinks.add(tempDependency); } } } return umlLinks.toArray(new UmlLinkDTO[] {}); } @Override protected RuleDTO[] getRulesBetween(BaseFigure figureFrom, BaseFigure figureTo) { if ((figureFrom != null) && (figureTo != null) ){ RuleDTO[] returnValue = defineService.getRulesByLogicalPath(figureFrom.getUniqueName(), figureTo.getUniqueName()); return returnValue; } else { return new RuleDTO[]{}; } } // @Override // protected RuleDTO[] getRulesBetween(ModuleFigure figureFrom, ModuleFigure figureTo) { // ArrayList<RuleDTO> rules = new ArrayList<RuleDTO>(); // if ((figureFrom != null) && (figureTo != null) && !figureFrom.getUniqueName().equals(figureTo.getUniqueName())){ // HashSet<String> physicalClassPathsFrom = defineService.getModule_AllPhysicalClassPathsOfModule(figureFrom.getUniqueName()); // HashSet<String> physicalClassPathsTo = defineService.getModule_AllPhysicalClassPathsOfModule(figureTo.getUniqueName()); // for (String physicalClassPathFrom : physicalClassPathsFrom){ // for (String physicalClassPathTo : physicalClassPathsTo) { // RuleDTO[] foundRules = analyseService.getDependenciesFromClassToClass(physicalClassPathFrom, physicalClassPathTo); // for (RuleDTO tempDependency : foundRules) // rules.add(tempDependency); // } // } // } // return rules.toArray(new RuleDTO[] {}); // } @Override protected boolean hasRelationBetween(ModuleFigure figureFrom, ModuleFigure figureTo){ return defineService.getRulesByLogicalPath(figureFrom.getUniqueName(), figureTo.getUniqueName()).length > 0; } @Override protected RelationFigure getRelationFigureWithViolationsBetween(ModuleFigure figureFrom, ModuleFigure figureTo) { RelationFigure violationFigure = null; if ((figureFrom != null) && (figureTo != null) && !figureFrom.getUniqueName().equals(figureTo.getUniqueName())){ try { ViolationDTO[] violations = getViolationsBetween(figureFrom, figureTo); // DependencyDTO[] dependencies = getDependenciesBetween(figureFrom, figureTo); if (violations != null) { violationFigure = figureFactory.createRelationFigure_RuleViolation(violations); } } catch (Exception e) { logger.error("Could not create a RelationFigure with Violations between given figures. " + e.getMessage()); } } return violationFigure; } @Override protected ViolationDTO[] getViolationsBetween(ModuleFigure figureFrom, ModuleFigure figureTo) { if ((figureFrom != null) && (figureTo != null) && !figureFrom.getUniqueName().equals(figureTo.getUniqueName())){ ViolationDTO[] returnValue = validateService.getViolationsByLogicalPath(figureFrom.getUniqueName(), figureTo.getUniqueName()); return returnValue; } else { return new ViolationDTO[]{}; } } @Override protected String getUniqueNameOfParentModule(String childUniqueName) { String parentUniqueName = defineService.getModule_TheParentOfTheModule(childUniqueName); if (parentUniqueName.equals("**")) { parentUniqueName = ""; } return parentUniqueName; } private void initializeServices() { analyseService = ServiceProvider.getInstance().getAnalyseService(); defineService = ServiceProvider.getInstance().getDefineService(); validateService = ServiceProvider.getInstance().getValidateService(); } }