Ho un tipico caso d'uso in cui sto consumando un broker di messaggi. I messaggi sono < ^ > stringhe delimitate. Analizzo ogni singolo messaggio creando POJO e quindi applicando diverse convalide per capire se il messaggio è utile per ulteriori elaborazioni. Chiamiamo queste convalide come filtri.
Questi filtri sono creati dinamicamente dagli utenti delle applicazioni e questi filtri devono essere applicati dinamicamente ai messaggi in arrivo.
A partire da ora sto convalidando i messaggi usando i loop di IF-ELSE. Ma, vorrei verificare se ci sono schemi di progettazione che stanno già rendendo elegante questa affermazione problematica.
Un filtro tipico ha una FilterCriteria che parla delle Condizioni che devono essere verificate rispetto a un messaggio.
Codice:
// 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;
}
Ho fatto riferimento a
link (come suggerito in Stile per il controllo del flusso con controlli di validazione )
Ma nessuno di questi sembra corrispondere alle mie esigenze. Per favore aiuto.