Hi all,

I am trying to run Drools as a bundle with Equinox, however I found an issue with Drools 5 with the classloader, apparently Drools 5 does not always uses the classloader that I pass in the configuration (PackageBuilderConfiguration). Then I decided to test it with Drools 4.0.7 and I do not have the classloader problem anymore but I got the following error (NoSuchMethodError) when I execute stateFulSession.fireAllRules, below is the stack.

I am trying to run it with Equinox 3.4 and I reviewed that all the dependencies are ok. The .drl file is compiled successfully, see the code that I am using below.

I followed the sample publishe in: http://www.dynamicjava.org/articles/osgi-integration/drools-osgi

And I tried with the bundles published by spring and I also tried with my own sample but I get the same error.


Does anybody used successfully Drools 4.0.7 or 5 in OSGi successfully? What should I change to have my code running in OSGi?


Thanks in advance,


The Code:

        InputStreamReader source = new InputStreamReader( this.getClass.getResourceAsStream( "helloWorld.drl" ) );
               
        OsgiEnvironmentClassLoader classLoader
                 new OsgiEnvironmentClassLoader(bundleContext, 
                     Thread.currentThread().getContextClassLoader(), 
                     bundleContext.getBundle());       
               
       
        PackageBuilderConfig packageBuilderConfig = new PackageBuilderConfiguration(classLoader, null);
               
        PackageBuilder builder = new PackageBuilder(packageBuilderConfig);

        //this wil parse and compile in one step
        builder.addPackageFromDrl( source );
       
        // Check the builder for errors
        if ( builder.hasErrors() ) {
            System.out.println( builder.getErrors().toString() );
            throw new RuntimeException( "Unable to compile \"helloWorld.drl\".");
        }

        //get the compiled package (which is serializable)
        Package pkg = builder.getPackage();
       
        Package ruleBaseConfig = new RuleBaseConfiguration()
        ruleBaseConfig.setClassLoader(classLoader);
        //add the package to a rulebase (deploy the rule package).
        RuleBase ruleBase = RuleBaseFactory.newRuleBase(ruleBaseConfig);
       
        ruleBase.addPackage( pkg );
       
        StateFulSession session = ruleBase.newStatefulSession();
         
            session.fireAllRules();


The Exception:


INFO: bundle changed: TopicMapEditorService
        at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActiv
ator(BundleContextImpl.java:1028)
        at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(Bund
leContextImpl.java:984)
        at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(Bundl
eHost.java:344)
        at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(Abstrac
tBundle.java:267)
        at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(Abstrac
tBundle.java:259)
        at org.eclipse.osgi.framework.internal.core.FrameworkCommandProvider._st
art(FrameworkCommandProvider.java:254)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.eclipse.osgi.framework.internal.core.FrameworkCommandInterpreter.
execute(FrameworkCommandInterpreter.java:150)
        at org.eclipse.osgi.framework.internal.core.FrameworkConsole.docommand(F
rameworkConsole.java:302)
        at org.eclipse.osgi.framework.internal.core.FrameworkConsole.console(Fra
meworkConsole.java:287)
        at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(Framewo
rkConsole.java:223)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoSuchMethodError: org.drools.WorkingMemory.fireAllRules()I

        at org.topicology.security.TSecurity.initialize(TSecurity.scala:49)
        at org.topicology.TMEditorService.Activator.start(Activator.scala:28)
        at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(Bund
leContextImpl.java:1009)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActiv
ator(BundleContextImpl.java:1003)
        ... 14 more
Nested Exception:
java.lang.NoSuchMethodError: org.drools.WorkingMemory.fireAllRules()I
        at org.topicology.security.TSecurity.initialize(TSecurity.scala:49)
        at org.topicology.TMEditorService.Activator.start(Activator.scala:28)
        at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(Bund
leContextImpl.java:1009)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActiv
ator(BundleContextImpl.java:1003)
        at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(Bund
leContextImpl.java:984)
        at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(Bundl
eHost.java:344)
        at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(Abstrac
tBundle.java:267)
        at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(Abstrac
tBundle.java:259)
        at org.eclipse.osgi.framework.internal.core.FrameworkCommandProvider._st
art(FrameworkCommandProvider.java:254)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.eclipse.osgi.framework.internal.core.FrameworkCommandInterpreter.
execute(FrameworkCommandInterpreter.java:150)
        at org.eclipse.osgi.framework.internal.core.FrameworkConsole.docommand(F
rameworkConsole.java:302)
        at org.eclipse.osgi.framework.internal.core.FrameworkConsole.console(Fra
meworkConsole.java:287)
        at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(Framewo
rkConsole.java:223)
        at java.lang.Thread.run(Unknown Source)
Nested Exception:
java.lang.NoSuchMethodError: org.drools.WorkingMemory.fireAllRules()I
        at org.topicology.security.TSecurity.initialize(TSecurity.scala:49)
        at org.topicology.TMEditorService.Activator.start(Activator.scala:28)
        at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(Bund
leContextImpl.java:1009)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActiv
ator(BundleContextImpl.java:1003)
        at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(Bund
leContextImpl.java:984)
        at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(Bundl
eHost.java:344)
        at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(Abstrac
tBundle.java:267)
        at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(Abstrac
tBundle.java:259)
        at org.eclipse.osgi.framework.internal.core.FrameworkCommandProvider._st
art(FrameworkCommandProvider.java:254)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.eclipse.osgi.framework.internal.core.FrameworkCommandInterpreter.
execute(FrameworkCommandInterpreter.java:150)
        at org.eclipse.osgi.framework.internal.core.FrameworkConsole.docommand(F
rameworkConsole.java:302)
        at org.eclipse.osgi.framework.internal.core.FrameworkConsole.console(Fra
meworkConsole.java:287)
        at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(Framewo
rkConsole.java:223)
        at java.lang.Thread.run(Unknown Source)