[jboss-jira] [JBoss JIRA] (JBRULES-3506) KnowledgeAgent is not detecting changes of a function defined in a package

Mario Fusco (JIRA) jira-events at lists.jboss.org
Tue Sep 25 12:28:35 EDT 2012


    [ https://issues.jboss.org/browse/JBRULES-3506?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12721550#comment-12721550 ] 

Mario Fusco commented on JBRULES-3506:
--------------------------------------

I am pasting below the test I developed to (unsuccessfully) reproduce this issue.
Please provide a failing test case if you think the bug is still present.

    @Test
    public void testModifyFunctionInPackage() throws Exception {
        // JBRULES-3506
        String func1 =
                "package org.drools.test.func\n" +
                "function String getValue() {\n" +
                "   return \"1\";\n" +
                "}\n";

        String func2 =
                "package org.drools.test.func\n" +
                "function String getValue() {\n" +
                "   return \"2\";\n" +
                "}\n";

        String rule =
                "package org.drools.test.rule\n" +
                "global java.util.List list\n" +
                "rule R1 when\n" +
                "then\n" +
                "   list.add( org.drools.test.func.GetValue.getValue() );\n" +
                "end\n";

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( func1.getBytes() ),
                      ResourceType.DRL );
        kbuilder.add( ResourceFactory.newByteArrayResource( rule.getBytes() ),
                      ResourceType.DRL );
        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }
        for (KnowledgePackage pkg : kbuilder.getKnowledgePackages()) {
            writePackage( pkg, fileManager.newFile( pkg.getName().endsWith("rule") ? "rule.pkg" : "func.pkg" ) );
        }

        fileManager.write( "function.drl", func1 );
        fileManager.write( "rule.drl", rule );

        String xml = "";
        xml += "<change-set xmlns='http://drools.org/drools-5.0/change-set'";
        xml += "    xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'";
        xml += "    xs:schemaLocation='http://drools.org/drools-5.0/change-set http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.0.xsd' >";
        xml += "    <add> ";
        xml += "        <resource source='http://localhost:" + this.getPort() + "/func.pkg' type='PKG' />";
        xml += "        <resource source='http://localhost:" + this.getPort() + "/rule.pkg' type='PKG' />";
        xml += "    </add> ";
        xml += "</change-set>";

        File fxml = fileManager.write( "changeset.xml", xml );

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        KnowledgeAgent kagent = createKAgent( kbase );

        applyChangeSet( kagent, ResourceFactory.newUrlResource( fxml.toURI().toURL() ) );

        StatefulKnowledgeSession ksession = createKnowledgeSession( kagent.getKnowledgeBase() );
        List<String> list = new ArrayList<String>();
        ksession.setGlobal( "list", list );
        ksession.fireAllRules();
        ksession.dispose();

        assertEquals( 1, list.size() );
        assertEquals( "1", list.get(0) );

        list.clear();

        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource( func2.getBytes() ),
                      ResourceType.DRL );
        KnowledgePackage pkg = kbuilder.getKnowledgePackages().iterator().next();
        writePackage( pkg, fileManager.newFile( "func.pkg" ) );

        scan( kagent );

        ksession = createKnowledgeSession( kagent.getKnowledgeBase() );
        list = new ArrayList<String>();
        ksession.setGlobal( "list", list );
        ksession.fireAllRules();
        ksession.dispose();

        assertEquals( 1, list.size() );
        assertEquals( "2", list.get(0) );

        kagent.dispose();
    }
                
> KnowledgeAgent is not detecting changes of a function defined in a package
> --------------------------------------------------------------------------
>
>                 Key: JBRULES-3506
>                 URL: https://issues.jboss.org/browse/JBRULES-3506
>             Project: Drools
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: drools-core
>    Affects Versions: 5.4.0.Final
>            Reporter: Elisabeth Wirth
>            Assignee: Mario Fusco
>
> I have a pkg containing a function and I am checking, if there are any changes in my pkg by using the KnowledgeAgent.
> Now I have the problem, that changes of the function are not recognized.
> In the log I see the following entry:
> KnowledgeAgent: impossible to add a map for a null resource! skiping.
> I have analyzed the code of KnowledgeAgentImpl and found the reason for the problem:
> in the method createPackageFromResource(Resource resource, KnowledgeBuilder kbuilder) in KnowledgeAgentImpl
> the mapping for functions is missing.
> I have added the following code and everything works as expected:
>                 for( KnowledgePackage kpkg : kpkgs ) {
>                     for ( Rule rule : ((KnowledgePackageImp)kpkg).pkg.getRules() ) {
>                         rule.setResource( resource );
>                     } ....
>                     // added
>                     for ( Function function : ((KnowledgePackageImp)kpkg).pkg.getFunctions().values() ) {
>                     	function.setResource( resource );
>                     }
>                 }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the jboss-jira mailing list