移:xdoclet2学习笔记

来源:互联网 发布:淘宝网上怎么备案啊 编辑:程序博客网 时间:2024/06/06 20:39
一个Xdoclet2插件由三部分组成:
TemplateEngine,MetadataProvider,WriterMapper,通常使用构造函数来建立一个Plugin。
TemplateEngine表示使用的模版库,可以选择JellyTemplateEngine和VelocityTemplateEngine。
MetadataProvider表示数据来源,xdoclet2通过qdox来获得java source中的tag。如果数据来源不是从java source中获得(比如数据库),也可以定义自己实现这个MetadataProvider
WriterMapper是一个流输出,xdoclet2有一个默认FileWriterMapper实现文件的数据输出
例如Struts plugin是这样定义构造函数的:
public StrutsConfigXMLPlugin(JellyTemplateEngine jellyTemplateEngine, QDoxCapableMetadataProvider metadataProvider, WriterMapper writerMapper) {
        super(jellyTemplateEngine, metadataProvider, writerMapper);
        setMultioutput(false);
        Map dtds = Collections.singletonMap("http://struts.apache.org/dtds/struts-config_1_2.dtd",
                getClass().getResource("struts-config_1_2.dtd"));
        setOutputValidator(new XMLOutputValidator(dtds));
        new TagLibrary(metadataProvider);
}
此构造函数说明:struts plugin采用的是Jelly模版,数据来源于java文件采用Qdox进行分析。
setMultioutput(false);表示只生产一个文件。
new TagLibrary(metadataProvider);是一个愚蠢的写法,实际上new TagLibrary只是把tag注册到DocletTagFactory,与metadataProvider和TagLibrary无关。
xdoclet2对于每一个tag都有一个具体的实现类,通过registerTag方法实现,比如 metadataProvider.getDocletTagFactory().registerTag(StrutsActionExceptionTagImpl.NAME, StrutsActionExceptionTagImpl.class);
 
Plugin基类是org.generma.Plugin,入口方法是start()
org.xdoclet.ant.XDocletTask类是ant入口类,它的核心引用org.xdoclet.QDoxMetadataProvider.getMetadata(),把com.thoughtworks.qdox.JavaDocBuilder作为数据的来源。
由此可见,xdoclet借助于picocontainer,generama,qdox可以很容易的编写一个插件。
但是也存在问题:
1.数据来源都存在于java的doclet中,来源到生成的代码逻辑却全部写在jelly或者velocity模版中,造成模版过于复杂。
2.生产的目标只能是文件,不支持其他流输出,对于生成的目标文件,只能是增,删,无法修改,没有一个良好的writerMapper模型
3.编写新插件需要学习太多的内容,如xdoclet,generama,picocontainer,nanocontainer,qdox,jelly/velocity等,学习难度较大,并且没有良好的文档帮助。