[rules-users] Drools and mvel

Paul Edwards Paul.Edwards at hyro.com
Wed Jul 21 19:49:39 EDT 2010


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 at hyro.com
________________________________________
From: rules-users-bounces at lists.jboss.org [rules-users-bounces at lists.jboss.org] On Behalf Of Mark Proctor [mproctor at 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 at hyro.com<mailto:Paul.Edwards at 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-condition-in-RHS-won-t-compile-help-please-td67458.html) 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/objectmodel%5C>" xmlns:ns6=\"http://www.sifinfo.org/au/infrastructure/2.x\<http://www.sifinfo.org/au/infrastructure/2.x%5C>" xmlns:ns7=\"urn:oasis:names:tc:SPML:2:0:batch\">\n" +
       "    <ns5:emailAddresses emailAddress=\"pedwards at frazzle.co.nz<mailto:pedwards at frazzle.co.nz>\" primary=\"true\" type=\"Personal\" modificationMode=\"0\"/>\n" +
       "    <ns5:emailAddresses emailAddress=\"grumpy at frazzle.co.nz<mailto:grumpy at 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 at lists.jboss.org<mailto:rules-users at 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 at lists.jboss.org<mailto:rules-users at lists.jboss.org>
https://lists.jboss.org/mailman/listinfo/rules-users






More information about the rules-users mailing list