2007年10月30日

                  如果兩個插件出現雙向的獨立性關聯就形成了循環依賴,Dengues利用Eclipse擴展點方式解決這個問題。

                  首先來介紹一下原理。Eclipse在啟動的時候會將所有的擴展點實現加載到一個注冊表里面,這里注冊的東西可以是一個類,就像是我們通過擴展點的方式實現一個Viewer一樣,我們不僅要寫入相應的icon還要寫入相關的指定的類。
                      

                      
                  同樣道理,如果我們可以定義一個擴展點,在Eclipse啟動的時候把實現了這個擴展點的類加載到一個核心插件里。如果別的插件如果要用這個類的話,直接加入對之個核心插件的依賴不就可以了從而回避了對這個插件直接的依賴見下圖:

                  
                  在圖1里A插件要引用B插件里的類,同樣B插件也有需求要引用A插件里的類,這樣就造成了插件的循環依賴。現在利用擴展點,在A,B插件里實現一個定義于Core插件里的擴展點,在Eclispe啟動的時候,實現了此擴展點的類將可以被加載到Core插件里。通過Core的橋梁作用A、B插件便可以實現類的相互引用。這里A、B插件只是對Core有一個單向的依賴關系,通過core插件的幫助A與B之間可以相互調,避免了直接的調用所以也就不會形成循環依賴了。

                  一、擴展點的定義:

                  點擊進入org.dengues.core插件的plugin.xml 文件,打開Extension Point標簽,點Add加入一個擴展點輸入如下信息:
                  
                  在Definition里加一個叫做Service的element,并加入兩條use欄為reuqired的屬性如下圖所示:

                  

                  其中serviceClass的Type要選成java,并且在Implements里定義一個接口,這個接口規定了這個擴展點在實現的時候指定的類。這里為IDenguesService。其實接口里什么也沒方法也沒有定義,只是一個申明而已。
                  

                  

          package org.dengues.core;

          public interface IDenguesService {

              String ID 
          = "org.dengues.commons.denguesService"//$NON-NLS-1$

              String SERVICE_CLASS 
          = "serviceClass"//$NON-NLS-1$

              String SERVICE_ID 
          = "serviceID"//$NON-NLS-1$
          }


                  
                  二、實現擴展點。具體怎么用一個擴展點,這里就不用多說了,只重點介紹一下怎么實現IDenguesService類。我們以Dengues里的org.dengues.design.core插件為例。在org.dengues.core里我們我建一個IDenguesService的子接口IDesignerCoreService,并寫入我們要向其它plugin公開的方法。
                  

          public interface IDesignerCoreService extends IDenguesService {

              
          public IComponentsFactory getComponentsFactory();

              
          public IComponentFilesNaming getComponentFilesNaming();

              
          public void initializeTemplates();

              
          public ICodeGenerator getCodeGenerator(ICompProcess process);

              
          public ICodeGenerator getCodeGenerator();

              
          public IJavaETLProcessor getJavaProcessor(ICompProcess process);

              
          public IJavaETLProcessor getJavaProcessor();

              
          // public Action createStartHsqldbServer(String dbName);

              
          public Action createStartHsqldbServer();

              
          public boolean checkHsqldbConnection();

              
          public void runSqlScript(IFile scriptFile);

              
          public DatabaseContainer getHsqlDatabase() throws SQLException;

              
          public Connection getCurrentConnection() throws SQLException, CoreException, ClassNotFoundException;
          }


                   以上這些方法就是org.dengues.designer.core這個插件想要對其它插件公開的方法了,它的實現自然會被寫入到這個插件里了。這段代碼很多,我們就不列在這里了,如果有興趣的朋友可以到我們Dengues的google svn去check out代碼。寫好對IDesignerCoreService的實現以后,我們就可以把它加入到事先我們定義好的擴展點里了,見下圖:
                  
                  

                  圖中的DesignerCoreService就是IDesingerCoreService的實現。好了,當Eclipse啟動的時候它就會把這個類加載到注冊表里了,我們可以從這個注冊里取到這個類了。那以后如果我們想從這個plugin里向外公開一些方法的話,就可以通過向IDesignerCoreService寫入相應的方法,在DesignerCoreService里寫入相應的實現就可以了。

                  三、從注冊表里取出擴展點的類。

                  在org.dengues.core里我們寫了一個GlobalServiceFactory里面提供了相應的代碼:

                      

          static {
                  IExtensionRegistry registry 
          = Platform.getExtensionRegistry();
                  configurationElements 
          = registry.getConfigurationElementsFor(IDenguesService.ID); //$NON-NLS-1$
              }


              
          /**
               * Comment method "getService".Gets the specific IService.
               * 
               * 
          @param klass the Service type you want to get
               * 
          @return IService IService
               
          */

              
          public IDenguesService getService(Class klass) {
                  IDenguesService service 
          = services.get(klass);
                  
          if (service == null{
                      service 
          = findService(klass);
                      
          if (service == null{
                          
          throw new RuntimeException("GlobalServiceRegister.ServiceNotRegistered" + klass.getName()); //$NON-NLS-1$
                      }

                      services.put(klass, service);
                  }

                  
          return service;
              }


                  如果我們要取剛才定義好的那個IDesignerCoreService的話,我們可以按如下方式取到:

              public IDesignerCoreService getDesignerCoreService() {
                  IDenguesService service 
          = GlobalServiceFactory.getDefault().getService(IDesignerCoreService.class);
                  
          return (IDesignerCoreService) service;
              }

                  
                  其實段代碼是寫在org.dengues.core插件里的CorePlugin里的,也就是說在任何一個插件里只要加入了對org.dengues.core的依賴都可以通過CorePlguin.getDefault().getDesignerCoreService()來得到IDesignerCoreService的實例了。
           
                     
                      
                  
                  

          posted @ 2007-11-20 13:19 小張飛刀(Dengues Studio) 閱讀(1644) | 評論 (2)編輯 收藏
           
                


                 Eclipse里有一項功能就是通過update site直接將插件從網上下載到自己的IDE里,使用起來方便省時,平時只是這樣用別人的插件;那如果自己開發了一個插件,想讓別人通過這種方式下載并使用可以嗎?答案當然是肯定的。

                 首先要創建一個feature工程,步驟如下:
                 1)在New Project Wizard選擇Feature Project,點一下步。
                 2)寫入feature工程的名字比如:org.dengues.feature
                 3)在第二頁里保持ID為org.dengues.feature.將名字改為Dengues Feature.
                 4)選中要關聯的插件,在這里我選擇了所有的dengues項目插件,如下:

                
                  點擊finish這樣就創建好了一個feature插件了。這里簡單的介紹一下feature有什么用,feature可以把其它的一個或者多個插件組合到一起,以便于用戶對插件的加載,管理,命名就像是對一個單元進行操作一樣。當然也包括可以方便用于發布到網上。

                 做好feature插件以后,就是要往里面寫入相應的信息嘍,里面包括版權,可訪問網站什么的東東,填好以后就可以進入下一步創建一個update site project了。

                 創建的步驟很簡單就不再詳細說明了,工程名就叫org.dengues.update吧。

                 創建完成之后,在site map里加入一個category,并將我們剛才做好的feature加到這個category里面。就成了下面的樣子:


                 選中剛加入的feature選build,完成之后這個update site project的結構就變成了這樣。

                

                 把這個工程下的所有文件直接拷到要發布的網頁服務器上就要以了,這樣你就以通過Eclipse訪問這個網站來更新你的插件了不信你試,簡單吧!
                




          posted @ 2007-10-30 17:28 小張飛刀(Dengues Studio) 閱讀(1652) | 評論 (5)編輯 收藏
           
          主站蜘蛛池模板: 板桥市| 顺平县| 松溪县| 丰都县| 惠东县| 凤山市| 麻城市| 泸西县| 边坝县| 富裕县| 绥滨县| 宁城县| 麻城市| 玛曲县| 东辽县| 馆陶县| 府谷县| 波密县| 邵东县| 林芝县| 长垣县| 安徽省| 柞水县| 耒阳市| 桐庐县| 澄城县| 龙游县| 沙湾县| 金门县| 西乌| 林口县| 嵩明县| 古交市| 江陵县| 财经| 昌平区| 公主岭市| 沁阳市| 乡城县| 绿春县| 玉屏|