Java drools中的列表验证

Java drools中的列表验证,java,drools,Java,Drools,一个流口水的新手, 下面是java类结构 public class Person { List<PersonAddress> personAddress; } public enum AddressType { CURRENT, PREVIOUS; } public class PersonAddress{ Address address; AddressType type Integer timeAtAddress; } public c

一个流口水的新手, 下面是java类结构

public class Person {
 List<PersonAddress> personAddress;
}

public enum AddressType {
 CURRENT, PREVIOUS;
}
public class PersonAddress{    
  Address address;
  AddressType type
  Integer timeAtAddress;        
}

public class Address {
String city;
String country;
String street;
}
公共类人物{
列出个人地址;
}
公共枚举地址类型{
当前的,以前的;
}
公共类人物地址{
地址;
地址类型
整数时间地址;
}
公共课堂演讲{
字符串城市;
弦国;
弦街;;
}
我必须编写一些代码来验证drools中的PersonalAddress。 规则1。若person有PersonalAddress实例列表,若其中一个是AddressType==CURRENT和timeAtAddress<3,那个么我想找出该列表是否包含AddressType==PREVIOUS的地址

规则2。如果上述条件为true,那么我想获取PersonalAddress实例,其中AddressType==PREVIOUS

Drools版本5.5.0.Final

Java 1.7

可以使用函数

这是我试过的,但不起作用

  function boolean isPreviousAddressExist(java.util.List list) {
        if(list.isEmpty()) {
            return false;
        }
        boolean validRecordFound = false;
        for(int addressIndex = 0; addressIndex < list.size(); addressIndex++) {
            PersonAddress pa = (PersonAddress)list.get(addressIndex);
            if(AddressType.CURRENT.equals(pa.getAddressType()) && pa.getTimeAtAddress() != null && pa.getTimeAtAddress() < 3) {
                validRecordFound =  true;
                break;     
            }
        }
        boolean previousRecordFound = false;
        if(validRecordFound) {
           for(int addressIndex = 0; addressIndex < list.size(); addressIndex++) {
                PersonAddress pa = (PersonAddress)list.get(addressIndex);
                if(AddressType.PREVIOUS.equals(pa.getAddressType())) {
                    previousRecordFound =  true;
                    break;
                }
            }
        } else {
            previousRecordFound = true;
        }
        return previousRecordFound;
    }

rule "Previous-Physical-Home Address is required for Time at Current-Physical-Home"
when

    $quotation:Quotation()        
    eval(!isPreviousAddressExist($quotation.getApplicantList()))   
then   
    runningResults.addRunningResult(new BusinessRuleRunningResult(null,  " A Previous physical Home Address is required.", false));
end
布尔函数isPreviousAddressExist(java.util.List){
if(list.isEmpty()){
返回false;
}
布尔值validRecordFound=false;
对于(int addressIndex=0;addressIndex
以下是两条规则,使用
扩展
以避免重复:

rule "brief CURRENT"
when
  Person( $name: name, $pa: personAddress )
  PersonAddress( type == AddressType.CURRENT, timeAtAddress < 3 ) from $pa
then
end
rule "no PREVIOUS"
extends "brief CURRENT"
when
  not PersonAddress( type == AddressType.PREVIOUS ) from $pa
then
  System.out.println( "invalid. " + $name );
end
rule "has PREVIOUS"
extends "brief CURRENT"
when
  $ppa: PersonAddress( type == AddressType.PREVIOUS ) from $pa
then
  System.out.println( "valid. " + $name +
                      " at " + $ppa.getAddress().getCity() );
end
规则“简短当前”
什么时候
Person($name:name,$pa:PersonalAddress)
$pa中的PersonalAddress(type==AddressType.CURRENT,timeAtAddress<3)
然后
结束
规则“无前科”
扩展“短电流”
什么时候
不是$pa中的PersonalAddress(type==AddressType.PREVIOUS)
然后
System.out.println(“无效”。+$name);
结束
规则“有以前的”
扩展“短电流”
什么时候
$ppa:PersonalAddress(type==AddressType.PREVIOUS)来自$pa
然后
System.out.println(“有效”。+$name+
“+ppa.getAddress().getCity());
结束
这假设每个人只有一个电流;如果没有,规则可能会不止一次地失效。使用
exist
避免


我没有试图在你的代码中发现bug,因为“不工作”太模糊了。无论如何,如果您使用的是规则,那么编写过程代码进行检查有什么意义?

非常感谢,这正是我想要的。正如我所说的,我是drools的新手,我们的应用程序是完整的j2ee应用程序,我们的一个客户要求我们使用droolsDear@laune进行一些验证,我还有一个关于drools的问题,有人问过,谢谢,如果你能帮我的话too@laune,请看这个问题-