续:import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
 * 时间规则项条件检验
 * @author lbm
 */
public class TimeRuleItemValidator implements IRuleItemValidator {

private static final long serialVersionUID = -502446892456913630L;

private String srcTime;
private String srcStartTime;
private String srcEndTime; public TimeRuleItemValidator(String srcTime) {
this.srcTime = srcTime;
String[] srcTimes = this.srcTime.split("--");
this.srcStartTime = srcTimes[0];
this.srcEndTime = srcTimes[1];
} public String getTypeName() {
return "Time";
} public boolean isValid() throws RuleItemValidateException{
Date todayDate=new Date();
SimpleDateFormat fmtToday = new SimpleDateFormat("yyyy-MM-dd");
String todayString=fmtToday.format(todayDate);
String srcStartTimeBak=srcStartTime;
String srcEndTimeBak=srcEndTime;
srcStartTime=todayString+" "+srcStartTime;
srcEndTime=todayString+" "+srcEndTime;

Calendar startCalendar = new GregorianCalendar();
Calendar endCalendar = new GregorianCalendar();
Calendar currentCalendar = new GregorianCalendar();
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //HH:mm:ss
Date startTime;
Date endTime;
try {
startTime = fmt.parse(srcStartTime);
} catch (ParseException e) {
throw new RuleItemValidateException("起始时间["+srcStartTimeBak+"]格式或内容有错误!");
}
try {
endTime = fmt.parse(srcEndTime);
} catch (ParseException e) {
throw new RuleItemValidateException("结束时间["+srcEndTimeBak+"]格式或内容有错误!");
}
startCalendar.setTime(startTime); // 起始时间
endCalendar.setTime(endTime); // 结束时间
currentCalendar.setTime(new Date()); // 当前时间
if (currentCalendar.after(startCalendar)
&& currentCalendar.before(endCalendar))
return true;
else
return false;
}

// public static void main(String[] args) throws RuleItemValidateException {
// String srcTime="18:0:0--23:00:00";
// TimeRuleItemValidator time=new TimeRuleItemValidator(srcTime);
// System.out.println(time.isValid());
// }
}/**
 * 规则项检验适配器
 * @author lbm
 */
public class RuleItemValidateAdapter {

private IRuleItemValidator itemValidator;

public void init(IRuleItem ruleItem, String... destParam) throws RuleItemValidateException{
String type=ruleItem.getItemName(); //得到规则项的类型名称
String srcParam=ruleItem.getItemParameter(); //得到规则项的类型参数
int destParamLength=destParam.length;
if("IP".equalsIgnoreCase(type)){
String srcIP=srcParam;
if(destParamLength==1){
String destIP=destParam[0];
itemValidator=new IPRuleItemValidator(srcIP,destIP);
}else{
throw new RuleItemValidateException("当进行IP判断时,目的参数有且只能有一个!");
}
}else if("Date".equalsIgnoreCase(type)){
itemValidator=new DateRuleItemValidator(srcParam);
}else if("Time".equalsIgnoreCase(type)){
itemValidator=new TimeRuleItemValidator(srcParam);
}else{
throw new RuleItemValidateException("类型["+type+"]错误:只能是IP、Date或Time");
}
}

public boolean isValid() throws RuleItemValidateException,NullPointerException{
if(itemValidator==null){
throw new NullPointerException("由于规则项检验器未进行初始化工作,无法进行规则项的检验!");
}else{
return itemValidator.isValid();
}
}

public String getTypeName() throws RuleItemValidateException,NullPointerException{
if(itemValidator==null){
throw new NullPointerException("由于规则项检验器未进行初始化工作,无法获取规则项的类型名称!");
}else{
return itemValidator.getTypeName();
}
}

// public static void main(String[] args) throws RuleItemValidateException {
// RuleItemValidateAdapter va=new RuleItemValidateAdapter();
// IRuleItem ipItem=new RuleItem();
// ipItem.setItemName("IP");
// ipItem.setItemParameter("192.168.10.110--192.168.10.120");
// va.init(ipItem,"192.168.10.113");
// //System.out.println(va.getTypeName());
// boolean ipFlag=va.isValid();
// System.out.println(ipFlag);
//
// IRuleItem dateItem=new RuleItem();
// dateItem.setItemName("Date");
// dateItem.setItemParameter("2010-01-19--2011-01-20");
// va.init(dateItem);
// //System.out.println(va.getTypeName());
// boolean dateFlag=va.isValid();
// System.out.println(dateFlag);
//
// IRuleItem timeItem=new RuleItem();
// timeItem.setItemName("Time");
// timeItem.setItemParameter("0:0:0--10:0:0");
// //System.out.println(va.getTypeName());
// va.init(timeItem);
// boolean timeFlag=va.isValid();
// System.out.println(timeFlag);
// }
}
RuleItemValidateException 是一个继续Exception的一个类,提供4个构造器即可!

解决方案 »

  1.   

    RuleItemValidateException 是一个继续Exception的一个类,提供4个构造器即可! 
      

  2.   

    同时需要说明的是:在类型描述中,IP、Date和Time并不是枚举出的所有内容,也就是说,以后还有可能添加别的字段进行类型条件的判断
    这个你还没有实现吧?不过我觉得你现在的框架添加这部分实现不是问题!
    顶了,写的很好哇!!
      

  3.   

    楼主写的很好啊,我可以就数据库设计提点意见么?你的re字段估计从规则提取匹配方面来讲,没什么用,seq、typeName也没问题,但感觉你的TypeParameter是否可以拆分一下呢?比如日期型2010-01-01--2010-06-06是否可以拆成startParameter和endParameter两个字段?这样,一些匹配工作完全可以从数据库sql方面来进行第一次过滤。
    像seq=6的这条记录,是否又可以拆成3条记录来插入?像seq=1这种,如果采用范围,则可以只填startParameter或者startParameter和endParameter填成一样。
    这里的几种取数据的规则,无非是几个原则:
    1。固定值(如seq=1)
    2。范围值(如seq=2、3、4、5、7)
    3。枚举(如seq=6),这种类型可以看作是1,就如我上面说的拆成3条记录一样。
    另外,楼主这里只是囊括了所有(是)的规则,而所有(非)的规则,没有被包含。比如,我需要禁止"http://www.baidu.com"这个网站所有的访问,其他的都不禁止,那么你的这个规则表,似乎无法满足啊,总不能把所有可以的都放进来吧?所以个人认为是否需要加个字段,来表示处于这个规则内部的是需要(true)还是(false)。以上都是个人意见,楼主参考下吧。
    200分啊,馋~~~