Uploaded image for project: 'Drools'
  1. Drools
  2. DROOLS-6542

Issue with modify statement in mvel dialect

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • None
    • 7.51.0.Final, 7.58.0.Final
    • core engine
    • None
    • 2021 Week 34-36 (from Aug 23)
    • Undefined
    • NEW
    • NEW

      Issue was introduced in 5.51.0.Final and stays with the latest version, 5.50.0.Final passes the test. Issue is reproducible only with mvel dialect.
      Most likely this is related to the fix of RHDM-1552

      ModifyTest.java

      public class ModifyTest {
        
        @Test
        public void testModify() {
          ...
          session.insert(new Passport("CA-SARAH-1", LocalDate.of(2017, 1, 17)));
          session.insert(new VisaApplication(1, "CA-SARAH-1"));
          
          session.fireAllRules();
          
          assertTrue(session.getObjects((Object object) -> {
            return object instanceof String;
          }).isEmpty());
        }
      }
      

      rules

      dialect "mvel"
      
      import Passport;
      import Validation;
      import VisaApplication;
      
      rule "Expired passport"
        salience 3
        when
          $passport: Passport( expired == true )
        then
          System.out.println( $passport + " is INVALID because it is expired" );
          modify($passport) {
            setValidation( Validation.FAILED ),
            setCause( "passport is expired" )
          }
      end
      
      rule "Invalidate visa application with invalid passport"
        salience 2
        when
          $passport: Passport( validation == Validation.FAILED )
          $visaApplication: VisaApplication( passportNumber == $passport.passportNumber, validation != Validation.FAILED )
        then
          System.out.println( "Set " + $visaApplication + " invalid as " + $passport + " hasn't passed validation");
          modify($visaApplication) {
            setValidation( Validation.FAILED )
          }
      end
      
      rule "Set application without validation info as passed"
        salience 1
        when
          $visaApplication: VisaApplication( validation == Validation.UNKNOWN )
        then
          System.out.println( $visaApplication + " is without validation info, consider OK for now" );
          modify($visaApplication) {
            setValidation( Validation.PASSED )
          }
          insert ("fail");
      end
      

      Passport.java

      import static Validation.UNKNOWN;
      import static java.lang.String.format;
      
      import java.time.LocalDate;
      
      public class Passport {
        private String passportNumber;
        private LocalDate expiresOn;
        private Validation validation = UNKNOWN;
        
        private String cause = "";
        
        public Passport(String passportNumber, LocalDate expiresOn) {
          this.passportNumber = passportNumber;
          this.expiresOn = expiresOn;
        }
        
        public boolean isExpired() {
          return expiresOn.isBefore(LocalDate.now());
        }
        
        public String getPassportNumber() {
          return passportNumber;
        }
        
        public Validation getValidation() {
          return validation;
        }
        
        public void setValidation(Validation validation) {
          this.validation = validation;
        }
        
        public String getCause() {
          return cause;
        }
        
        public void setCause(String cause) {
          this.cause = cause;
        }
        
        @Override
        public String toString() {
          return format("Passport[no:%s]", passportNumber);
        }
      }
      

      VisaApplication.java

      import static Validation.UNKNOWN;
      
      public class VisaApplication {
        private int applicationId;
        private String passportNumber;
        private Validation validation = UNKNOWN;
        
        public VisaApplication(int applicationId, String passportNumber) {
          this.applicationId = applicationId;
          this.passportNumber = passportNumber;
        }
        
        public String getPassportNumber() {
          return passportNumber;
        }
        
        public Validation getValidation() {
          return validation;
        }
        
        public void setValidation(Validation validation) {
          this.validation = validation;
        }
        
        @Override
        public String toString() {
          return "VisaApplication(#" + applicationId + ", pass:" + passportNumber + ")";
        }
      }
      

      Validation.java

      public enum Validation {
      	PASSED, FAILED, UNKNOWN
      }
      

            mfusco@redhat.com Mario Fusco
            madamovych Mykhaylo Adamovych
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: