Hi Mark,
I assume you are referring to: drools.dialect.mvel.strict =<true|false> as I
cannot see any other config items. I have already tried setting that to false (I should
have put that in the first email) but it didn't work.
I'm guessing that leaves me needing to raise a Jira issue???
--
Paul Edwards
Solutions Engineer
Identity Solutions Practice
---------------------------------------------------------
hyro
P Oz +61 2 9215 4347
M NZ +64 21 2588695
M Oz +61 4 2091 3987
W
www.hyro.com
E paul.edwards(a)hyro.com
________________________________________
From: rules-users-bounces(a)lists.jboss.org [rules-users-bounces(a)lists.jboss.org] On Behalf
Of Mark Proctor [mproctor(a)codehaus.org]
Sent: Thursday, 22 July 2010 1:01 a.m.
To: Rules Users List
Subject: Re: [rules-users] Drools and mvel
It is possible to turn off the language constraint for MVEL in drools, see
KnowledgeBuilderConfiguration, which should cause the static field not to be set.
Mark
On 21/07/2010 15:02, Edson Tirelli wrote:
Hi Paul,
Your analysis is correct. The problem is that these configurations in MVEL are made
using static properties and so they affect all uses of MVEL in a single classloading
hierarchy. Unfortunately, I don't think there is anything you can do right now, other
than open a JIRA in MVEL to help convince Mike to make all configurations non-static in
MVEL:
http://jira.codehaus.org/browse/MVEL
Edson
2010/7/21 Paul Edwards<Paul.Edwards@hyro.com<mailto:Paul.Edwards@hyro.com>>
Hi guys,
I have an issue which involves smooks, drools and mvel.
Quick explanation, the unit test is just a smooks run. Nothing complicated. The test
passes happily. It contains an expression that involves an MVEL "IF" statement.
Now if I add a drools startup (I'm not using drools in the test, I'm just
initialising it), the unit test now fails on the "IF" statement. The exception
received is:
org.milyn.cdr.SmooksConfigurationException: Error invoking @Initialize method
'initialize' on class 'org.milyn.javabean.BeanInstancePopulator'.
at org.milyn.cdr.annotation.Configurator.invoke(Configurator.java:457)
at org.milyn.cdr.annotation.Configurator.initialise(Configurator.java:439)
at org.milyn.cdr.annotation.Configurator.configure(Configurator.java:91)
at org.milyn.cdr.annotation.Configurator.configure(Configurator.java:66)
at
org.milyn.delivery.JavaContentHandlerFactory.create(JavaContentHandlerFactory.java:63)
at
org.milyn.delivery.ContentDeliveryConfigBuilder$ContentHandlerExtractionStrategy.addCDU(ContentDeliveryConfigBuilder.java:623)
at
org.milyn.delivery.ContentDeliveryConfigBuilder$ContentHandlerExtractionStrategy.applyCDUStrategy(ContentDeliveryConfigBuilder.java:548)
at
org.milyn.delivery.ContentDeliveryConfigBuilder$ContentHandlerExtractionStrategy.applyStrategy(ContentDeliveryConfigBuilder.java:536)
at
org.milyn.delivery.ContentDeliveryConfigBuilder$SmooksResourceConfigurationTableIterator.iterate(ContentDeliveryConfigBuilder.java:711)
at
org.milyn.delivery.ContentDeliveryConfigBuilder$SmooksResourceConfigurationTableIterator.access$300(ContentDeliveryConfigBuilder.java:690)
at
org.milyn.delivery.ContentDeliveryConfigBuilder.extractContentHandlers(ContentDeliveryConfigBuilder.java:484)
at
org.milyn.delivery.ContentDeliveryConfigBuilder.load(ContentDeliveryConfigBuilder.java:349)
at
org.milyn.delivery.ContentDeliveryConfigBuilder.getConfig(ContentDeliveryConfigBuilder.java:146)
at
org.milyn.container.standalone.StandaloneExecutionContext.<init>(StandaloneExecutionContext.java:91)
at
org.milyn.container.standalone.StandaloneExecutionContext.<init>(StandaloneExecutionContext.java:65)
at org.milyn.Smooks.createExecutionContext(Smooks.java:383)
at org.milyn.Smooks.createExecutionContext(Smooks.java:346)
at
com.hyro.telstrapoc.smooks.SmooksTransformTest.runSmooksTransform(SmooksTransformTest.java:215)
at
com.hyro.telstrapoc.smooks.SmooksTransformTest.testSmooks(SmooksTransformTest.java:139)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: [Error: was expecting type: java.lang.Object; but found type: null]
[Near : {... }
els ....}]
^
[Line: 3, Column: 16]
at org.mvel2.util.CompilerTools.expectType(CompilerTools.java:355)
at
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer._getAccessor(ReflectiveAccessorOptimizer.java:1052)
at
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeCollection(ReflectiveAccessorOptimizer.java:1079)
at org.mvel2.ast.InlineCollectionNode.<init>(InlineCollectionNode.java:50)
at org.mvel2.compiler.AbstractParser.nextToken(AbstractParser.java:1173)
at org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:118)
at org.mvel2.compiler.ExpressionCompiler.compile(ExpressionCompiler.java:65)
at org.mvel2.MVEL.compileExpression(MVEL.java:886)
at org.mvel2.MVEL.compileExpression(MVEL.java:891)
at org.mvel2.MVEL.compileExpression(MVEL.java:797)
at
org.milyn.expression.MVELExpressionEvaluator.setExpression(MVELExpressionEvaluator.java:55)
at
org.milyn.javabean.BeanInstancePopulator.initialize(BeanInstancePopulator.java:235)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.milyn.cdr.annotation.Configurator.invoke(Configurator.java:453)
... 42 more
If I remove the 3 lines initialising drools, it all passes again. I suspect that the MVEL
engine is a singleton, and both drools and smooks are using the same instance. I believe
drools is setting MVEL to disallow "IF" statements on the RHS of a rule. (see:
http://drools-java-rules-engine.46999.n3.nabble.com/Trivial-rule-with-con...)
I don't understand why MVEL thinks that my smooks expression is a RHS of a rule....
Heres the unit test:
@Test
public void testSmooks2() throws Exception {
String input =
"<ns5:user partyAdminRoles=\"\" lastName=\"Edwards\"
firstName=\"Paul\" primary=\"false\" userID=\"pedwards\"
otpTokenRemainingUses=\"0\" registrationCodeRemainingUses=\"0\"
enabled=\"true\" customIntAttr1=\"0\"
xmlns:ns2=\"urn:oasis:names:tc:SPML:2:0:reference\"
xmlns=\"urn:oasis:names:tc:SPML:2:0\"
xmlns:ns4=\"urn:oasis:names:tc:SPML:2:0:password\"
xmlns:ns3=\"urn:oasis:names:tc:SPML:2:0:search\"
xmlns:ns5=\"http://hyro.com/da/objectmodel\<http://hyro.com/da/ob...
xmlns:ns6=\"http://www.sifinfo.org/au/infrastructure/2.x\<http://...
xmlns:ns7=\"urn:oasis:names:tc:SPML:2:0:batch\">\n" +
"<ns5:emailAddresses
emailAddress=\"pedwards@frazzle.co.nz<mailto:pedwards@frazzle.co.nz>\"
primary=\"true\" type=\"Personal\"
modificationMode=\"0\"/>\n" +
"<ns5:emailAddresses
emailAddress=\"grumpy@frazzle.co.nz<mailto:grumpy@frazzle.co.nz>\"
primary=\"false\" type=\"Personal\"
modificationMode=\"0\"/>\n" +
"<ns5:authzRoleSubscriptions status=\"Active\"
primary=\"false\" singlePasswordOptOut=\"false\"
reprovision=\"false\" customBoolAttr5=\"false\"
customBoolAttr4=\"false\" customBoolAttr3=\"false\"
customBoolAttr2=\"false\" customBoolAttr1=\"false\"
customIntAttr5=\"0\" customIntAttr4=\"0\"
customIntAttr3=\"0\" customIntAttr2=\"0\"
customIntAttr1=\"0\">\n" +
"<ns5:role roleName=\"Account\">\n" +
"<ns5:entitlement entitlementID=\"Open LDAP Account\"
type=\"Account\"/>\n" +
"</ns5:role>\n" +
"</ns5:authzRoleSubscriptions>\n" +
"<ns5:auxEntities/>\n" +
"</ns5:user>\n";
UserType inUser = null;
Unmarshaller unmarshaller = null;
try {
log.debug("Unmarshalling: " + input);
unmarshaller = (Unmarshaller) SpmlConstants.unmarshallerPool.borrowObject();
inUser = ((JAXBElement<UserType>) unmarshaller.unmarshal(new
StringReader(input))).getValue();
} catch (JAXBException e) {
log.error("Exception while trying to unmarshall input daSpmlString:
" + e.getMessage());
e.printStackTrace();
throw e;
} catch (Exception e) {
log.error("Exception while trying to unmarshall input daSpmlString:
" + e.getMessage());
e.printStackTrace();
throw e;
} finally {
SpmlConstants.unmarshallerPool.returnObject(unmarshaller);
}
log.debug("Unmarshalled: " + inUser.getUserID());
Properties parsed = runSmooksTransform(inUser);
assertNotNull(parsed);
for(Iterator<Object> i = parsed.keySet().iterator(); i.hasNext();) {
Object key = i.next();
Object value = parsed.get(key);
System.out.println("Key: " + key + " value: " + value);
}
}
Heres the smooks file:
<?xml version="1.0"?>
<smooks-resource-list
xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
xmlns:core="http://www.milyn.org/xsd/smooks/smooks-core-1.3.xsd"
xmlns:jb="http://www.milyn.org/xsd/smooks/javabean-1.3.xsd">
<!-- NOTE NOTE NOTE -->
<!-- This is purely to map user or person props to the LDAP name. Anything that is
handled -->
<!-- explicitly (like firstname or lastname) does not get mapped -->
<jb:bean beanId="UserOrPerson" class="java.util.Properties"
createOnElement="com.hyro.spmlservice.generated.objectmodel.PersonType">
<jb:value property="employeeNumber" decoder="String"
data="personID" />
<jb:value property="mobile" decoder="String"
data="mobileTel" />
<jb:value property="facsimileTelephoneNumber"
decoder="String" data="workFax" />
<jb:value property="telephoneNumber" decoder="String"
data="workTel" />
<jb:value property="description" decoder="String"
data="title" />
<jb:value property="l" decoder="String"
data="customAttr27" />
<jb:value property="physicalDeliveryOfficeName"
decoder="String" data="customAttr8" />
<jb:value property="postalCode" decoder="String"
data="customAttr7" />
</jb:bean>
<jb:bean beanId="UserOrPerson" class="java.util.Properties"
createOnElement="com.hyro.spmlservice.generated.objectmodel.UserType">
<jb:value property="firstName" decoder="String"
data="firstName" />
<jb:value property="lastName" decoder="String"
data="lastName" />
<jb:value property="user" decoder="String"
data="userID" />
<jb:value property="displayName" decoder="String"
data="customAttr4" />
<jb:value property="postalCode" decoder="String"
data="customAttr2" />
<jb:expression property="mail"
execOnElement="emailAddresses">
if(1 == 2) {
return emailAddresses[0].emailAddress;
}
else {
return "NOT FOUND";
}
</jb:expression>
</jb:bean>
<jb:bean beanId="emailAddresses" class="java.util.ArrayList"
createOnElement="emailAddresses">
<jb:wiring beanIdRef="emailAddressType" />
</jb:bean>
<jb:bean beanId="emailAddressType"
class="com.hyro.spmlservice.generated.objectmodel.EmailAddressType"
createOnElement="com.hyro.spmlservice.generated.objectmodel.EmailAddressType">
<jb:value property="modificationMode" decoder="Short"
data="modificationMode" />
<jb:value property="emailAddress" decoder="String"
data="emailAddress" />
<jb:value property="type" decoder="String"
data="type" />
<jb:value property="primary" decoder="Boolean"
data="primary" />
</jb:bean>
</smooks-resource-list>
Any Ideas? I've wasted 3 days getting to this point....
--
Paul Edwards
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org<mailto:rules-users@lists.jboss.org>
https://lists.jboss.org/mailman/listinfo/rules-users
--
Edson Tirelli
JBoss Drools Core Development
JBoss by Red Hat @
www.jboss.com<http://www.jboss.com>
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org<mailto:rules-users@lists.jboss.org>
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users