[jboss-jira] [JBoss JIRA] Commented: (JBRULES-1262) DSL Parser "eval"
Jörg Harm (JIRA)
jira-events at lists.jboss.org
Tue Oct 6 11:22:49 EDT 2009
[ https://jira.jboss.org/jira/browse/JBRULES-1262?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12488626#action_12488626 ]
Jörg Harm commented on JBRULES-1262:
------------------------------------
Changing in the class DefaultExpander
final Matcher m2 = patternFinder.matcher( expanded[lastPattern] );
to
final ParenthesesMatcher m2 = new ParenthesesMatcher( expanded[lastPattern] );
with the ParenthesesMatcher being
private static class ParenthesesMatcher implements MatchResult {
private final String input;
int start = -1;
int end = -1;
public ParenthesesMatcher(String input) {
this.input = input;
}
public boolean find() {
start = input.indexOf('(', end + 1);
if (start >= 0) {
char stringDelimiter = 0;
for (int i = start + 1, count = 1; i < input.length()
&& count > 0; i++) {
if (stringDelimiter == 0) {
final char ch = input.charAt(i);
switch (ch) {
case '(':
count++;
break;
case ')':
count--;
if (count == 0) {
end = i;
}
break;
case '\'':
case '"':
stringDelimiter = ch;
default:
break;
}
} else {
if (input.charAt(i) == stringDelimiter
&& input.charAt(i - 1) != '\\') {
stringDelimiter = 0;
}
}
}
}
return 0 <= start && start < end;
}
public int start() {
return start(0);
}
public int start(int group) {
checkMatched();
checkGroup(group);
return startUnchecked(group);
}
private int startUnchecked(int group) {
return start + group;
}
public int end() {
return end(0);
}
public int end(int group) {
checkMatched();
checkGroup(group);
return endUnchecked(group);
}
private int endUnchecked(int group) {
return end + 1 - group;
}
public String group() {
return group(0);
}
public String group(int group) {
checkMatched();
checkGroup(group);
return input.substring(startUnchecked(group), endUnchecked(group));
}
public int groupCount() {
return 1;
}
private void checkGroup(int group) {
if (group > groupCount()) {
throw new IndexOutOfBoundsException("No group " + group);
}
}
private void checkMatched() {
if (0 > start || start >= end) {
throw new IllegalStateException("No match found");
}
}
}
"eval" can be used even if there parentheses in string literals somewhere. With this change the builds works and shows no failures.
> DSL Parser "eval"
> -----------------
>
> Key: JBRULES-1262
> URL: https://jira.jboss.org/jira/browse/JBRULES-1262
> Project: Drools
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Components: drools-compiler-DSL
> Affects Versions: 4.0.1
> Reporter: M H
> Assignee: Edson Tirelli
> Priority: Minor
> Fix For: FUTURE
>
>
> [when]of type Item=Item()
> [when]- Title equals "{value}"=eval(title.isEqual("{value}")
> [when]- Event equals "{value}"=eval(id.isEqual("{value}")
> [then]Log : "{message}"=System.out.println("{message}");
> the dslr File:
> expander Test.dsl
> rule "Your First Rule"
> when
> $p : of type Item
> - Title equals "test"
> - Event equals "test"
> then
> #actions
> end
> resolves to (could be seen in the drl viewer)
> rule "Your First Rule"
> when
> $p :Item( eval(title.isEqual("test", eval(id.isEqual("test") ) )
> then
> #actions
> end
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list