Search in sources :

Example 6 with MVEL

use of org.mvel2.MVEL in project drools by kiegroup.

the class SecurityPolicyTest method testCustomAccumulateMVEL.

@Test
public void testCustomAccumulateMVEL() throws Exception {
    String drl = "package org.foo.bar\n" + "rule testRule dialect \"mvel\" \n" + "    when\n" + "        Number() from accumulate(Object(), " + "               init(System.exit(-1);), " + "               action(System.exit(-1);), " + "               reverse(System.exit(-1);), " + "               result(0))\n" + "    then\n" + "end";
    try {
        KieServices ks = KieServices.Factory.get();
        KieFileSystem kfs = ks.newKieFileSystem().write(ResourceFactory.newByteArrayResource(drl.getBytes()).setSourcePath("org/foo/bar/r1.drl"));
        ks.newKieBuilder(kfs).buildAll();
        ReleaseId releaseId = ks.getRepository().getDefaultReleaseId();
        KieContainer kc = ks.newKieContainer(releaseId);
        KieSession ksession = kc.newKieSession();
        ksession.fireAllRules();
        Assert.fail("The security policy for the rule should have prevented this from executing...");
    } catch (PropertyAccessException e) {
        // weak way of testing but couldn't find a better way
        if (e.toString().contains("The security policy should have prevented")) {
            Assert.fail("The security policy for the rule should have prevented this from executing...");
        } else {
        // test succeeded
        }
    } catch (Exception e) {
        if (e.toString().contains("access denied (\"java.lang.RuntimePermission\" \"exitVM.-1\")")) {
        // test succeeded
        } else {
            throw e;
        }
    }
}
Also used : KieFileSystem(org.kie.api.builder.KieFileSystem) PropertyAccessException(org.mvel2.PropertyAccessException) KieServices(org.kie.api.KieServices) KieSession(org.kie.api.runtime.KieSession) ReleaseId(org.kie.api.builder.ReleaseId) ConsequenceException(org.kie.api.runtime.rule.ConsequenceException) PropertyAccessException(org.mvel2.PropertyAccessException) KieContainer(org.kie.api.runtime.KieContainer) Test(org.junit.Test)

Example 7 with MVEL

use of org.mvel2.MVEL in project drools by kiegroup.

the class MVELDebugTest method testDebug.

@Test
public void testDebug() throws Exception {
    String rule = "package com.sample; dialect \"mvel\" rule myRule when then\n System.out.println( \"test\" ); end";
    KnowledgeBuilderImpl builder = new KnowledgeBuilderImpl();
    DrlParser parser = new DrlParser(LanguageLevelOption.DRL5);
    PackageDescr packageDescr = parser.parse(null, rule);
    RuleDescr ruleDescr = packageDescr.getRules().get(0);
    builder = new KnowledgeBuilderImpl();
    builder.addPackage(packageDescr);
    InternalKnowledgePackage pkg = builder.getPackage("com.sample");
    MVELConsequence consequence = (MVELConsequence) pkg.getRule("myRule").getConsequence();
    String sourceName = ((CompiledExpression) consequence.getCompExpr()).getSourceName();
    System.out.println(sourceName);
    String ruleName = ruleDescr.getNamespace() + "." + ruleDescr.getClassName();
    System.out.println(ruleName);
    assertEquals(sourceName, ruleName);
}
Also used : KnowledgeBuilderImpl(org.drools.compiler.builder.impl.KnowledgeBuilderImpl) RuleDescr(org.drools.compiler.lang.descr.RuleDescr) DrlParser(org.drools.compiler.compiler.DrlParser) MVELConsequence(org.drools.core.base.mvel.MVELConsequence) PackageDescr(org.drools.compiler.lang.descr.PackageDescr) CompiledExpression(org.mvel2.compiler.CompiledExpression) InternalKnowledgePackage(org.drools.core.definitions.InternalKnowledgePackage) Test(org.junit.Test)

Example 8 with MVEL

use of org.mvel2.MVEL in project drools by kiegroup.

the class QueryElementBuilder method getParserContext.

private ParserContext getParserContext(RuleBuildContext context) {
    MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData("mvel");
    ParserConfiguration conf = data.getParserConfiguration();
    conf.setClassLoader(context.getKnowledgeBuilder().getRootClassLoader());
    return new ParserContext(conf);
}
Also used : MVELDialectRuntimeData(org.drools.core.rule.MVELDialectRuntimeData) ParserContext(org.mvel2.ParserContext) ParserConfiguration(org.mvel2.ParserConfiguration)

Example 9 with MVEL

use of org.mvel2.MVEL in project drools by kiegroup.

the class DialectUtil method setContainerBlockInputs.

/**
 * This code is not currently used, it's commented out in method caller. This is because we couldn't
 * get this to work and will have to wait until MVEL supports genercs (mdp).
 */
public static void setContainerBlockInputs(RuleBuildContext context, List<JavaBlockDescr> descrs, JavaContainerBlockDescr parentBlock, String originalCode, BoundIdentifiers bindings, Map<String, Class<?>> parentVars, int offset) {
    StringBuilder consequence = new StringBuilder();
    int lastAdded = 0;
    // strip blocks, so we can analyse this block with MVEL
    for (JavaBlockDescr block : parentBlock.getJavaBlockDescrs()) {
        if (block.getEnd() == 0) {
            // do nothing, it was incorrectly parsed, but this error should be picked up else where
            continue;
        }
        if (block.getType() == JavaBlockDescr.BlockType.TRY) {
            // adding previous chunk up to the start of this block
            consequence.append(originalCode.substring(lastAdded, block.getStart() - 1 - offset));
            JavaTryBlockDescr tryDescr = (JavaTryBlockDescr) block;
            if (tryDescr.getFinal() != null) {
                lastAdded = tryDescr.getFinal().getEnd() - offset;
            } else {
                lastAdded = tryDescr.getCatches().get(tryDescr.getCatches().size() - 1).getEnd() - offset;
            }
            stripTryDescr(originalCode, consequence, (JavaTryBlockDescr) block, offset);
        } else if (block.getType() == JavaBlockDescr.BlockType.THROW) {
            // adding previous chunk up to the start of this block
            consequence.append(originalCode.substring(lastAdded, block.getStart() - 1 - offset));
            JavaThrowBlockDescr throwBlock = (JavaThrowBlockDescr) block;
            addWhiteSpaces(originalCode, consequence, throwBlock.getStart() - offset, throwBlock.getTextStart() - offset);
            consequence.append(originalCode.substring(throwBlock.getTextStart() - offset - 1, throwBlock.getEnd() - 1 - offset)).append(";");
            lastAdded = throwBlock.getEnd() - offset;
        } else if (block.getType() == JavaBlockDescr.BlockType.IF) {
            // adding previous chunk up to the start of this block
            consequence.append(originalCode.substring(lastAdded, block.getStart() - 1 - offset));
            JavaIfBlockDescr ifDescr = (JavaIfBlockDescr) block;
            lastAdded = ifDescr.getEnd() - offset;
            stripBlockDescr(originalCode, consequence, ifDescr, offset);
        } else if (block.getType() == JavaBlockDescr.BlockType.ELSE) {
            // adding previous chunk up to the start of this block
            consequence.append(originalCode.substring(lastAdded, block.getStart() - 1 - offset));
            JavaElseBlockDescr elseDescr = (JavaElseBlockDescr) block;
            lastAdded = elseDescr.getEnd() - offset;
            stripBlockDescr(originalCode, consequence, elseDescr, offset);
        } else if (block.getType() == JavaBlockDescr.BlockType.WHILE) {
            // adding previous chunk up to the start of this block
            consequence.append(originalCode.substring(lastAdded, block.getStart() - 1 - offset));
            JavaWhileBlockDescr whileDescr = (JavaWhileBlockDescr) block;
            lastAdded = whileDescr.getEnd() - offset;
            stripBlockDescr(originalCode, consequence, whileDescr, offset);
        } else if (block.getType() == JavaBlockDescr.BlockType.FOR) {
            // adding previous chunk up to the start of this block
            consequence.append(originalCode.substring(lastAdded, block.getStart() - 1 - offset));
            JavaForBlockDescr forDescr = (JavaForBlockDescr) block;
            lastAdded = forDescr.getEnd() - offset;
            stripBlockDescr(originalCode, consequence, forDescr, offset);
        }
    }
    consequence.append(originalCode.substring(lastAdded));
    // We need to do this as MVEL doesn't recognise "modify"
    MacroProcessor macroProcessor = new MacroProcessor();
    Map<String, Macro> macros = new HashMap<String, Macro>(MVELConsequenceBuilder.macros);
    macros.put("modify", new Macro() {

        public String doMacro() {
            return "with  ";
        }
    });
    macroProcessor.setMacros(macros);
    String mvelCode = macroProcessor.parse(consequence.toString());
    Map<String, Class<?>> inputs = getInputs(context, mvelCode, bindings, parentVars);
    inputs.putAll(parentVars);
    parentBlock.setInputs(inputs);
    // set inputs for current container blocks to be rewritten
    for (JavaBlockDescr block : parentBlock.getJavaBlockDescrs()) {
        if (block.getType() == JavaBlockDescr.BlockType.TRY) {
            JavaTryBlockDescr tryBlock = (JavaTryBlockDescr) block;
            setContainerBlockInputs(context, descrs, tryBlock, originalCode.substring(tryBlock.getTextStart() - offset, tryBlock.getEnd() - 1 - offset), bindings, inputs, tryBlock.getTextStart());
            for (JavaCatchBlockDescr catchBlock : tryBlock.getCatches()) {
                setContainerBlockInputs(context, descrs, catchBlock, catchBlock.getClause() + "=null;" + originalCode.substring(catchBlock.getTextStart() - offset, catchBlock.getEnd() - 1 - offset), bindings, inputs, tryBlock.getTextStart());
            }
            if (tryBlock.getFinal() != null) {
                JavaFinalBlockDescr finalBlock = tryBlock.getFinal();
                setContainerBlockInputs(context, descrs, finalBlock, originalCode.substring(finalBlock.getTextStart() - offset, finalBlock.getEnd() - 1 - offset), bindings, inputs, tryBlock.getTextStart());
            }
        } else if (block.getType() == JavaBlockDescr.BlockType.IF) {
            JavaIfBlockDescr ifBlock = (JavaIfBlockDescr) block;
            int adjustBlock = (originalCode.charAt(ifBlock.getTextStart() - offset - 1) == '{') ? 0 : 1;
            setContainerBlockInputs(context, descrs, ifBlock, originalCode.substring(ifBlock.getTextStart() - offset + adjustBlock, ifBlock.getEnd() - 1 - offset - adjustBlock), bindings, inputs, ifBlock.getTextStart());
        } else if (block.getType() == JavaBlockDescr.BlockType.ELSE) {
            JavaElseBlockDescr elseBlock = (JavaElseBlockDescr) block;
            int adjustBlock = (originalCode.charAt(elseBlock.getTextStart() - offset - 1) == '{') ? 0 : 1;
            setContainerBlockInputs(context, descrs, elseBlock, originalCode.substring(elseBlock.getTextStart() - offset + adjustBlock, elseBlock.getEnd() - 1 - offset - adjustBlock), bindings, inputs, elseBlock.getTextStart());
        } else if (block.getType() == JavaBlockDescr.BlockType.WHILE) {
            JavaWhileBlockDescr whileBlock = (JavaWhileBlockDescr) block;
            int adjustBlock = (originalCode.charAt(whileBlock.getTextStart() - offset - 1) == '{') ? 0 : 1;
            setContainerBlockInputs(context, descrs, whileBlock, originalCode.substring(whileBlock.getTextStart() - offset + adjustBlock, whileBlock.getEnd() - 1 - offset - adjustBlock), bindings, inputs, whileBlock.getTextStart());
        } else if (block.getType() == JavaBlockDescr.BlockType.FOR) {
            JavaForBlockDescr forBlock = (JavaForBlockDescr) block;
            int adjustBlock = (originalCode.charAt(forBlock.getTextStart() - offset - 1) == '{') ? 0 : 1;
            setContainerBlockInputs(context, descrs, forBlock, originalCode.substring(forBlock.getStartParen() - offset, forBlock.getInitEnd() - offset) + originalCode.substring(forBlock.getTextStart() - offset + adjustBlock, forBlock.getEnd() - 1 - offset - adjustBlock), bindings, inputs, forBlock.getTextStart() - (forBlock.getInitEnd() - forBlock.getStartParen()));
        } else {
            // each block to be rewritten now knows it's own variables
            block.setInputs(inputs);
            descrs.add(block);
        }
    }
}
Also used : JavaForBlockDescr(org.drools.compiler.rule.builder.dialect.java.parser.JavaForBlockDescr) JavaIfBlockDescr(org.drools.compiler.rule.builder.dialect.java.parser.JavaIfBlockDescr) JavaThrowBlockDescr(org.drools.compiler.rule.builder.dialect.java.parser.JavaThrowBlockDescr) HashMap(java.util.HashMap) Macro(org.mvel2.Macro) JavaWhileBlockDescr(org.drools.compiler.rule.builder.dialect.java.parser.JavaWhileBlockDescr) MacroProcessor(org.mvel2.MacroProcessor) JavaCatchBlockDescr(org.drools.compiler.rule.builder.dialect.java.parser.JavaCatchBlockDescr) JavaFinalBlockDescr(org.drools.compiler.rule.builder.dialect.java.parser.JavaFinalBlockDescr) JavaElseBlockDescr(org.drools.compiler.rule.builder.dialect.java.parser.JavaElseBlockDescr) JavaTryBlockDescr(org.drools.compiler.rule.builder.dialect.java.parser.JavaTryBlockDescr) JavaBlockDescr(org.drools.compiler.rule.builder.dialect.java.parser.JavaBlockDescr)

Example 10 with MVEL

use of org.mvel2.MVEL in project drools by kiegroup.

the class DialectUtil method getInputs.

private static Map<String, Class<?>> getInputs(final RuleBuildContext context, String code, BoundIdentifiers bindings, Map<String, Class<?>> parentVars) {
    MVELDialect mvel = (MVELDialect) context.getDialect("mvel");
    MVELAnalysisResult mvelAnalysis = null;
    try {
        mvelAnalysis = (MVELAnalysisResult) mvel.analyzeBlock(context, code, bindings, parentVars, "drools", KnowledgeHelper.class);
    } catch (Exception e) {
    // swallow this as the error will be reported else where
    }
    return (mvelAnalysis != null) ? mvelAnalysis.getMvelVariables() : new HashMap<String, Class<?>>();
}
Also used : MVELAnalysisResult(org.drools.compiler.rule.builder.dialect.mvel.MVELAnalysisResult) MVELDialect(org.drools.compiler.rule.builder.dialect.mvel.MVELDialect) CompileException(org.mvel2.CompileException)

Aggregations

ParserContext (org.mvel2.ParserContext)7 MVELDialectRuntimeData (org.drools.core.rule.MVELDialectRuntimeData)6 Test (org.junit.Test)6 ParserConfiguration (org.mvel2.ParserConfiguration)6 HashMap (java.util.HashMap)5 KieServices (org.kie.api.KieServices)5 KieFileSystem (org.kie.api.builder.KieFileSystem)5 ReleaseId (org.kie.api.builder.ReleaseId)5 KieContainer (org.kie.api.runtime.KieContainer)5 PropertyAccessException (org.mvel2.PropertyAccessException)5 Map (java.util.Map)4 KieSession (org.kie.api.runtime.KieSession)4 CompileException (org.mvel2.CompileException)4 Declaration (org.drools.core.rule.Declaration)3 Serializable (java.io.Serializable)2 HashSet (java.util.HashSet)2 List (java.util.List)2 Entry (java.util.Map.Entry)2 RecognitionException (org.antlr.runtime.RecognitionException)2 DroolsParserException (org.drools.compiler.compiler.DroolsParserException)2