[rules-users] Drools and mvel

Mark Proctor mproctor at codehaus.org
Wed Jul 21 11:01:23 EDT 2010


  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
> https://lists.jboss.org/mailman/listinfo/rules-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20100721/f69dd50f/attachment.html 


More information about the rules-users mailing list