这两天将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="http://www.mulesource.org/schema/mule/core/2.2"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:jms="http://www.mulesource.org/schema/mule/jms/2.2"
xmlns:file="http://www.mulesource.org/schema/mule/file/2.2"
xsi:schemaLocation="
http://www.mulesource.org/schema/mule/core/2.2 http://www.mulesource.org/schema/mule/core/2.2/mule.xsd
http://www.mulesource.org/schema/mule/jms/2.2 http://www.mulesource.org/schema/mule/jms/2.2/mule-jms.xsd
http://www.mulesource.org/schema/mule/file/2.2 http://www.mulesource.org/schema/mule/file/2.2/mule-file.xsd">
链接:http://www.mulesoft.org/documentation/display/MULE2USER/About+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.org/schema/mule/acegi/2.2=org.mule.module.acegi.config.AcegiNamespaceHandler
这里出现斜杠\是因为冒号需要转一下。通过这个文件,Spring就能找到在xml配置文件碰到的namespace应该用那个handler来处理。
spring.schemas存储的数据类似这样:
http\://www.mulesource.org/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 = "http://www.longtop.com/schema/esb/";来判断是否为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字样的配置文件都一一替换掉,注意胆大心细!
运行一下,基本已经改头换面了。
类和包的命名重构很简单,在Eclipse中选择javaEE的视图,然后选中org.mule这个包名,右键选择Refactor》Rename。在对话框中将选项“Update Reference”下边的三个选项也都选中,剩下的就很简单了。
这个说起来简单,实际我也走了一段弯路。最开始没注意下边三个选项,结果一个子包一个子包的选中,然后Refactor,累个够呛。 :-) 后经人提醒才注意下边三个选项,于是一切都变得简单自然。
最复杂的是对于其配置文件的重构。在mule的xml配置文件中,第一:顶级标签必须是mule;第二:命名空间必须是类似于这样:
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.2"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:jms="http://www.mulesource.org/schema/mule/jms/2.2"
xmlns:file="http://www.mulesource.org/schema/mule/file/2.2"
xsi:schemaLocation="
http://www.mulesource.org/schema/mule/core/2.2 http://www.mulesource.org/schema/mule/core/2.2/mule.xsd
http://www.mulesource.org/schema/mule/jms/2.2 http://www.mulesource.org/schema/mule/jms/2.2/mule-jms.xsd
http://www.mulesource.org/schema/mule/file/2.2 http://www.mulesource.org/schema/mule/file/2.2/mule-file.xsd">
链接:http://www.mulesoft.org/documentation/display/MULE2USER/About+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.org/schema/mule/acegi/2.2=org.mule.module.acegi.config.AcegiNamespaceHandler
这里出现斜杠\是因为冒号需要转一下。通过这个文件,Spring就能找到在xml配置文件碰到的namespace应该用那个handler来处理。
spring.schemas存储的数据类似这样:
http\://www.mulesource.org/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 = "http://www.longtop.com/schema/esb/";来判断是否为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字样的配置文件都一一替换掉,注意胆大心细!
运行一下,基本已经改头换面了。