package husacct.define.domain.services;
import husacct.ServiceProvider;
import husacct.common.dto.RuleTypeDTO;
import husacct.define.domain.SoftwareArchitecture;
import husacct.define.domain.appliedrule.AppliedRuleFactory;
import husacct.define.domain.appliedrule.AppliedRuleStrategy;
import husacct.define.domain.module.ModuleStrategy;
import java.util.ArrayList;
import java.util.Date;
import org.apache.log4j.Logger;
public class DefaultRuleDomainService {
private ModuleStrategy _module;
private RuleTypeDTO[] defaultRuleTypeDTOs = null;
private ArrayList<AppliedRuleStrategy> defaultRules = new ArrayList<AppliedRuleStrategy>();
private AppliedRuleFactory factory = new AppliedRuleFactory();
public static DefaultRuleDomainService instance;
private final Logger logger = Logger.getLogger(DefaultRuleDomainService.class);
public static DefaultRuleDomainService getInstance() {
return (instance == null) ? instance = new DefaultRuleDomainService()
: instance;
}
public void addDefaultRules(ModuleStrategy newModule) {
_module = newModule;
retrieveRuleTypeDTOsByModule();
generateRules();
saveDefaultRules();
}
private void retrieveRuleTypeDTOsByModule() {
try{
if(!_module.getType().equals("Root")){
String type = _module.getType();
defaultRuleTypeDTOs = ServiceProvider.getInstance().getValidateService().getDefaultRuleTypesOfModule(type);
}
} catch (Exception e) {
this.logger.error(new Date().toString() + " DefaultRuleTypes not retrieved correctly from Validate: " + e );
//e.printStackTrace();
}
}
private void generateRules() {
if (defaultRuleTypeDTOs.length > 0) {
for (RuleTypeDTO rule : defaultRuleTypeDTOs) {
generateRule(rule);
}
}
}
private void generateRule(RuleTypeDTO ruleType) {
AppliedRuleStrategy newRule = factory.createRule(ruleType.getKey());
newRule.setAppliedRule(
"This is a default rule for this type of module.\n"
+ ruleType.getDescriptionKey(), _module, _module);
newRule.setEnabled(true);
defaultRules.add(newRule);
}
private void saveDefaultRules() {
for (AppliedRuleStrategy defaultRule : defaultRules) {
SoftwareArchitecture.getInstance().addAppliedRule(defaultRule);
}
}
public boolean isMandatoryRule(AppliedRuleStrategy rule) {
_module = rule.getModuleFrom();
retrieveRuleTypeDTOsByModule();
for (RuleTypeDTO ruleType : defaultRuleTypeDTOs) {
if (rule.getRuleTypeKey().equals(ruleType.getKey())) {
return true;
}
}
return false;
}
// TODO: Needs to be revised when Validate is working (loop through list
// from the validate service)
public boolean isMandatoryRule(String ruleTypeKey, ModuleStrategy moduleFrom) {
if (ruleTypeKey.equals("IsNotAllowedToMakeSkipCall")
|| ruleTypeKey.equals("IsNotAllowedToMakeBackCall")) {
if (moduleFrom.getType().equals("Layer")) {
return true;
}
} else if (ruleTypeKey.equals("VisibilityConvention")) {
if (moduleFrom.getType().equals("Component")
|| moduleFrom.getType().equals("ExternalLibrary")) {
return true;
}
} else if (ruleTypeKey.equals("FacadeConvention")) {
if (moduleFrom.getType().equals("Component")) {
return true;
}
}
return false;
}
public AppliedRuleStrategy[] generateLayerModuleRules() {
return null;
}
public void removeDefaultRules(ModuleStrategy module) {
_module = module;
retrieveRuleTypeDTOsByModule();
ArrayList<Long> appliedRuleIds = new ArrayList<>();
if (defaultRuleTypeDTOs.length > 0) {
for (RuleTypeDTO rule : defaultRuleTypeDTOs) {
for (AppliedRuleStrategy appliedRule : SoftwareArchitecture.getInstance().getAppliedRules()) {
if (appliedRule.getModuleFrom().getId() == _module.getId() && rule.getKey().equals(appliedRule.getRuleTypeKey())) {
appliedRuleIds.add(appliedRule.getId());
}
}
}
for (long appliedRuleid : appliedRuleIds) {
SoftwareArchitecture.getInstance().removeAppliedRule(appliedRuleid);
}
}
}
public void updateModuleRules(ModuleStrategy updatedModule) {
_module = updatedModule;
for (AppliedRuleStrategy appliedRule : SoftwareArchitecture.getInstance().getAppliedRules()) {
if (appliedRule.getModuleFrom().getId() == _module.getId()) {
appliedRule.setModuleFrom(_module);
}
}
}
}