Skip to content

Commit

Permalink
[JBRULES-3691] fix parsing of modify statement with nested accessors …
Browse files Browse the repository at this point in the history
…for property reactvity
  • Loading branch information
mariofusco committed Jan 25, 2013
1 parent 3d23068 commit 9dcca20
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 8 deletions.
Expand Up @@ -27,7 +27,6 @@
import org.drools.rule.builder.dialect.java.parser.JavaLocalDeclarationDescr;
import org.drools.rule.builder.dialect.java.parser.JavaLocalDeclarationDescr.IdentifierDescr;
import org.drools.rule.builder.dialect.java.parser.JavaModifyBlockDescr;
import org.drools.rule.builder.dialect.java.parser.JavaStatementBlockDescr;
import org.drools.rule.builder.dialect.java.parser.JavaThrowBlockDescr;
import org.drools.rule.builder.dialect.java.parser.JavaTryBlockDescr;
import org.drools.rule.builder.dialect.java.parser.JavaWhileBlockDescr;
Expand Down Expand Up @@ -709,7 +708,7 @@ private static long parseModifiedProperties(ConsequenceMetaData.Statement statem
String methodName = exprStr.substring(0, endMethodName).trim();
String propertyName = setter2property(methodName);

String methodParams = exprStr.substring(endMethodName+1, exprStr.indexOf(')')).trim();
String methodParams = exprStr.substring(endMethodName+1, exprStr.lastIndexOf(')')).trim();
List<String> args = splitArgumentsList(methodParams);
int argsNr = args.size();

Expand Down
Expand Up @@ -32,6 +32,7 @@
import org.kie.builder.KnowledgeBuilder;
import org.kie.builder.KnowledgeBuilderFactory;
import org.kie.definition.KnowledgePackage;
import org.kie.definition.type.Modifies;
import org.kie.definition.type.PropertyReactive;
import org.kie.event.kiebase.DefaultKieBaseEventListener;
import org.kie.event.kiebase.KieBaseEventListener;
Expand Down Expand Up @@ -878,8 +879,57 @@ public void testNumberCoercionOnNonGenericMap() {
assertEquals(2, ksession.fireAllRules());
}

@Test
public void testPropertyReactivityWithNestedAccessorsInModify() {
// JBRULES-3691
String str =
"package com.ilesteban.rulenotbeingfired;\n" +
"\n" +
"import java.util.Map;\n" +
"import java.util.EnumMap;\n" +
"import org.drools.integrationtests.MiscTest2.Parameter\n" +
"import org.drools.integrationtests.MiscTest2.DataSample\n" +
"\n" +
"declare Recommendation\n" +
" parameter : Parameter\n" +
" value : double\n" +
"end\n" +
"\n" +
"rule \"Init\" salience 100\n" +
"when\n" +
"then\n" +
" insert(new Recommendation(Parameter.PARAM_A, 1.0));" +
"end\n" +
"rule \"Rule 1\"\n" +
"when\n" +
" $d: DataSample()\n" +
" $re: Recommendation ($p: parameter, $v: value)\n" +
"then\n" +
" System.out.println(drools.getRule().getName());\n" +
" modify($d){\n" +
" addValue($re.getParameter(), $re.getValue())\n" +
" }\n" +
"end\n" +
"\n" +
"rule \"Data with messages\"\n" +
"salience -100\n" +
"when\n" +
" $d: DataSample(notEmpty == true)\n" +
"then\n" +
" System.out.println(drools.getRule().getName());\n" +
"end\n";

KnowledgeBase kbase = loadKnowledgeBaseFromString(str);
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

ksession.insert(new DataSample());

assertEquals(3, ksession.fireAllRules());
}

public enum Parameter { PARAM_A, PARAM_B }

@PropertyReactive
public static class DataSample {
private Map<Parameter, Double> values = new EnumMap<Parameter, Double>(Parameter.class);

Expand All @@ -891,9 +941,14 @@ public void setValues(Map<Parameter, Double> values) {
this.values = values;
}

@Modifies({"values", "notEmpty"})
public void addValue(Parameter p, double value){
this.values.put(p, value);
}

public boolean isNotEmpty(){
return !this.values.isEmpty();
}
}

@Test @Ignore("fixed with mvel 2.1.4")
Expand Down
22 changes: 16 additions & 6 deletions drools-core/src/main/java/org/drools/core/util/ClassUtils.java
Expand Up @@ -18,6 +18,7 @@

import org.drools.common.DroolsObjectInputStream;
import org.drools.common.DroolsObjectOutputStream;
import org.kie.definition.type.Modifies;
import org.kie.internal.utils.ClassLoaderUtil;
import org.kie.internal.utils.CompositeClassLoader;

Expand All @@ -42,9 +43,11 @@
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;

public final class ClassUtils {
private static final ProtectionDomain PROTECTION_DOMAIN;
Expand Down Expand Up @@ -332,21 +335,28 @@ public static Class<?> findClass(String className, ClassLoader cl) {
}

public static List<String> getSettableProperties(Class<?> clazz) {
List<String> settableProperties = new ArrayList<String>();
Set<String> props = new HashSet<String>();
for (Method m : clazz.getMethods()) {
if (m.getParameterTypes().length == 1) {
String propName = setter2property(m.getName());
if (propName != null) {
settableProperties.add(propName);
props.add(propName);
}
}

Modifies modifies = m.getAnnotation( Modifies.class );
if (modifies != null) {
for (String prop : modifies.value()) {
props.add( prop.trim() );
}
}
}

for (Field f : clazz.getFields()) {
String fieldName = f.getName();
if (!settableProperties.contains(fieldName)) {
settableProperties.add(fieldName);
}
props.add(f.getName());
}

List<String> settableProperties = new ArrayList<String>(props);
Collections.sort(settableProperties);
return settableProperties;
}
Expand Down

0 comments on commit 9dcca20

Please sign in to comment.