俊星的BLOG

COMMON DIGESTER之我的PLUGIN

Common Digester附带了一个插件机制,可以实现很好的地址,下面是我的一个简单实现:
1、业务接口:
public interface Transform {
    
public String transform(String s);
}

2、业务接口的实现类:
public class CaseTransformer implements Transform {
    
private boolean upper;

    
public void setCase(String s) {
        upper 
= "upper".equalsIgnoreCase(s.trim());
    }


    
public String transform(String s) {
        
if (s == null{
            
return "";
        }

        
return upper ? s.toUpperCase() : s.toLowerCase();
    }


}


3、插件创建规则:
package mydigest;

import org.xml.sax.Attributes;

public class MyPluginCreateRule extends MyRule {
    
private Class<?> baseClass;
    
public static final String DEFT_PLUGIN_CLASS_ATTR = "plugin-class";

    
public MyPluginCreateRule(Class<?> clazz) {
        baseClass 
= clazz;
    }


    
/** 开始处理 */
    
public void begin(String namespace, String name, Attributes attributes) throws Exception {
        String value 
= attributes.getValue(DEFT_PLUGIN_CLASS_ATTR);
        Class
<?> clazz = dig.getClassLoader().loadClass(value);
        Object instance 
= clazz.newInstance();
        
if (baseClass.isAssignableFrom(clazz)) {
            dig.push(instance);
        }

    }


    
/** 处理结束 */
    
public void end(String namespace, String name) throws Exception {
        dig.pop();
    }


}


4、配置文件upperconfig.xml:

<piple>
    
<src file="input.txt"/>
    
<transform plugin-class="mydigest.CaseTransformer" case="upper"/>
    
<dest file="output.txt"/>
</piple>

5、测试:
package mydigest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Piple {
    
private String src;
    
private Transform transformer;
    
private String dest;

    
public static void main(String[] args) {
        String file 
= "upperconfig.xml";
        MyDigester dig 
= new MyDigester();
        dig.addObjectCreate(
"piple", Piple.class);
        
// 源文件
        dig.addCallMethod("piple/src""setSrc"1);
        dig.addCallParam(
"piple/src"0"file");
        
// 添加插件
        MyPluginCreateRule pcr = new MyPluginCreateRule(Transform.class);
        dig.addRule(
"piple/transform", pcr);
        dig.addSetProperties(
"piple/transform");
        dig.addSetNext(
"piple/transform""setTransform");
        
        
// 目标文件
        dig.addCallMethod("piple/dest""setDest"1);
        dig.addCallParam(
"piple/dest"0"file");
        
try {
            Piple piple 
= (Piple) dig.parse(new File(file));
            piple.exec();
        }
 catch (Exception e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    
public void setSrc(String src) {
        
this.src = src;
    }


    
public void setTransform(Transform transformer) {
        
this.transformer = transformer;
    }


    
public void setDest(String dest) {
        
this.dest = dest;
    }


    
public void exec() throws IOException {
        BufferedReader reader 
= new BufferedReader(new FileReader(src));
        FileWriter writer 
= new FileWriter(new File(dest));
        String line 
= reader.readLine();
        
while (line != null{
            writer.write(
this.transformer.transform(line) + '\n');
            line 
= reader.readLine();
        }

        writer.close();
        reader.close();
        System.out.println(
"exec done!");
    }

}


inut.txt文件:
Copyright
Copyright  
2004 O'Reilly Media, Inc.

Printed in the United States of America.

Published by O'Reilly MediaInc.
, 1005 Gravenstein Highway North, Sebastopol, CA 95472.

得到的output.xml文件:
COPYRIGHT
COPYRIGHT  
2004 O'REILLY MEDIA, INC.

PRINTED IN THE UNITED STATES OF AMERICA.

PUBLISHED BY O'REILLY MEDIAINC.
, 1005 GRAVENSTEIN HIGHWAY NORTH, SEBASTOPOL, CA 95472.

posted on 2009-05-02 15:51 俊星 阅读(195) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问