package husacct.define;
import husacct.ServiceProvider;
import husacct.common.dto.CategoryDTO;
import husacct.common.dto.ModuleDTO;
import husacct.common.dto.RuleTypeDTO;
import husacct.common.dto.SoftwareUnitDTO;
import husacct.common.dto.ViolationTypeDTO;
import husacct.define.domain.appliedrule.AppliedRuleStrategy;
import husacct.define.domain.module.ModuleStrategy;
import husacct.define.domain.services.AppliedRuleDomainService;
import husacct.define.domain.services.ModuleDomainService;
import husacct.validate.IValidateService;
import java.util.ArrayList;
import org.apache.log4j.Logger;
// Services for SAR: Software Architecture Reconstruction
public class DefineSarServiceImpl implements IDefineSarService {
private DefineServiceImpl defineService;
private AppliedRuleDomainService appliedRuleService;
private DomainToDtoParser domainParser;
private ModuleDomainService moduleService;
private Logger logger = Logger.getLogger(DefineSarServiceImpl.class);
private long moduleIdOfModuleToSelectInUI = 0;
public DefineSarServiceImpl(DefineServiceImpl defineService) {
this.defineService = defineService;
reset();
}
protected void reset() {
appliedRuleService = new AppliedRuleDomainService();
domainParser = new DomainToDtoParser();
moduleService = new ModuleDomainService();
}
@Override
public ModuleDTO addModule(String name, String parentLogicalPath, String moduleType, int hierarchicalLevel, ArrayList<SoftwareUnitDTO> softwareUnits) {
ModuleDTO newModuleDTO = new ModuleDTO();
try {
ModuleStrategy newModule = moduleService.addModule(name, parentLogicalPath, moduleType, hierarchicalLevel, softwareUnits);
if (newModule != null) {
newModuleDTO = domainParser.parseModule(newModule);
moduleIdOfModuleToSelectInUI = newModule.getparent().getId();
}
} catch (Exception e) {
this.logger.warn(" Exception: " + e );
}
return newModuleDTO;
}
@Override
public ModuleDTO editModule(String logicalPath, String newType, String newName, int newHierarchicalLevel, ArrayList<SoftwareUnitDTO> newSoftwareUnits) {
ModuleDTO editedModuleDTO = new ModuleDTO();
try {
ModuleStrategy editedModule = moduleService.editModule(logicalPath, newType, newName, newHierarchicalLevel, newSoftwareUnits);
if (editedModule != null) {
editedModuleDTO = domainParser.parseModule(editedModule);
long newSelectedModuleId = editedModule.getId();
if (newSelectedModuleId > 0) {
newSelectedModuleId = editedModule.getparent().getId();
moduleIdOfModuleToSelectInUI = newSelectedModuleId;
}
}
} catch (Exception e) {
this.logger.warn(" Exception: " + e );
}
return editedModuleDTO;
}
@Override
public void removeModule(String logicalPath) {
try {
ModuleStrategy moduleToBeRemoved = moduleService.getModuleByLogicalPath(logicalPath);
if ((moduleToBeRemoved != null) && (moduleToBeRemoved.getId() >= 0)) {
moduleIdOfModuleToSelectInUI = moduleToBeRemoved.getparent().getId();
moduleService.removeModuleById(moduleToBeRemoved.getId());
}
} catch (Exception e) {
this.logger.warn(" Exception: " + e );
}
}
@Override
public boolean addMainRule(String moduleFromLogicalPath, String moduleTologicalPath, String ruleTypeKey) {
boolean ruleAdded = false;
try {
appliedRuleService = new AppliedRuleDomainService();
moduleService = new ModuleDomainService();
RuleTypeDTO ruletype = getRuleType(ruleTypeKey);
if (ruletype != null) {
String[] violationTypes = new String[ruletype.getViolationTypes().length];
int id = 0;
for (ViolationTypeDTO v : ruletype.getViolationTypes()){
violationTypes[id]= v.key;
id ++;
}
long ruleId = appliedRuleService.addAppliedRule(ruleTypeKey, "", violationTypes, "", moduleService.getModuleByLogicalPath(moduleFromLogicalPath),
moduleService.getModuleByLogicalPath(moduleTologicalPath), true, false, null);
if (ruleId >= 0) {
ruleAdded = true;
} else {
this.logger.warn(" Rule not added (from, to, ruleTypeKey): " + moduleFromLogicalPath + ", " + moduleTologicalPath + ", " + ruleTypeKey);
}
} else {
this.logger.warn(" RuleTypeKey not found: " + ruleTypeKey);
}
} catch (Exception e) {
this.logger.warn(" Exception: " + e );
}
return ruleAdded;
}
@Override
public boolean editRule_IsEnabled(String moduleFromLogicalPath, String moduleTologicalPath, String ruleTypeKey, boolean isEnabled) {
boolean ruleEdited = false;
try {
appliedRuleService = new AppliedRuleDomainService();
AppliedRuleStrategy foundRule = appliedRuleService.getAppliedMainRuleBy_From_To_RuleTypeKey(moduleFromLogicalPath, moduleTologicalPath, ruleTypeKey);
if (foundRule != null) {
appliedRuleService.updateAppliedRule(foundRule.getId(), foundRule.getRuleTypeKey(), foundRule.getDescription(), foundRule.getDependencyTypes(),
foundRule.getRegex(), foundRule.getModuleFrom(), foundRule.getModuleTo(), isEnabled);
ruleEdited = true;
} else {
this.logger.warn(" Rule not added (from, to, ruleTypeKey): " + moduleFromLogicalPath + ", " + moduleTologicalPath + ", " + ruleTypeKey);
}
} catch (Exception e) {
this.logger.warn(" Exception: " + e );
}
return ruleEdited;
}
@Override
public ModuleDTO getModule_SelectedInGUI() {
ModuleDTO selectedModuleDTO = new ModuleDTO();
ModuleStrategy selectedModuleStrategy;
try {
long selectedModuleId = defineService.getDefinitionController().getSelectedModuleId();
if (selectedModuleId >= 0) {
selectedModuleStrategy = moduleService.getModuleById(selectedModuleId);
if (selectedModuleStrategy != null) {
selectedModuleDTO = domainParser.parseModule(selectedModuleStrategy);
}
}
} catch (Exception e) {
this.logger.warn(" Exception: " + e );
}
return selectedModuleDTO;
}
@Override
public void updateModulePanel(String selectedModuleLogicalPath) {
ModuleStrategy module;
try {
if ((selectedModuleLogicalPath != null) && !selectedModuleLogicalPath.equals("")) {
module = moduleService.getModuleByLogicalPath(selectedModuleLogicalPath);
if (module.getId() >= 0) {
defineService.getDefinitionController().setSelectedModuleId(module.getId());
}
} else if (moduleIdOfModuleToSelectInUI > 0) {
defineService.getDefinitionController().setSelectedModuleId(moduleIdOfModuleToSelectInUI);
}
defineService.getDefinitionController().getDefineInternalFrame().addNewDefinitionPanel();
} catch (Exception e) {
this.logger.info(" Exception: " + e );
}
}
private RuleTypeDTO getRuleType(String ruleTypeKey) {
RuleTypeDTO returnValue = null;
IValidateService validateService = ServiceProvider.getInstance().getValidateService();
CategoryDTO[] categories = validateService.getCategories();
for (CategoryDTO category : categories) {
for (RuleTypeDTO ruletype : category.getRuleTypes()) {
if (ruletype.getKey().equals(ruleTypeKey)) {
return ruletype;
}
}
}
return returnValue;
}
}