﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-高老庄-随笔分类-架构与模式</title><link>http://www.blogjava.net/icestream/category/42515.html</link><description>八戒的梦想:农妇,山泉,有点田</description><language>zh-cn</language><lastBuildDate>Wed, 16 Jun 2010 17:44:46 GMT</lastBuildDate><pubDate>Wed, 16 Jun 2010 17:44:46 GMT</pubDate><ttl>60</ttl><item><title>Architexa的暴力破解</title><link>http://www.blogjava.net/icestream/archive/2010/06/15/323627.html</link><dc:creator>高老庄</dc:creator><author>高老庄</author><pubDate>Tue, 15 Jun 2010 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/icestream/archive/2010/06/15/323627.html</guid><wfw:comment>http://www.blogjava.net/icestream/comments/323627.html</wfw:comment><comments>http://www.blogjava.net/icestream/archive/2010/06/15/323627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/icestream/comments/commentRss/323627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/icestream/services/trackbacks/323627.html</trackback:ping><description><![CDATA[&nbsp;Architexa的前身是relo,这个工具在分析开源项目的源码时很好用,relo已经不再维护,变成了新的插件Architexa,其网址是http://www.architexa.com/,虽然说architexa东西不错，可惜需要付费.另外他的注册网站好像有问题，因此连评估也做不了，无奈之下，动了暴力破解的念头.下面即是暴力破解的过程，需要的人可以参考下.<br />
1.architexa 通过eclipse的update manager 下载后,在eclipse_HOME/plugins会存在几个jar和目录，如下:<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/201006/plusinsA.png" width="804" height="122" /><br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/201006/plusinsB.png" width="813" height="225" /><br />
1.architexa 没有对编译后的代码混淆,先用java decompiler 反编译出如下的类:<br />
<ul>
    <li>com.architexa.diagrams.RSECore 位于com.architexa.diagrams_1.2.2.201006051418.jar中.</li>
    <li>com.architexa.rse.ConnectAccountDialog 位于com.architexa.intro_1.2.2.201006051418/ReloIntro.jar中</li>
</ul>
2.修改RSECore类的方法:<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;validInstall()<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span> <span style="color: rgb(0, 0, 0);">{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">AccountStatusUtils.testAccountValid())&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;email&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;AccountSettings.getStoredAccountEmail();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountSettings.getStoredAccountPassword();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;((email&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;(email.length()&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">))<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountErrorMsgs.displayErr(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Account&nbsp;Has&nbsp;Expired&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">11</span><span style="color: rgb(0, 0, 0);"> }<br />
</span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);"><br />
</span></div>
中间的判断可以完全拿掉，修改为如下即可:<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;validInstall()<br />
</span><span style="color: rgb(0, 128, 128);">2</span> <span style="color: rgb(0, 0, 0);">{<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">4</span> <span style="color: rgb(0, 0, 0);">}</span></div>
<br />
3.修改ConnectAccountDialog类的代码(反编译后的代码有点长,这里不列出了)，最终改成如下即可:<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;okPressed_Internal()&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.emailEntered&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.emailField.getText();<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.passwordEntered&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.passwordField.getText();<br />
</span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;AccountConnection&nbsp;ac&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;AccountConnection();<br />
</span><span style="color: rgb(0, 128, 128);">6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.enableOnOK)&nbsp;ac.setMenuToDisable(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.disableOnCancel);<br />
</span><span style="color: rgb(0, 128, 128);">7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">.okPressed();<br />
</span><span style="color: rgb(0, 128, 128);">8</span> <span style="color: rgb(0, 0, 0);">}</span></div>
<br />
编译后将上述两个类放到对应的jar中，重启eclipse.<br />
<br />
4.在architexa的认证对话框，输入任意email和password,architexa 将重建索引.<br />
5.在某个java类的上下文菜单中，可以看到Open in Diagram 就可以生成类的布局图，类图和序列图了.可以通过工具栏上的button来输出图形.<br />
<br />
下面贴几个通过这个插件构成的图，欣赏下<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/201006/spring_class.png" width="975" height="477" /><br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/201006/spring_seq.png" width="932" height="1128" /><br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/icestream/aggbug/323627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/icestream/" target="_blank">高老庄</a> 2010-06-15 17:34 <a href="http://www.blogjava.net/icestream/archive/2010/06/15/323627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>平台、产品、项目三层结构下的配置解决方案</title><link>http://www.blogjava.net/icestream/archive/2009/11/04/301078.html</link><dc:creator>高老庄</dc:creator><author>高老庄</author><pubDate>Wed, 04 Nov 2009 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/icestream/archive/2009/11/04/301078.html</guid><wfw:comment>http://www.blogjava.net/icestream/comments/301078.html</wfw:comment><comments>http://www.blogjava.net/icestream/archive/2009/11/04/301078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/icestream/comments/commentRss/301078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/icestream/services/trackbacks/301078.html</trackback:ping><description><![CDATA[先谈下这个解决方案的背景:<br />
&nbsp;&nbsp;&nbsp;&nbsp;假设一个公司的产品遵循的是先有基础平台,然后在此平台上构建不同的产品,最后每一个产品被实施到特定的项目,那么，他们就构成了一种层次化的结构.每一个层次,需要覆盖一些上一层次的配置或者创建新的配置,如何分割层次间的影响从而保证层次间的独立性，是一个挑战.<br />
&nbsp;&nbsp;&nbsp;&nbsp;任意层次,可能有多个模块或者组件构成，不同的组件间，配置的类型可能一样，但是配置的数据不一样,那么,如果在配置某个模块时，不比考虑其他模块的配置情况，那么这个模块就拥有开发时的独立性,当组件被集成到同一层次部署运行时，配置的合并和重组是一个问题,并且，组件间可能存在依赖关系,这种依赖关系同时产生了依赖组件间配置加载的优先级问题.<br />
&nbsp;&nbsp;&nbsp;&nbsp;成熟的软件，一般不会直接将第三方的软件集成，而是将其封装后在纳入进来,第三方组件的配置往往不具备配置的层次化或者模块独立性.在设计第三方组件的集成策略时，需要考虑使其拥有上述两种能力.<br />
&nbsp;&nbsp;&nbsp;&nbsp;解决上述问题，方式有很多种,我们谈论比较容易实现的一种.<br />
&nbsp;&nbsp;&nbsp;&nbsp;这种解决方案的基本思路如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;首先，设计一个特定的扩展名称的配置文件(模块配置索引文件,MCIF,xml格式)，此配置文件面向的是组件级别，即每个组件定义自己的MCIF.MCIF中定义若干配置类别,即名称空间,每一个名称空间负责完成一类配置，一般,一个名称空间对应一个配置获取接口.这个名称空间中仅仅配置所关注的配置的文件的相对位置(相对此MCIF),这样，最大化的减少了不同配置文件格式对MCIF的影响.<br />
&nbsp;&nbsp;&nbsp;&nbsp;每一个MCIF的根元素拥有一个parent属性,指向了上一层次,同一层次的MCIF的parent属性都相同.通过parent属性，配置的层次化就不是问题了.<br />
&nbsp;&nbsp;&nbsp;&nbsp;MCIF有两个特殊的名称空间:<br />
&nbsp;&nbsp;&nbsp;&nbsp;1.register 定义了所支持的名称空间及其对应的配置解析器,这样,此配置框架就可以允许对名称空间进行扩展.<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.depends 定义了同一层次的模块间的依赖关系,这个是可选的，如果没有实现或者配置，同一层次的module即为平行的.<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;当系统启动时,扫描所有的MCIF,并根据parent属性解析出一个层次关系,对每一个层次下module,参考相应的depends设置定义出一个依赖关系.<br />
&nbsp;&nbsp;&nbsp;&nbsp;当请求某特定的配置时,根据上述的两个关系完成配置的组合，并返回给使用者.<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;公司最近的重构中，基于这个思想开发的配置小框架，很好完成了多层次，多组件的配置覆盖问题,配置相对以前更清晰、简单，配置过程中的关注点大大减少.
  <img src ="http://www.blogjava.net/icestream/aggbug/301078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/icestream/" target="_blank">高老庄</a> 2009-11-04 15:45 <a href="http://www.blogjava.net/icestream/archive/2009/11/04/301078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>