Esse lance de trabalhar com DSL’s e JBoss Rules é viciante, você vai criando as coisas e a medida que as coisas vão ganhando forma, você percebe uma necessidade nova, foi assim o que aconteceu quando o Raphael “MPC” me explicou a necessidade do cliente dele, pois ele precisava ter expressões que usassem tanto atributos do POJO de regras, como variáveis dinâmicas.
A classe que resolveu nossos problemas usa basicamente expressões regulares (Java RegExp), da mesma forma que podemos usar para IDE’s syntax hightlighters e code-completions, usamos um para RegularExpressionTokenizer para filtrar de um texto o que é um atributo e uma variável.
Usando para convenção que *atributo* está entre (*), e uma variável está entre <>, então vou deixar aqui algumas dicas caso algum leitor queira fazer algo similar:
[java]
/**
* @author Edgar Silva (edgar@summ-tech.com)
* @since 1.0
*/
public class RulesParser {
/**
* RegExp Java for Attributes *atr*
*/
public static final
String patternForAttributes = “\\*(?:.|[\\n\\r])*?\\*”;
/**
* RegExp Java for Vars
*/
public static final
String patternForDynamicVariables = “\\< (?:.|[\\n\\r])*?\\>“;
[/java]
Para caputarar as variáveis de uma expressão:
[java]
public List getVariablesFromExpression(String anExpression) {
// Create the tokenizer
Iterator tokenizer = new RegularExpressionTokenizer(anExpression,
patternForDynamicVariables, false);
List result = new ArrayList();
// Get the tokens (and delimiters)
for (; tokenizer.hasNext();) {
String varFound = (String) tokenizer.next();
result.add(varFound.substring(1, varFound.length() - 1));
}
return result;
}
[/java]
Testando da forma mais simples de toda, a boa velha main():
[java]
public static void main(String[] args) {
List vars = new RulesParser()
.getVariablesFromExpression(”E ai como vai ser “);
for (String string : vars) {
System.out.println(string);
}
}
[/java]
Acredito que isso possa ajudá-lo de alguma forma.
[]’s