BlogJava-高老庄-随笔分类-架构与模式http://www.blogjava.net/icestream/category/42515.html八戒的梦想:农妇,山泉,有点田zh-cnWed, 16 Jun 2010 17:44:46 GMTWed, 16 Jun 2010 17:44:46 GMT60Architexa的暴力破解http://www.blogjava.net/icestream/archive/2010/06/15/323627.html高老庄高老庄Tue, 15 Jun 2010 09:34:00 GMThttp://www.blogjava.net/icestream/archive/2010/06/15/323627.htmlhttp://www.blogjava.net/icestream/comments/323627.htmlhttp://www.blogjava.net/icestream/archive/2010/06/15/323627.html#Feedback0http://www.blogjava.net/icestream/comments/commentRss/323627.htmlhttp://www.blogjava.net/icestream/services/trackbacks/323627.html 1.architexa 通过eclipse的update manager 下载后,在eclipse_HOME/plugins会存在几个jar和目录,如下:


1.architexa 没有对编译后的代码混淆,先用java decompiler 反编译出如下的类:
  • com.architexa.diagrams.RSECore 位于com.architexa.diagrams_1.2.2.201006051418.jar中.
  • com.architexa.rse.ConnectAccountDialog 位于com.architexa.intro_1.2.2.201006051418/ReloIntro.jar中
2.修改RSECore类的方法:
 1 public static boolean validInstall()
 2 {
 3     if (!AccountStatusUtils.testAccountValid()) {
 4       String email = AccountSettings.getStoredAccountEmail();
 5       AccountSettings.getStoredAccountPassword();
 6       if ((email != null&& (email.length() > 0))
 7         AccountErrorMsgs.displayErr("Account Has Expired ");
 8       return false;
 9     }
10     return true;
11 }
12
中间的判断可以完全拿掉,修改为如下即可:
1 public static boolean validInstall()
2 {
3     return true;
4 }

3.修改ConnectAccountDialog类的代码(反编译后的代码有点长,这里不列出了),最终改成如下即可:
1 protected void okPressed_Internal() {
2     this.emailEntered = this.emailField.getText();
3     this.passwordEntered = this.passwordField.getText();
4 
5     AccountConnection ac = new AccountConnection();
6     if (this.enableOnOK) ac.setMenuToDisable(!this.disableOnCancel);
7     super.okPressed();
8 }

编译后将上述两个类放到对应的jar中,重启eclipse.

4.在architexa的认证对话框,输入任意email和password,architexa 将重建索引.
5.在某个java类的上下文菜单中,可以看到Open in Diagram 就可以生成类的布局图,类图和序列图了.可以通过工具栏上的button来输出图形.

下面贴几个通过这个插件构成的图,欣赏下







高老庄 2010-06-15 17:34 发表评论
]]>
平台、产品、项目三层结构下的配置解决方案http://www.blogjava.net/icestream/archive/2009/11/04/301078.html高老庄高老庄Wed, 04 Nov 2009 07:45:00 GMThttp://www.blogjava.net/icestream/archive/2009/11/04/301078.htmlhttp://www.blogjava.net/icestream/comments/301078.htmlhttp://www.blogjava.net/icestream/archive/2009/11/04/301078.html#Feedback0http://www.blogjava.net/icestream/comments/commentRss/301078.htmlhttp://www.blogjava.net/icestream/services/trackbacks/301078.html     假设一个公司的产品遵循的是先有基础平台,然后在此平台上构建不同的产品,最后每一个产品被实施到特定的项目,那么,他们就构成了一种层次化的结构.每一个层次,需要覆盖一些上一层次的配置或者创建新的配置,如何分割层次间的影响从而保证层次间的独立性,是一个挑战.
    任意层次,可能有多个模块或者组件构成,不同的组件间,配置的类型可能一样,但是配置的数据不一样,那么,如果在配置某个模块时,不比考虑其他模块的配置情况,那么这个模块就拥有开发时的独立性,当组件被集成到同一层次部署运行时,配置的合并和重组是一个问题,并且,组件间可能存在依赖关系,这种依赖关系同时产生了依赖组件间配置加载的优先级问题.
    成熟的软件,一般不会直接将第三方的软件集成,而是将其封装后在纳入进来,第三方组件的配置往往不具备配置的层次化或者模块独立性.在设计第三方组件的集成策略时,需要考虑使其拥有上述两种能力.
    解决上述问题,方式有很多种,我们谈论比较容易实现的一种.
    这种解决方案的基本思路如下:
    首先,设计一个特定的扩展名称的配置文件(模块配置索引文件,MCIF,xml格式),此配置文件面向的是组件级别,即每个组件定义自己的MCIF.MCIF中定义若干配置类别,即名称空间,每一个名称空间负责完成一类配置,一般,一个名称空间对应一个配置获取接口.这个名称空间中仅仅配置所关注的配置的文件的相对位置(相对此MCIF),这样,最大化的减少了不同配置文件格式对MCIF的影响.
    每一个MCIF的根元素拥有一个parent属性,指向了上一层次,同一层次的MCIF的parent属性都相同.通过parent属性,配置的层次化就不是问题了.
    MCIF有两个特殊的名称空间:
    1.register 定义了所支持的名称空间及其对应的配置解析器,这样,此配置框架就可以允许对名称空间进行扩展.
    2.depends 定义了同一层次的模块间的依赖关系,这个是可选的,如果没有实现或者配置,同一层次的module即为平行的.
    
    当系统启动时,扫描所有的MCIF,并根据parent属性解析出一个层次关系,对每一个层次下module,参考相应的depends设置定义出一个依赖关系.
    当请求某特定的配置时,根据上述的两个关系完成配置的组合,并返回给使用者.
    
    公司最近的重构中,基于这个思想开发的配置小框架,很好完成了多层次,多组件的配置覆盖问题,配置相对以前更清晰、简单,配置过程中的关注点大大减少.

高老庄 2009-11-04 15:45 发表评论
]]>