package husacct.graphics.task;
import java.util.ArrayList;
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.figures.BaseFigure;
import husacct.graphics.domain.figures.ModuleFigure;
import husacct.graphics.domain.figures.RelationFigure;
import husacct.validate.IValidateService;
public class DefinedController extends DrawingController {
protected IAnalyseService analyseService;
protected IDefineService defineService;
protected IValidateService validateService;
public DefinedController() {
super();
initializeServices();
}
@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) {
RelationFigure dependencyFigure = null;
if ((figureFrom != null) && (figureTo != null) && !figureFrom.getUniqueName().equals(figureTo.getUniqueName())){
ArrayList<DependencyDTO> dependencies = new ArrayList<DependencyDTO>();
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);
}
}
try {
if (dependencies.size() > 0) {
dependencyFigure = figureFactory.createRelationFigure_Dependency(dependencies.toArray(new DependencyDTO[] {}));
}
} catch (Exception e) {
logger.error(" Could not create a dependency figure." + e.getMessage());
}
}
return dependencyFigure;
}
@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 boolean hasRelationBetween(ModuleFigure figureFrom, ModuleFigure figureTo){
boolean hasDependencies = false;
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());
DependencyDTO[] foundDependencies;
for (String physicalClassPathFrom : physicalClassPathsFrom){
for (String physicalClassPathTo : physicalClassPathsTo) {
foundDependencies = analyseService.getDependenciesFromClassToClass(physicalClassPathFrom, physicalClassPathTo);
if (foundDependencies.length > 0) {
return true;
} else {
foundDependencies = analyseService.getDependenciesFromClassToClass(physicalClassPathTo, physicalClassPathFrom);
if (foundDependencies.length > 0) {
return true;
}
}
}
}
}
return hasDependencies;
}
@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) && (dependencies != null)) {
violationFigure = figureFactory.createRelationFigure_DependencyWithViolations(dependencies, 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();
}
@Override
protected RuleDTO[] getRulesBetween(BaseFigure figureFrom, BaseFigure figureTo) {
return new RuleDTO[]{};
}
}