As far as I can see there is nothing wrong with your first attempt.
I've attached a test file of your scenario. It works for me. Can you please
test my file and create a test case that fails?

Best,

On Thu, Dec 31, 2009 at 10:26 AM, orchid <[email protected]> wrote:

>
> Hi All,
> I'm using Drools 5.x. I have the following class:
> public class Machine{
>   ...
>   private List rules = new ArrayList();
>   ...
> }
>
> The 'rules' list holds strings. I would like from my rule to check whether
> that list contains the string "rule2".
>
> I've tried doing this in the following ways, but get compilation error:
>
> rule "rule1"
>  when
>    /*1st attempt:*/ $m:Machine(rules contains "rule2")
>    /*2nd attempt:*/ $m:Machine(rules.contains("rule2") )
>  then
>    ...
> What am I doing wrong?
>
> Thanks in advance !!!
>
> --
> View this message in context:
> http://n3.nabble.com/How-to-check-an-array-field-from-LHS-of-a-rule-tp104523p104523.html
> Sent from the Drools - User mailing list archive at Nabble.com.
> _______________________________________________
> rules-users mailing list
> [email protected]
> https://lists.jboss.org/mailman/listinfo/rules-users
>



-- 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Esteban Aliverti
package eaa.test.test;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;
import org.drools.util.FileManager;
import org.mortbay.jetty.Server;

public class TmpTest extends TestCase {

    FileManager fileManager;

    @Override
    protected void setUp() throws Exception {
        fileManager = new FileManager();
        fileManager.setUp();
    }

    @Override
    protected void tearDown() throws Exception {
        fileManager.tearDown();
    }

    public class Machine {

        private List rules = new ArrayList();

        public List getRules() {
            return rules;
        }

        public void setRules(List rules) {
            this.rules = rules;
        }

        public boolean addRule(Object e) {
            return rules.add(e);
        }

        public void clearRules() {
            rules.clear();
        }
    }

    public void testModifyFileUrlOverwriteIncremental() throws Exception {

        String header1 = "";
        header1 += "package org.drools.test\n";
        header1 += "import eaa.test.test.TmpTest.Machine\n";
        header1 += "global java.util.List list\n\n";

        String rule1 = "";
        rule1 += "rule rule1\n";
        rule1 += "when\n";
        rule1 += "\tMachine(rules contains \"Some Rule\")\n";
        rule1 += "then\n";
        rule1 += "list.add( drools.getRule().getName());\n";
        rule1 += "end\n";


        File f1 = fileManager.newFile("rule1.drl");
        Writer output = new BufferedWriter(new FileWriter(f1));
        output.write(header1);
        output.write(rule1);
        output.close();

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newFileResource(f1), ResourceType.DRL);

        if (kbuilder.hasErrors()) {
            for (KnowledgeBuilderError error : kbuilder.getErrors()) {
                System.err.println(error);
            }
            fail("Could not parse knowledge.");
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();

        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

        List<String> list = new ArrayList<String>();
        ksession.setGlobal("list", list);

        //insert a Machine with "Some String" in its rules
        Machine m = new Machine();
        m.addRule("Some Rule");

        FactHandle fh = ksession.insert(m);

        ksession.fireAllRules();

        assertEquals(1, list.size());
        assertTrue(list.contains("rule1"));

        list.clear();

        //clear Machine's rules
        m.clearRules();

        //updates the Machine in kbase
        ksession.update(fh, m);
        ksession.fireAllRules();

        assertEquals(0, list.size());

        ksession.dispose();

    }
}


_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to