package org.stephencat.listener;
import java.io.IOException;
import java.io.*;
import java.util.*;

import javax.servlet.*;
/**
 * 自动监听任务
 * 
@author stephen
 *
 
*/
public class PropertiesTask extends TimerTask {
    
    
private ServletContext context = null;
    
/**
     * 配置文件的最后更新时间
     
*/
    
private long lastModified = 0;
    
    
/**
     * 构造一个自动更新任务
     * 
@param context
     
*/
    
public PropertiesTask(ServletContext context){
        
this.context = context;
        System.out.println(
"A task instance is created now."); // 任务在整个 application 周期内只创建一次。
    }
    
    
/**
     * 每次执行任务时显示一个随机数。
     
*/
    
public void todoTestRandom(){
        System.out.println(
"Task running");
        context.setAttribute(
"random", String.valueOf(Math.random()));
        System.out.println((String)context.getAttribute(
"random"));
    }
    
    
/**
     * 监听配置文件是否被更新。
     
*/
    
public void todoTestFileStatus(){
        System.out.println(
"Getting file status");
        System.out.println(
this.isFileUpdated("WEB-INF/platforms/test.properties"));
    }
    
    
/**
     * 监听配置文件是否被更新,自动更新文件中的配置项存储到 application 变量中。
     
*/
    
public void todo(){
        String filename 
= "WEB-INF/platforms/test.properties";
        
if(this.isFileUpdated(filename)){
            
            System.out.println(
"Getting properties");
            
try{
                
this.loadProperties("test", filename);
            }
catch(IOException ioe){
                System.err.println(ioe.getMessage());
            }
        }
        System.out.println(
"Test value is: " + this.getTestProperty("name"));
    }
    
    
public void run() {
        todoTestRandom();
        todo();
        
//todo();
    }
    
    
/**
     * 判断物理文件是否已被更新
     * 
@param filename 物理文件名
     * 
@return 是 true 否 false
     
*/
    
private boolean isFileUpdated(String filename){
        File file 
= new File(context.getRealPath(filename));
        
if(file.isFile()){
            
long lastUpdateTime = file.lastModified();
            
if(lastUpdateTime > this.lastModified){
                System.out.println(
"The properties file was modified.");
                
this.lastModified = lastUpdateTime;
                
return true;
            }
else{
                System.out.println(
"The properties file was not modified.");
                
return false;
            }
        }
else{
            System.out.println(
"The path does not point to a file.");
            
return false;
        }
    }
    
    
/**
     * 获取配置文件
     * 
@param key
     * 
@param filename
     * 
@return
     
*/
    
public void loadProperties(String key, String filename) throws IOException{
        Properties prop 
= new Properties();
        InputStream stream 
= context.getResourceAsStream(filename);
        prop.load(stream);
        
if(stream!=null){
            stream.close();
        }
        context.setAttribute(key, prop);
    }
    
    
/**
     * 从 application 取配置项的值
     * 
@param key 配置项的键名
     * 
@return 配置项的值
     
*/
    
public String getTestProperty(String key){
        Properties prop 
= (Properties)context.getAttribute("test");
        
if(prop==null){
            
return null;
        }
else{
            
return (String)prop.get(key);
        }
    }

}
posted on 2011-02-10 23:12  雨↑辰  阅读(417)  评论(0编辑  收藏  举报