接上篇文章动态修改properties文件,中的FileWacthdog.java作为父类,代码如下:
import org.apache.commons.digester.Digester; /** * <p> * Info: 动态加载collectionsFavourableActivity.xml文件,<br /> * 该文件使用 common-digester 库解析因此解析的文件要符合digester库要求的格式。 * </p> * <p> * Date: 2014-4-28 14:22:54 * </p> * @author zhangyq * */ public class CollectionsFavourableActiDynamicLoading { //------- 实体类变量 ---------------------------------- private static CollectionsFavourableActivity activity; public static CollectionsFavourableActivity getActivity() { return activity; } /** * 根据传递的文件配置并加载该文件 * @param configFilename 要解析文件的绝对路径 * @param delay 检验文件的间隔时间段 */ public static void configureAndLoad(String configFilename,long delay) { PropertyWatchdog pdog = new PropertyWatchdog(configFilename); pdog.setDelay(delay); pdog.start(); } //-------------------------------------- 静态内部类定义 -------------------------- /** * Info: 动态读取配置文件的信息 * @author zhangyq */ static class PropertyWatchdog extends FileWatchdog { /** * 构造函数 * @param configFileName 绝对路径 */ PropertyWatchdog(String filename){ super(filename); } @Override protected void doOnChange() { try { Digester digester = new Digester(); digester.addObjectCreate("CollectionsFavourableActivity",CollectionsFavourableActivity.class); digester.addSetProperties("CollectionsFavourableActivity"); activity = (CollectionsFavourableActivity) digester.parse(file); } catch (Exception e) { return; } } } //--------------------------------------end 静态内部类定义 end-------------------------- }
使用Digester库解析xml文件,上述解析的xml文件为:
<?xml version="1.0" encoding="UTF-8"?> <CollectionsFavourableActivity avtivitySatrtDate="2014-05-10 00:00:00" avtivityEndDate="2014-06-10 23:59:59" upperLimit="0" lowerLimit="1000" maxCountEveryMounth="3"> </CollectionsFavourableActivity>
Digester库解析后生成的对象类为:
public class CollectionsFavourableActivity { //----------------------------------------------- Instance Constants ---------------------- private String avtivitySatrtDate;//活动开始日期 private String avtivityEndDate;//活动结束日期 private Double upperLimit;//上限金额 private Double lowerLimit;//下限金额 private int maxCountEveryMounth;//每月最多优惠笔数 /** * 空的构造函数 */ public CollectionsFavourableActivity(){ super(); } /** * 一档 1000元(含)-5000元 10 10 * 二档 5001-10000元 50 50 * 三档 10001-50000(含)元 80 80 * 四档 50001-200000含)元 120 120 * 五档 200001元以上 150 150 * Info: 根据支付金额的及优惠笔数获得优惠后的金额 * @param orderPrice 订单金额 * @return 计算后的金额 */ public static double cal(double orderPrice){ double result = 0.0; if (orderPrice < 1000 && orderPrice > 0) { result = orderPrice; } else if (orderPrice >=1000 && orderPrice <= 5000) { result = orderPrice - 10; }else if (orderPrice > 5000 && orderPrice <= 10000) { result = orderPrice - 50; }else if (orderPrice > 10000 && orderPrice <= 50000) { result = orderPrice - 80; }else if (orderPrice > 50000 && orderPrice <= 200000) { result = orderPrice - 120; }else if (orderPrice > 200000) { result = orderPrice - 150; } return result ; } @Override public String toString() { return "{开始日期:"+avtivitySatrtDate+" 结束日期:"+avtivityEndDate+"\r\n"+ "上限金额:"+upperLimit.doubleValue()+" 下限金额:"+lowerLimit.doubleValue()+"\r\n"+ " 每月最多优惠笔数:"+maxCountEveryMounth+"}"; } //----------------------------------- start getter setter ----------------------------- public Double getUpperLimit() { return upperLimit; } public void setUpperLimit(Double upperLimit) { this.upperLimit = upperLimit; } public Double getLowerLimit() { return lowerLimit; } public void setLowerLimit(Double lowerLimit) { this.lowerLimit = lowerLimit; } public int getMaxCountEveryMounth() { return maxCountEveryMounth; } public void setMaxCountEveryMounth(int maxCountEveryMounth) { this.maxCountEveryMounth = maxCountEveryMounth; } public String getAvtivitySatrtDate() { return avtivitySatrtDate; } public void setAvtivitySatrtDate(String avtivitySatrtDate) { this.avtivitySatrtDate = avtivitySatrtDate; } public String getAvtivityEndDate() { return avtivityEndDate; } public void setAvtivityEndDate(String avtivityEndDate) { this.avtivityEndDate = avtivityEndDate; } //----------------------------------- end getter setter ----------------------------- }
测试使用:
CollectionsFavourableActiDynamicLoading.configureAndLoad(configFilename,delay); CollectionsFavourableActivity activity = CollectionsFavourableActiDynamicLoading.getActivity();