I have a typical use case where i am consuming to a message broker. The messages are <^> delimited strings. I parse each and every message create POJO's and then apply different validations to understand if the message is useful for further processing. We call these validations as filters.
These filters are dynamically created by the users of the applications and these filters needs to be dynamically applied to the incoming messages.
As of now i am validating the messages using IF-ELSE loops. But, I would like to check if there are any design patterns which are already making this problem statement elegant.
A typical filter has a FilterCriteria which talks about the Conditions which needs to be checked against a message.
Code:
// load filters for a given party and apply on the rawSyslogMessage.
private boolean applyFilter(RawSyslogMessage message) throws EntityNotFoundException {
boolean isDropped = false;
logger.info("---applyFilter()::rawSyslog :" + message);
String partyID = message.getPartyID();
// load all filters for the given party
List<Filter> filters = filterService.getAll(partyID);
if (filters != null) {
for (Filter filter : filters) {
FilterCriteria filterCriteria = filter.getFilterCriteria();
String field = filterCriteria.getField();
String condition = filterCriteria.getCondition();
String action = filterCriteria.getAction();
// FILTER. Consider applying all fitlers on a message.
if (filter.getName().toUpperCase().equals("PRIORITY") && action.toUpperCase().equals("ALLOW")) {
if (condition.toUpperCase().equals("GREATER")) {
if (Long.toString(message.getSeverity()).equals(field)) {
logger.info("The message is dropped");
isDropped = true;
} else if (message.getSeverity() < Long.parseLong(field)) {
logger.info("The message is dropped");
isDropped = true;
} else {
logger.info("The message is sent for correlation");
}
} else if (condition.toUpperCase().equals("LESSER")) {
if (Long.toString(message.getSeverity()).equals(field)) {
logger.info("The message is dropped");
isDropped = true;
} else if (message.getSeverity() < Long.parseLong(field)) {
logger.info("The message is sent for correlation");
} else {
logger.info("The message is dropped");
isDropped = true;
}
} else if (condition.toUpperCase().equals("EQUALS")) {
if (Long.toString(message.getSeverity()).equals(field)) {
logger.info("The message is sent for correlation");
} else if (message.getSeverity() < Long.parseLong(field)) {
logger.info("The message is dropped");
isDropped = true;
} else {
logger.info("The message is dropped");
isDropped = true;
}
} else if (condition.toUpperCase().equals("BETWEEN")) {
String[] range = field.split("TO");
String _left = range[0];
String _right = range[1];
if (message.getSeverity() >= Integer.parseInt(_left)
&& message.getSeverity() <= Integer.parseInt(_right)) {
logger.info("The message is sent for correlation");
} else {
logger.info("The message is dropped");
isDropped = true;
}
}
} else if (filter.getName().toUpperCase().equals("PRIORITY")
&& action.toUpperCase().equals("DISCARD")) {
if (condition.toUpperCase().equals("GREATER")) {
if (Long.toString(message.getSeverity()).equals(field)) {
logger.info("The message is sent for correlation");
} else if (message.getSeverity() < Long.parseLong(field)) {
logger.info("The message is sent for correlation");
} else {
logger.info("The message is dropped");
isDropped = true;
}
} else if (condition.toUpperCase().equals("LESSER")) {
if (Long.toString(message.getSeverity()).equals(field)) {
logger.info("The message is sent for correlation");
} else if (message.getSeverity() < Long.parseLong(field)) {
logger.info("The message is dropped");
isDropped = true;
} else {
logger.info("The message is sent for correlation");
}
} else if (condition.toUpperCase().equals("EQUALS")) {
if (Long.toString(message.getSeverity()).equals(field)) {
logger.info("The message is dropped");
isDropped = true;
} else if (message.getSeverity() < Long.parseLong(field)) {
logger.info("The message is sent for correlation");
} else {
logger.info("The message is sent for correlation");
}
} else if (condition.toUpperCase().equals("BETWEEN")) {
String[] range = field.split("TO");
String _left = range[0];
String _right = range[1];
if (message.getSeverity() >= Integer.parseInt(_left)
&& message.getSeverity() <= Integer.parseInt(_right)) {
logger.info("The message is dropped");
isDropped = true;
} else {
logger.info("The message is sent for correlation");
}
}
}
}
}
return isDropped;
}
I have referred through the
https://en.wikipedia.org/wiki/Specification_pattern (as suggested in Style for control flow with validation checks)
https://en.wikipedia.org/wiki/Strategy_pattern
https://en.wikipedia.org/wiki/Command_pattern
But, none of these seem to be fitting my requirements. Please help.