mule改头换面历程

编程入门 行业动态 更新时间:2024-10-06 01:42:48

mule<a href=https://www.elefans.com/category/jswz/34/1765275.html style=改头换面历程"/>

mule改头换面历程

这两天将mule重构了一下,主要是类、包、配置文件的重命名;去除了mule的印记。其中配置文件主要是将xml文件的命名空间、顶级标签、以及xsd做了整理。大致记录如下。

类和包的命名重构很简单,在Eclipse中选择javaEE的视图,然后选中org.mule这个包名,右键选择Refactor》Rename。在对话框中将选项“Update Reference”下边的三个选项也都选中,剩下的就很简单了。
这个说起来简单,实际我也走了一段弯路。最开始没注意下边三个选项,结果一个子包一个子包的选中,然后Refactor,累个够呛。 :-) 后经人提醒才注意下边三个选项,于是一切都变得简单自然。

最复杂的是对于其配置文件的重构。在mule的xml配置文件中,第一:顶级标签必须是mule;第二:命名空间必须是类似于这样:
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns=".2"
xmlns:xsi=
xmlns:jms=".2"
xmlns:file=".2"
xsi:schemaLocation="
.2 .2/mule.xsd
.2 .2/mule-jms.xsd
.2 .2/mule-file.xsd">
链接:+the+XML+Configuration+File

而我的目标就是不让mule这个词出现。好了,我们开始。

首先了解一下mule是如何配置的。在这个配置文件中可以看到其顶级标签是<mule>。不要误会,其实它只是采用了mule标准的Spring配置文件。(they are really just Spring configuration files with Mule-specific extensions)可以点击这里了解详细情况,感兴趣的话,你也可以利用这种机制写一套出来。只需要实现Spring的NamespaceHandlerSupport接口就行,三个方法:
init()
BeanDefinition parse(Element, ParserContext)
BeanDefinitionHolder decorate(Node, BeanDefinitionHolder, ParserContext)
具体描述参见刚才的链接,不难理解。

mule采用这样的方式实现:首先用一个抽象类AbstractMuleNamespaceHandler来封装,然后mule内部不同的命名空间再分别拓展它。譬如:MuleNamespaceHandler用来处理默认的命名空间,也就是core;JmsNamespaceHandler处理jms命名空间。

那么Spring是如何找到命名空间对应的handler的呢?在META/INF下边有两个以spring开头的文件:spring.handlers和spring.schemas.前者是用来查找namespace handler的,后者是用来查找xml schema(xsd)文件的。
spring.handlers存储的数据类似这样:

http\://www.mulesource/schema/mule/acegi/2.2=org.mule.module.acegi.config.AcegiNamespaceHandler
这里出现斜杠\是因为冒号需要转一下。通过这个文件,Spring就能找到在xml配置文件碰到的namespace应该用那个handler来处理。

spring.schemas存储的数据类似这样:
http\://www.mulesource/schema/mule/acegi/2.2/mule-acegi.xsd=META-INF/mule-acegi.xsd
通过这个文件Spring直接在META-INF下找到其xsd文件,完成对xml配置的校验。
需要注意的是,mule将这两个文件按照不同的命名空间拆分,分别放到各自的jar下面(我们都知道mule分了n个jar)。这是spring允许的。不过也给重构带来了麻烦,需要将他们分别替换,或者像我一样,把他们拷贝到一起。

明白了原理,我们就可以动手了。统一替换掉所有mule的命名空间,包括所有的xsd文件,spring.schemas与spring.handlers文件,以及default-mule-config.xml文件。重新打包,运行示例... 出错!
为什么出错呢?一种原因是替换的不干净,存在漏掉的命名空间。还有一个原因就是mule的源码需要修改一下,呵呵,在哪里改呢?在SpringXMLUtils。里边有个方法isMuleNamespace,根据声明的常量 public static final String MULE_NAMESPACE_PREFIX = "/";来判断是否为mule的命名空间。解决方式很简单,把这个常量改掉,或者向我一样,直接将isMuleNamespace改为返回true。这样以后就命名空间无关了。OK,打包,运行示例,没问题。

下一个要动的是xml的顶级标签<mule>。找到mule.xsd,修改这个: <xsd:element name="mule" type="muleType">。将其name改成你想要的。然后修改default-mule-config.xml里<mule:mule>标签体,替换掉所有的mule为你刚才改的名称。打包,运行,出错。
呵呵,还要修改源码。将AbstractMuleBeanDefinitionParser中的ROOT_ELEMENT修改成新的标签名字;在MuleNamespaceHandler的init()方法的registerIgnoredElement("mule");后加一行registerIgnoredElement("yourtag");将你修改后的标签名字在这里注册一下。 打包,运行示例,OK!

接下来将所有带mule字样的配置文件都一一替换掉,注意胆大心细!

运行一下,基本已经改头换面了。

更多推荐

mule改头换面历程

本文发布于:2024-02-19 17:41:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1764960.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:改头换面   历程   mule

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!