[jboss-jira] [JBoss JIRA] Closed: (JBRULES-2085) Modify raises NPE when using "from"

Edson Tirelli (JIRA) jira-events at lists.jboss.org
Tue May 5 16:31:46 EDT 2009


     [ https://jira.jboss.org/jira/browse/JBRULES-2085?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Edson Tirelli closed JBRULES-2085.
----------------------------------

    Resolution: Done


Fixed.

> Modify raises NPE when using "from"
> -----------------------------------
>
>                 Key: JBRULES-2085
>                 URL: https://jira.jboss.org/jira/browse/JBRULES-2085
>             Project: JBoss Drools
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: drools-core
>    Affects Versions: 5.0.0.CR1
>            Reporter: Edson Tirelli
>            Assignee: Edson Tirelli
>             Fix For: 5.0.0.GA
>
>
> The attached file should generate everyting into a subdirectory ./movie and compile and execute.
> You'll have to modify the classpath, though.
> Regards
> -W
> # Shell this file to create subdir movie with *.java, Movie.drl, database.xml
> #
> # you'll have to modify the classpath setting - see below
> #
> mkdir movie || true
> cat <<'TheEnd' >movie/Main.java
> package movie;
> import java.io.File;
> import java.io.FileInputStream;
> import java.io.FileOutputStream;
> import java.io.InputStream;
> import java.io.ObjectInputStream;
> import java.io.ObjectOutputStream;
> import java.io.OutputStream;
> import java.util.Collection;
> import javax.xml.bind.JAXBContext;
> 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.definition.KnowledgePackage;
> import org.drools.io.ResourceFactory;
> import org.drools.runtime.StatefulKnowledgeSession;
> import javax.xml.bind.Unmarshaller;
> public class Main {
>        private StatefulKnowledgeSession session;
>        public Main(){
>        }
>        public void init() throws Exception {
>        KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
>        KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
>        kBuilder.add( ResourceFactory.newFileResource( "movie/Movie.drl" ),
>                      ResourceType.DRL );
>        if( kBuilder.hasErrors() ){
>                for( KnowledgeBuilderError err: kBuilder.getErrors() ){
>                        System.out.println( err.toString() );
>                }
>                throw new IllegalStateException( "DRL errors" );
>        }
>        kBase.addKnowledgePackages( kBuilder.getKnowledgePackages() );
>                File xml = new File( "database.xml" );
>                JAXBContext jc = JAXBContext.newInstance( Database.class );
>                Unmarshaller u = jc.createUnmarshaller();
>                InputStream inputStream = new FileInputStream( xml );
>                Database db = (Database)u.unmarshal( inputStream );
>                inputStream.close();
>        session = kBase.newStatefulKnowledgeSession();
>                for( Movie m: db.getMovie() ){
>                        session.insert( m );
>                }
>                for( Actor a: db.getActor() ){
>                        session.insert( a );
>                }
>                for( Role r: db.getRole() ){
>                        session.insert( r );
>                }
>                session.fireAllRules();
>        }
>        public static void main( String[] args ) throws Exception {
>                Main rf = new Main();
>                rf.init();
>        }
> }
> TheEnd
> cat <<'TheEnd' >movie/Role.java
> package movie;
> import javax.xml.bind.annotation.XmlAttribute;
> public class Role implements Item {
>        private String actor;
>        private String movie;
>        public Role(){
>        }
>        @XmlAttribute
>        public String getActor() {
>                return actor;
>        }
>        public void setActor(String actor) {
>                this.actor = actor;
>        }
>        @XmlAttribute
>        public String getMovie() {
>                return movie;
>        }
>        public void setMovie(String movie) {
>                this.movie = movie;
>        }
>        @Override
>        public String toString(){
>                return actor + " plays in " + movie;
>        }
> }
> TheEnd
> cat <<'TheEnd' >movie/Movie.java
> package movie;
> import java.util.HashSet;
> import java.util.Set;
> import javax.xml.bind.annotation.XmlAttribute;
> public class Movie implements Item {
>        private String title;
>        private Set<Actor> cast;
>        public Movie(){
>        }
>        @XmlAttribute
>        public String getTitle() {
>                return title;
>        }
>        public void setTitle(String title) {
>                this.title = title;
>        }
>        public Set<Actor> getCast(){
>                if( cast == null ) cast = new HashSet<Actor>();
>                return cast;
>        }
>        @Override
>        public int hashCode(){
>                return title.hashCode();
>        }
>        @Override
>        public boolean equals( Object o ){
>                if( ! (o instanceof Movie ) ) return false;
>                return this.title.equals( ((Movie)o).getTitle() );
>        }
>        @Override
>        public String toString(){
>                StringBuilder sb = new StringBuilder();
>                sb.append( title ).append( "\n" );
>                for( Actor a: getCast() ){
>                        sb.append( "  " ).append( a.getName() ).append( "\n" );
>                }
>                return sb.toString();
>        }
> }
> TheEnd
> cat <<'TheEnd' >movie/Item.java
> package movie;
> /**
>  * Marker interface for WMEs
>  * @author Wolfgang Laun
>  */
> public interface Item {
> }
> TheEnd
> cat <<'TheEnd' >movie/Database.java
> package movie;
> import java.util.ArrayList;
> import java.util.List;
> import javax.xml.bind.annotation.XmlElement;
> import javax.xml.bind.annotation.XmlRootElement;
> import javax.xml.bind.annotation.XmlType;
> @XmlRootElement
> @XmlType(propOrder={"movie", "actor" , "role" })
> public class Database {
>        private List<Movie> movie;
>        private List<Actor> actor;
>        private List<Role> role;
>        public Database(){
>        }
>        @XmlElement
>        public List<Movie> getMovie() {
>                if( movie == null ) movie = new ArrayList<Movie>();
>                return movie;
>        }
>        @XmlElement
>        public List<Actor> getActor() {
>                if( actor == null ) actor = new ArrayList<Actor>();
>                return actor;
>        }
>        @XmlElement
>        public List<Role> getRole() {
>                if( role == null ) role = new ArrayList<Role>();
>                return role;
>        }
> }
> TheEnd
> cat <<'TheEnd' >movie/Actor.java
> package movie;
> import java.util.ArrayList;
> import java.util.List;
> import javax.xml.bind.annotation.XmlAttribute;
> public class Actor implements Item {
>        private String name;
>        private List<Movie> movies;
>        public Actor(){
>        }
>        @XmlAttribute
>        public String getName() {
>                return name;
>        }
>        public void setName(String name) {
>                this.name = name;
>        }
>        public List<Movie> getMovies(){
>                if( movies == null ) movies = new ArrayList<Movie>();
>                return movies;
>        }
>        @Override
>        public String toString(){
>                StringBuilder sb = new StringBuilder();
>                sb.append( name ).append( "\n" );
>                for( Movie m: getMovies() ){
>                        sb.append( "  " ).append( m.getTitle() ).append( "\n" );
>                }
>                return sb.toString();
>        }
>        @Override
>        public int hashCode(){
>                return name.hashCode();
>        }
>        @Override
>        public boolean equals( Object o ){
>                if( ! (o instanceof Actor ) ) return false;
>                return this.name.equals( ((Actor)o).getName() );
>        }
> }
> TheEnd
> cat <<'TheEnd' >movie/Movie.drl
> package movie;
> /***
>  - List<?> as fact field type
>  - Set<?> as fact field type
>  - Match WMEs with elements from field with List<?> type: from
>  - inline eval() for determining membership in Collection()
>  - Write rules for a set of WME types using a "marker" interface.
> */
> #
> # Fill the Movies' cast lists with data from Role.
> #
> rule fillCast
>    salience 100
>    when
>        $r : Role( $actor : actor, $movie : movie )
>        $a : Actor( name == $actor )
>        $m : Movie( title == $movie )
>    then
>        modify( $m ){
>            getCast().add( $a );
>        }
>        retract( $r );
> end
> #
> # Fill the Actors' list of movies with data from a Movie's cast list
> #
> rule fillMovies
>    salience 90
>    when
>        $m : Movie( $cast : cast )
>        $a : Actor() from $cast
>    then
>        System.out.println( "movie " + $m.getTitle() + " actor " + $a.getName() );
>        modify( $a ){
>            getMovies().add( $m );
>        }
> end
> #
> # Find a movie where HB and LB are in together
> #
> rule findHBLB
>    when
>        $hb : Actor( name == "Humphrey Bogart" )
>        $lb : Actor( name == "Lauren Bacall" )
>        $m : Movie( $title : title, $cast : cast, eval( $cast.contains( $hb ) && $cast.contains( $lb ) ) )
>    then
>        System.out.println( "HB & LB together in " + $title );
> end
> #
> # Display any WME
> #
> rule showItem
>    salience -100
>    when
>        $i : Item()
>    then
>        System.out.println( $i.toString() );
> end
> TheEnd
> cat <<'TheEnd' >database.xml
> <?xml version="1.0" encoding="UTF-8"?>
> <database>
> <movie title="Casablanca"/>
> <movie title="Key Largo"/>
> <movie title="To Have and Have Not"/>
> <movie title="The African Queen"/>
> <actor name="Humphrey Bogart"/>
> <actor name="Katherine Hepburn"/>
> <actor name="Ingrid Bergman"/>
> <actor name="Lauren Bacall"/>
> <role actor="Humphrey Bogart" movie="Casablanca"/>
> <role actor="Ingrid Bergman"  movie="Casablanca"/>
> <role actor="Humphrey Bogart" movie="The African Queen"/>
> <role actor="Humphrey Bogart" movie="Key Largo"/>
> <role actor="Humphrey Bogart" movie="To Have and Have Not"/>
> <role actor="Lauren Bacall" movie="To Have and Have Not"/>
> <role actor="Lauren Bacall" movie="Key Largo"/>
> <role actor="Katherine Hepburn" movie="The African Queen"/>
> </database>
> TheEnd
> export CLASSPATH=.:/extra/Drools-5.0.1.SNAPSHOT/drools-core.jar:/extra/Drools-5.0.1.SNAPSHOT/drools-api.jar:/extra/Drools-5.0.1.SNAPSHOT/drools-compiler.jar:/extra/Drools-5.0.1.SNAPSHOT/drools-ant.jar:/extra/Drools-5.0.1.SNAPSHOT/antlr-runtime.jar:/usr/local/eclipse/plugins/org.eclipse.jdt.core_3.4.4.v_894_R34x.jar:/extra/Drools-5.0.0.CR1/bin/lib/mvel2-2.0.8pre1.jar
> javac movie/*.java
> java movie/Main
> cat <<'TheEnd'
> #
> # This is what I get:
> #
> movie Casablanca actor Ingrid Bergman
> Exception in thread "main" org.drools.runtime.rule.ConsequenceException: java.lang.NullPointerException
>        at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:23)
>        at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:943)
>        at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:885)
>        at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1086)
>        at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:682)
>        at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:649)
>        at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:183)
>        at movie.Main.init(Main.java:65)
>        at movie.Main.main(Main.java:70)
> Caused by: java.lang.NullPointerException
>        at org.drools.base.DefaultKnowledgeHelper.modifyRetract(DefaultKnowledgeHelper.java:190)
>        at movie.Rule_fillMovies_0.consequence(Rule_fillMovies_0.java:8)
>        at movie.Rule_fillMovies_0ConsequenceInvoker.evaluate(Rule_fillMovies_0ConsequenceInvoker.java:28)
>        at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:934)
>        ... 7 more
> TheEnd

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the jboss-jira mailing list