package husacct.validate.domain.configuration;
import husacct.ServiceProvider;
import husacct.analyse.IAnalyseService;
import husacct.validate.domain.exception.KeyNotFoundException;
import husacct.validate.domain.exception.ProgrammingLanguageNotFoundException;
import husacct.validate.domain.exception.SeverityNotFoundException;
import husacct.validate.domain.factory.ruletype.RuleTypesFactory;
import husacct.validate.domain.factory.violationtype.AbstractViolationType;
import husacct.validate.domain.factory.violationtype.ViolationTypeFactory;
import husacct.validate.domain.validation.Severity;
import husacct.validate.domain.validation.ViolationType;
import husacct.validate.domain.validation.ruletype.RuleType;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import org.apache.log4j.Logger;
public class SeverityPerTypeRepository {
private Logger logger = Logger.getLogger(SeverityPerTypeRepository.class);
private final IAnalyseService analyseService = ServiceProvider.getInstance().getAnalyseService();
private final RuleTypesFactory ruletypeFactory;
private final ConfigurationServiceImpl configuration;
private HashMap<String, HashMap<String, Severity>> severitiesPerTypePerProgrammingLanguage;
private HashMap<String, HashMap<String, Severity>> defaultSeveritiesPerTypePerProgrammingLanguage;
private AbstractViolationType violationtypefactory;
public SeverityPerTypeRepository(RuleTypesFactory ruletypefactory, ConfigurationServiceImpl configuration) {
this.configuration = configuration;
this.ruletypeFactory = ruletypefactory;
severitiesPerTypePerProgrammingLanguage = new HashMap<String, HashMap<String, Severity>>();
defaultSeveritiesPerTypePerProgrammingLanguage = new HashMap<String, HashMap<String, Severity>>();
}
void initializeDefaultSeverities() {
for (String programmingLanguage : analyseService.getAvailableLanguages()) {
severitiesPerTypePerProgrammingLanguage.putAll(initializeDefaultSeverityForLanguage(programmingLanguage));
defaultSeveritiesPerTypePerProgrammingLanguage.putAll(initializeDefaultSeverityForLanguage(programmingLanguage));
}
}
private HashMap<String, HashMap<String, Severity>> initializeDefaultSeverityForLanguage(String programmingLanguage) {
HashMap<String, HashMap<String, Severity>> severitiesPerTypePerProgrammingLanguage = new HashMap<String, HashMap<String, Severity>>();
severitiesPerTypePerProgrammingLanguage.put(programmingLanguage, new HashMap<String, Severity>());
HashMap<String, Severity> severityPerType = severitiesPerTypePerProgrammingLanguage.get(programmingLanguage);
for (RuleType ruleType : ruletypeFactory.getRuleTypes()) {
severityPerType.put(ruleType.getKey(), ruleType.getSeverity());
for (RuleType exceptionRuleType : ruleType.getExceptionRules()) {
if (severityPerType.get(exceptionRuleType.getKey()) == null) {
severityPerType.put(exceptionRuleType.getKey(), exceptionRuleType.getSeverity());
}
}
}
this.violationtypefactory = new ViolationTypeFactory().getViolationTypeFactory(programmingLanguage, configuration);
if (violationtypefactory != null) {
for (Entry<String, List<ViolationType>> violationTypeCategory : violationtypefactory.getAllViolationTypes().entrySet()) {
for (ViolationType violationType : violationTypeCategory.getValue()) {
severityPerType.put(violationType.getViolationTypeKey(), violationType.getSeverity());
}
}
} else {
logger.debug("Warning no language specified in define component");
}
return severitiesPerTypePerProgrammingLanguage;
}
HashMap<String, HashMap<String, Severity>> getSeveritiesPerTypePerProgrammingLanguage() {
return severitiesPerTypePerProgrammingLanguage;
}
Severity getSeverity(String language, String key) {
HashMap<String, Severity> severityPerType = severitiesPerTypePerProgrammingLanguage.get(language);
if (severityPerType == null) {
throw new SeverityNotFoundException();
} else {
Severity severity = severityPerType.get(key);
if (severity == null) {
throw new SeverityNotFoundException();
} else {
return severity;
}
}
}
void restoreKeyToDefaultSeverity(String language, String key) {
HashMap<String, Severity> severitiesPerType = severitiesPerTypePerProgrammingLanguage.get(language);
// if there is no value, automatically the default severities will be
// applied
if (severitiesPerType != null) {
Severity oldSeverity = severitiesPerType.get(key);
if (oldSeverity != null) {
Severity defaultSeverity = getDefaultRuleKey(language, key);
if (defaultSeverity != null) {
severitiesPerType.remove(key);
severitiesPerType.put(key, defaultSeverity);
}
}
}
}
private Severity getDefaultRuleKey(String language, String key) {
HashMap<String, Severity> severityPerType = defaultSeveritiesPerTypePerProgrammingLanguage.get(language);
if (severityPerType == null) {
throw new SeverityNotFoundException();
} else {
Severity severity = severityPerType.get(key);
if (severity == null) {
throw new SeverityNotFoundException();
} else {
return severity;
}
}
}
void restoreAllKeysToDefaultSeverities(String programmingLanguage) {
initializeDefaultSeverityForLanguage(programmingLanguage);
}
void setSeverityMap(HashMap<String, HashMap<String, Severity>> severitiesPerTypePerProgrammingLanguage) {
for (String programmingLanguage : severitiesPerTypePerProgrammingLanguage.keySet()) {
if (!programmingLanguageExists(programmingLanguage)) {
throw new ProgrammingLanguageNotFoundException(programmingLanguage);
} else {
for (Entry<String, Severity> keySeverity : severitiesPerTypePerProgrammingLanguage.get(programmingLanguage).entrySet()) {
if (isValidKey(programmingLanguage, keySeverity.getKey())) {
keySeverity.setValue(isValidSeverity(keySeverity.getValue()));
} else {
throw new KeyNotFoundException(keySeverity.getKey());
}
}
}
}
this.severitiesPerTypePerProgrammingLanguage = severitiesPerTypePerProgrammingLanguage;
}
void setSeverityMap(String programmingLanguage, HashMap<String, Severity> severityMap) {
HashMap<String, Severity> local = severitiesPerTypePerProgrammingLanguage.get(programmingLanguage);
if (local != null && programmingLanguageExists(programmingLanguage)) {
for (Entry<String, Severity> entry : severityMap.entrySet()) {
try {
Severity severity = isValidSeverity(entry.getValue());
if (isValidKey(programmingLanguage, entry.getKey())) {
local.remove(entry.getKey());
local.put(entry.getKey(), severity);
}
} catch (SeverityNotFoundException e) {
logger.warn(String.format("%s is not a know severity, %s will not be set in SeverityPerTypeRepository", entry.getValue().getSeverityKey(), entry.getKey()));
} catch (NullPointerException e) {
logger.error("Cannot severity cannot be null in SeverityPerTypeRepository");
}
}
} else {
throw new ProgrammingLanguageNotFoundException(programmingLanguage);
}
}
private boolean isValidKey(String programmingLanguage, String key) {
if (programmingLanguageExists(programmingLanguage)) {
for (String defaultKey : defaultSeveritiesPerTypePerProgrammingLanguage.get(programmingLanguage).keySet()) {
if (defaultKey.toLowerCase().equals(key.toLowerCase())) {
return true;
}
}
} else {
throw new ProgrammingLanguageNotFoundException(programmingLanguage);
}
return false;
}
private boolean programmingLanguageExists(String programmingLanguage) {
HashMap<String, Severity> local = defaultSeveritiesPerTypePerProgrammingLanguage.get(programmingLanguage);
if (local != null) {
return true;
} else {
return false;
}
}
private Severity isValidSeverity(Severity severity) {
for (Severity currentSeverity : configuration.getAllSeverities()) {
if (severity == currentSeverity) {
return severity;
}
}
Severity newSeverity = configuration.getSeverityByName(severity.getSeverityKey());
if (newSeverity != null) {
return newSeverity;
}
throw new SeverityNotFoundException();
}
}