package husacct.validate.domain.assembler;
import husacct.ServiceProvider;
import husacct.common.dto.RuleDTO;
import husacct.common.locale.ILocaleService;
import husacct.define.IDefineService;
import husacct.validate.domain.validation.Violation;
import husacct.validate.domain.validation.ruletype.RuleTypes;
import java.util.Arrays;
import java.util.IllegalFormatException;
import java.util.List;
import org.apache.log4j.Logger;
public class MessageTextAssembler {
private ILocaleService localeService = ServiceProvider.getInstance().getLocaleService();
private Logger logger = Logger.getLogger(MessageTextAssembler.class);
private final String whiteSpace = " ";
/**
* Creates message for the given rule + message for exception-rules included in the given rule
* @param violation
* @return
*/
public String createMessageText(Violation violation) {
String messageText = "";
RuleDTO rule = getRule(violation);
if (rule != null) {
messageText = generateCompleteMessageText(rule);
}
return messageText;
}
/**
* Generates message for the given rule only, not for exception-rules included in the given rule
* @param violation
* @return
*/
public String createMessageTextOfMainRule(Violation violation) {
String messageText = "";
RuleDTO rule = getRule(violation);
if (rule != null) {
messageText = generateMessageTextForRule(rule);
}
return messageText;
}
private RuleDTO getRule(Violation violation) {
RuleDTO rule = null;
String fromModule = violation.getLogicalModules().getLogicalModuleFrom().getLogicalModulePath();
String toModule = violation.getLogicalModules().getLogicalModuleTo().getLogicalModulePath();
String ruleTypeKey = violation.getRuletypeKey();
IDefineService defineService = ServiceProvider.getInstance().getDefineService();
rule = defineService.getMainRuleBy_From_To_RuleTypeKey(fromModule, toModule, ruleTypeKey);
return rule;
}
private String generateCompleteMessageText(RuleDTO rule) {
String messageText = generateMessageTextForRule(rule);
int i = 1;
for (RuleDTO exception : rule.exceptionRules) {
if (i == 0) {
messageText += generateFirstExceptionMessage(exception);
} else {
messageText += generateRestExceptionMessage(exception);
}
i ++;
}
return messageText;
}
private String generateMessageTextForRule(RuleDTO rule) {
final String left = generateFromModuleText(rule);
final String right = generateToModuleText(rule);
final String textFormat = getTextFormat(rule.ruleTypeKey);
return formatMessageText(textFormat, left, right);
}
private String generateFromModuleText(RuleDTO rule) {
final String logicalModuleFromPath = rule.moduleFrom.logicalPath;
final String logicalModuleFromType = rule.moduleFrom.type;
return appendStrings(logicalModuleFromType, logicalModuleFromPath);
}
private String generateToModuleText(RuleDTO rule) {
if ((rule.ruleTypeKey.toLowerCase().equals(RuleTypes.FACADE_CONVENTION.toString().toLowerCase())) ||
(rule.ruleTypeKey.toLowerCase().equals(RuleTypes.IS_NOT_ALLOWED_BACK_CALL.toString().toLowerCase())) ||
(rule.ruleTypeKey.toLowerCase().equals(RuleTypes.IS_NOT_ALLOWED_SKIP_CALL.toString().toLowerCase()))) {
return "";
} else
if (rule.ruleTypeKey.toLowerCase().equals(RuleTypes.NAMING_CONVENTION.toString().toLowerCase())) {
return generateNamingConventionMessage(rule);
} else if (rule.ruleTypeKey.toLowerCase().equals(RuleTypes.VISIBILITY_CONVENTION.toString().toLowerCase())) {
return generateVisibilityConventionMessage(rule);
} else {
final String logicalModuleToPath = rule.moduleTo.logicalPath;
final String logicalModuleToType = rule.moduleTo.type;
return appendStrings(logicalModuleToType, logicalModuleToPath);
}
}
private String generateNamingConventionMessage(RuleDTO rule) {
return rule.regex;
}
private String generateVisibilityConventionMessage(RuleDTO rule) {
List<String> violationTypeKeys = Arrays.asList(rule.violationTypeKeys);
StringBuilder sb = new StringBuilder();
String seperationCharacter = ", ";
for (int iterator = 0; iterator < violationTypeKeys.size(); iterator++) {
sb.append(violationTypeKeys.get(iterator));
if (iterator != violationTypeKeys.size() - 1) {
if (iterator == violationTypeKeys.size() - 2) {
sb.append(whiteSpace);
sb.append(localeService.getTranslatedString("OrMessage"));
sb.append(whiteSpace);
} else {
sb.append(seperationCharacter);
}
}
}
return sb.toString();
}
private String appendStrings(String left, String right) {
return String.format("%s %s", left, right);
}
private String getTextFormat(String ruleTypeKey) {
try {
final String ruleTextKey = String.format("%sMessage", ruleTypeKey);
return localeService.getTranslatedString(ruleTextKey);
} catch (IllegalFormatException e) {
logger.error(e.getMessage(), e);
}
return "";
}
private String formatMessageText(String textFormat, String left, String right) {
try {
return String.format(textFormat, left, right);
} catch (IllegalFormatException e) {
logger.error(e.getMessage(), e);
}
return "";
}
private String generateFirstExceptionMessage(RuleDTO exceptionRule) {
StringBuilder sb = new StringBuilder();
try {
sb.append(whiteSpace);
sb.append(localeService.getTranslatedString("ExceptionMessage"));
sb.append(whiteSpace);
final String exceptionKey = sb.toString();
return exceptionKey + generateMessageTextForRule(exceptionRule);
} catch (IllegalFormatException e) {
logger.error(e.getMessage(), e);
}
return "";
}
private String generateRestExceptionMessage(RuleDTO exceptionRule) {
StringBuilder sb = new StringBuilder();
try {
sb.append(whiteSpace);
sb.append(localeService.getTranslatedString("EnumerationMessage"));
sb.append(whiteSpace);
final String exceptionKey = sb.toString();
return exceptionKey + generateMessageTextForRule(exceptionRule);
} catch (IllegalFormatException e) {
logger.error(e.getMessage(), e);
}
return "";
}
}