[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