[rules-users] Cannot invoke method because of ArrayIndexOutOfBoundsException

Bojan Janisch bojan.janisch at scai.fraunhofer.de
Wed Mar 6 11:44:25 EST 2013


But that's exactly what java is doing if you say the Arguments are method(X... xs). 
Java is then generating an array of the type you set and you can work with xs like an 
normal array. By the way, seems I get this Error

Unable to Analyse Expression isEqual(new Annotation[]{$a3,$a4,$a5})
[Error: could not instantiate class]
[Near : {... isEqual(new Annotation[]{$a3,$a4,$a5}) ....}]
                                     ^
[Line: 129, Column: 8]


The changed method is:

public static boolean isEqual(Annotation[] a){
	ArrayList<Annotation> outLoop = new ArrayList<Annotation>(Arrays.asList(a));
	ArrayList<Annotation> inLoop = new ArrayList<Annotation>(Arrays.asList(a));
	
	for (Annotation anno1 : outLoop) {
		inLoop.remove(anno1);
		for (Annotation anno2 : inLoop) {
			if(isEqual(anno1,anno2)){
				return true;
			}
		}
	}
	
	return false;
}

----- Ursprüngliche Mail -----
Von: "Wolfgang Laun" <wolfgang.laun at gmail.com>
An: "Rules Users List" <rules-users at lists.jboss.org>
Gesendet: Mittwoch, 6. März 2013 17:11:43
Betreff: Re: [rules-users] Cannot invoke method because of	ArrayIndexOutOfBoundsException

I wouldn't use (X... xs) in this context.

Try the simple modification of isEqual( Annotation[] annos ) and
call it with isEqual( new Annotation[]{$a3,$a4,$a5})
and we'll see what we'll see.

-W


On 06/03/2013, Bojan Janisch <bojan.janisch at scai.fraunhofer.de> wrote:
> Like you wish wolfgang. The complete Rule is:
>
> rule "Generate Finding_ConceptId"
> no-loop
>     when
>        	$a1:ODMAnswer(
>         q1:QuestionId,
>         q1.toLowerCase.contains("diagnose") ||
>         q1.toLowerCase.contains("indication"),
>         q1.toLowerCase.contains("sections"),
>         a1_begin:begin,
>         label1:ResponseAttribute)
>
>         $a2:ODMAnswer(
>        	ResponseAttribute.contains(label1),
>         QuestionId.contains("sectionheader"),
>         comesBefore($a1,$a2));
>
>         $a3:ODMAnswer(
>         q3:QuestionId,
>         !q3.contains("finding.conceptId"),
>         !q3.contains("itemGroup"),
>         !q3.contains("section"),
>         a3_begin:begin,
>         a3_end:end,
>         label2:ResponseAttribute,
>         isInAnnotation($a1,$a3))
>
>         $a4:ODMAnswer(
>         q4:QuestionId.contains("finding.conceptId"),
>         a4_begin:begin,
>         comesAfter($a2,$a4),
>         isBetween($a2,$a3,$a4),
>         isInAnnotation($a1,$a4))
>
>         not $a5:ODMAnswer(
>         isInAnnotation($a1,$a5),
>         isBigger($a3,$a5),
>        	!isEqual($a3,$a4,$a5))           	
>     then
>         String questionId = "finding.conceptId";
>     	String attribute = label1 +" "+ label2;
>     	int begin = a4_begin;
>     	int ende = a3_end;
>     	boolean addToIndexes = true;
>     	
>     	
>     	insert(annotate(aJCas, questionId, attribute, begin, ende,
> addToIndexes));
> end
>
> The functions are in a seperate FactChecker class, because the
> "incode-comparison"
> was too much of a chaos. So I wrote functions which explains themselves what
> they do:
> ==================================================================
> public static boolean isInAnnotation(Annotation a, Annotation b){
> 	if(isNull(a,b)){
> 		return false;
> 	}
> 	if(b.getBegin() > a.getBegin() && b.getEnd() < a.getEnd()){
> 		return true;
> 	}
> 	if(a.getBegin() > b.getBegin() && a.getEnd() < b.getEnd()){
> 		return true;
> 	}
> 	return false;
> }
> ==================================================================
> public static boolean isInAnnotation(Annotation... a){
> 	for (int i = 0; i < a.length; i++){
> 		if(i+1 == a.length){
> 			return false;
> 		}
> 		if(isInAnnotation(a[i], a[i+1])){
> 			return true;
> 		}
> 	}
> 	
> 	return false;
> }
> ==================================================================
> public static boolean comesBefore(Annotation a, Annotation b){
> 	if(isNull(a,b)){
> 		return false;
> 	}
> 	if(b.getEnd() <= a.getBegin()){
> 		return true;
> 	}
>
> 	return false;
> }
> ==================================================================
> public static boolean comesAfter(Annotation a, Annotation b){
> 	if(isNull(a,b)){
> 		return false;
> 	}
> 	if(a.getEnd() <= b.getBegin()){
> 		return true;
> 	}
>
> 	return false;
> }
> ==================================================================
> public static boolean isEqual(Annotation a, Annotation b){
> 	if(isNull(a,b)){
> 		return false;
> 	}
> 	if(a.equals(b)){
> 		return true;
> 	}
> 	
> 	return false;
> }
> ==================================================================
> public static boolean isEqual(Annotation... a){
> 	ArrayList<Annotation> outLoop = new
> ArrayList<Annotation>(Arrays.asList(a));
> 	ArrayList<Annotation> inLoop = new ArrayList<Annotation>(Arrays.asList(a));
> 	
> 	for (Annotation anno1 : outLoop) {
> 		if(anno1 == null){
> 			
> 		}
> 		inLoop.remove(anno1);
> 		for (Annotation anno2 : inLoop) {
> 			if(isEqual(anno1,anno2)){
> 				return true;
> 			}
> 		}
> 	}
> 	
> 	return false;
> }
> ==================================================================
> public static boolean isNull(Annotation... a){
> 	for (Annotation annotation : a) {
> 		if(annotation == null){
> 			return true;
> 		}
> 	}
>
> 	return false;
> }
> ==================================================================
> public static boolean isBigger(Annotation a, Annotation b){
> 	if(isNull(a,b)){
> 		return false;
> 	}
> 	if(a.getBegin() == b.getBegin() && a.getEnd() < b.getEnd()){
> 		return true;
> 	}		
> 	if(b.getBegin() < a.getBegin() && a.getEnd() == b.getEnd()){
> 		return true;
> 	}
> 	if(b.getBegin() < a.getBegin() && a.getEnd() < b.getEnd()){
> 		return true;
> 	}
> 	
> 	return false;
> }
> ==================================================================
> public static boolean isBetween(Annotation a, Annotation b, Annotation c){
> 	if(isNull(a,b,c)){
> 		return false;
> 	}
> 	Annotation min = getMin(a,b);
> 	Annotation max = getMax(a,b);
> 	
> 	if(isOverlapping(a,c) || isOverlapping(b,c)){
> 		return true;
> 	}
> 	
> 	if(c.getBegin() > min.getEnd() && c.getEnd() < max.getBegin()){
> 		return true;
> 	}
>
> 	return false;	
> }
> ==================================================================
> public static Annotation getMax(Annotation a, Annotation b){
> 	isNull(a,b);
> 	if(a.getBegin() >= b.getBegin()){
> 		return a;
> 	}
> 	
> 	return b;
> }
> ==================================================================
> public static Annotation getMin(Annotation a, Annotation b){
> 	isNull(a,b);
> 	if(a.getEnd() <= b.getEnd()){
> 		return a;
> 	}
> 	
> 	return b;
> }
> ==================================================================
>
> I've posted all functions that are used by the rule. Actually it crushes
> if I use more than 2 statements in the isEqual() call in $a5.
> It works with !isEqual($a3,$a4) && !isEqual($a3,$a5) && !isEqual($a4,$a5)
> but not with !isEqual($a3,$a4,$a5).
>
> So do you got an idea where the problem comes from?
>
> JB
>
>
> ----- Ursprüngliche Mail -----
> Von: "Wolfgang Laun" <wolfgang.laun at gmail.com>
> An: "Rules Users List" <rules-users at lists.jboss.org>
> Gesendet: Mittwoch, 6. März 2013 15:09:47
> Betreff: Re: [rules-users] Cannot invoke method because
> of	ArrayIndexOutOfBoundsException
>
> Nice try - but, please, don't. Kindly post the code that actually
> causes your problem.
>
> -W
>
>
> On 06/03/2013, Bojan Janisch <bojan.janisch at scai.fraunhofer.de> wrote:
>> Hello Guys,
>>
>> sorry to bother you with this problem, but I'm out of ideas.
>> I'm using Drools in textmining-context and in basic I have
>> a function that checks 2 named entites for equality to
>> ensure that the entities are all different and that the rules
>> do work only on different named entity objects:
>>
>> public static boolean isEqual(Annotation a, Annotation b){
>> if(a.equals(b)){
>>    return true;
>> }
>> 	
>> return false;
>> }
>>
>> Sometimes there are conditions that need tests of more than
>> 2 named entites. For this I've written a super method that
>> calls the isEqual method in a loop:
>>
>> public static boolean isEqual(Annotation... a){
>> ArrayList<Annotation> outLoop = new
>> ArrayList<Annotation>(Arrays.asList(a));
>> ArrayList<Annotation> inLoop = new
>> ArrayList<Annotation>(Arrays.asList(a));
>> 		
>> for (Annotation anno1 : outLoop) {
>>    inLoop.remove(anno1);
>>    for (Annotation anno2 : inLoop) {
>>       if(isEqual(anno1,anno2)){
>>       return true;
>>       }
>>    }
>> }
>>
>> return false;
>> }
>>
>>
>> My rules could (theoretically) now call the function
>> eval(isEqual($ne1,$ne2)) or
>> eval(isEqual($ne1,$ne2,$ne3) or even
>> eval(isEqual($ne1,$ne2,$ne3,$ne4,$ne5)) and so on.
>>
>> So there starts my problem:
>>
>> Each time I'm getting an ArrayIndexOutOfBounds Exception from the second
>> method that looks like this:
>>
>> java.lang.RuntimeException: cannot invoke method: isEqual
>>         ...
>> 	at java.lang.Thread.dispatchUncaughtException(Thread.java:1888)
>> Caused by: java.lang.ArrayIndexOutOfBoundsException: 3
>> 	at
>> org.mvel2.optimizers.impl.refl.nodes.MethodAccessor.executeAll(MethodAccessor.java:149)
>> 	at
>> org.mvel2.optimizers.impl.refl.nodes.MethodAccessor.getValue(MethodAccessor.java:48)
>> 	at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:108)
>> 	at
>> org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:38)
>>         ...
>>
>> Could someone explain me what's wrong with my code? Thanks for any help.
>>
>> Greetings
>> JB
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users

_______________________________________________
rules-users mailing list
rules-users at lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users



More information about the rules-users mailing list