[rules-users] Errors in running the HelloWorldExample
Edson Tirelli
tirelli at post.com
Fri Apr 6 09:57:14 EDT 2007
Sudipta,
I believe the problem is that you can't import classes from the default
package into your rules file, but I'm not sure.
Try making Message a top level class (not an inner class) and put it in
a package (not the default one). Import it in the DRL and you shall be fine.
We need a closer look at this before releasing next major final version.
[]s
Edson
2007/4/5, Sudipta deb <sudipta_hitk at yahoo.co.in>:
>
> Sir,
>
> I want to run a simple drools example i.e. HelloWorldExample from command
> line
>
> My HelloWorldExample.java--->
>
>
> import java.io.InputStreamReader;
> import java.io.Reader;
> import org.drools.RuleBase;
> import org.drools.RuleBaseFactory;
> import org.drools.WorkingMemory;
> import org.drools.compiler.PackageBuilder;
> import org.drools.rule.Package;
> import org.drools.compiler.PackageBuilderConfiguration;
> import org.drools.compiler.*;
> import java.lang.String;
> import java.io.*;
>
> /**
> * This is a sample file to launch a rule package from a rule source file.
> */
>
>
> public class HelloWorldExample
> {
>
> public static final void main(final String[] args)
> {
> try
> {
>
> //load up the rulebase
> final RuleBase ruleBase = loadRules();
> final WorkingMemory workingMemory = ruleBase.newWorkingMemory
> ();
>
> //go !
> final Message message = new Message();
> message.setMessage( "Hello World " );
> message.setStatus( Message.HELLO );
> workingMemory.assertObject( message );
> workingMemory.fireAllRules();
>
> }
> catch ( final Throwable t )
> {
> t.printStackTrace();
> }
> }
>
> public static RuleBase loadRules()
> {
> RuleBase ruleBase=null;
> try
> {
>
> String [] ruleFiles = new String [1];
> ruleFiles[0] = "HelloWorld.drl";
>
>
>
> PackageBuilderConfiguration pkgBuilderCfg = new
> PackageBuilderConfiguration();
> pkgBuilderCfg.setCompiler(
> PackageBuilderConfiguration.JANINO);
> PackageBuilder builder = new PackageBuilder(pkgBuilderCfg);
> for( int i = 0, j = ruleFiles.length; i<j; i++ )
> {
> builder.addPackageFromDrl(new InputStreamReader(
> HelloWorldExample.class.getResourceAsStream( ruleFiles[i] )) );
> //HelloWorldExample.class.getResourceAsStream( "HelloWorld.drl" )
> //new InputStreamReader(getClass().getResourceAsStream(
> ruleFiles[i] ) )
> }
>
> final Package pkg = builder.getPackage();
> ruleBase = RuleBaseFactory.newRuleBase();
> ruleBase.addPackage(pkg);
>
>
> }
> catch (Exception fe)
> {
> fe.printStackTrace();
> }
> return ruleBase;
> }
>
> /**
> * Please note that this is the "low level" rule assembly API.
> */
> private static RuleBase readRule() throws Exception
> {
> //read in the source
> final Reader source = new InputStreamReader(
> HelloWorldExample.class.getResourceAsStream( "HelloWorld.drl" ) );
>
> //optionally read in the DSL (if you are using it).
> //Reader dsl = new InputStreamReader(
> DroolsTest.class.getResourceAsStream( "/mylang.dsl" ) );
>
> //Use package builder to build up a rule package.
> //An alternative lower level class called "DrlParser" can also be
> used...
>
> final PackageBuilder builder = new PackageBuilder();
>
> //this wil parse and compile in one step
> //NOTE: There are 2 methods here, the one argument one is for
> normal DRL.
> builder.addPackageFromDrl( source );
>
> //Use the following instead of above if you are using a DSL:
> //builder.addPackageFromDrl( source, dsl );
>
> //get the compiled package (which is serializable)
> final Package pkg = builder.getPackage();
>
> //add the package to a rulebase (deploy the rule package).
> final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
> ruleBase.addPackage( pkg );
> return ruleBase;
> }
>
> public static class Message
> {
> public static final int HELLO = 0;
> public static final int GOODBYE = 1;
>
> private String message;
>
> private int status;
>
> public String getMessage()
> {
> return this.message;
> }
>
> public void setMessage(final String message)
> {
> this.message = message;
> }
>
> public int getStatus()
> {
> return this.status;
> }
>
> public void setStatus(final int status)
> {
> this.status = status;
> }
> }
>
>
> }
>
> My HelloWorld.drl-->
> package drools_test;
>
> import HelloWorldExample.*;
>
>
> rule "Hello World"
> when
> m : Message( status == Message.HELLO, message : message )
> then
> System.out.println( message );
> m.setMessage( "Goodbye cruel world" );
> m.setStatus( Message.GOODBYE );
> modify( m );
> end
>
> rule "GoodBye"
> no-loop true
> when
> m : Message( status == Message.GOODBYE, message : message )
> then
> System.out.println( message );
> m.setMessage( message );
> end
>
> Now compilation works absolutely fine but when i am trying to run it some
> errors are coming
>
> Warning: An error occurred compiling a semantic invoker. Errors should
> have been reported elsewhere.
> Warning: An error occurred compiling a semantic invoker. Errors should
> have been reported elsewhere.
> org.drools.rule.InvalidRulePackage: Rule Compilation error Class "
> HelloWorldExample.Message" not found Class "HelloWorldExample.Message" not
> found Class "java.lang.Object" has no method named "setMessage"
> Exception:0
> Rule Compilation error Class "HelloWorldExample.Message" not found Class "
> HelloWorldExample.Message" not found Class "java.lang.Object" has no
> method named "setMessage" Exception:0
>
> at org.drools.rule.Package.checkValidity(Unknown Source)
> at org.drools.common.AbstractRuleBase.addPackage(Unknown Source)
> at HelloWorldExample.loadRules(HelloWorldExample.java:68)
> at HelloWorldExample.main(HelloWorldExample.java:29)
>
> I put all the jar files in the classpath. Please help me.
>
> With regards,
>
> Sudipta Deb. (+919831606520)
> Kolkata,India
>
> ------------------------------
> Here�s a new way to find what you're looking for - Yahoo! Answers<http://us.rd.yahoo.com/mail/in/yanswers/*http://in.answers.yahoo.com/>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
--
Edson Tirelli
Software Engineer - JBoss Rules Core Developer
Office: +55 11 3124-6000
Mobile: +55 11 9218-4151
JBoss, a division of Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20070406/3d4b1487/attachment.html
More information about the rules-users
mailing list