解析IBM Rational Rhapsody的過程
這是我的第一篇技術(shù)博客,為什么會寫關(guān)于使用java api解析Rhapsody的過程呢?差不多已經(jīng)工作三年了,這三年中遇到過很多問題,但是遇到的最大的問題就是Rhapsody。因為這個問題,差點萌生想辭職走人的沖動。
IBM Rational Rhapsody是IBM旗下一款關(guān)于UML建模工具,有點類似于Rational Rose、Power Designer等工具,包含用例圖(UseCase)、時序圖(
Sequence)、結(jié)構(gòu)圖(Structure)、流程圖(Activity)、狀態(tài)圖(Statechart)、對象模型圖(ObjectModel)等對象以及用戶的相關(guān)操作信息。
剛開始接到通知說是要會用這款工具,但是我的電腦一直使用不了這款工具,就沒怎么折騰了,因為我想的是,只是一款建模工具,可能和后面的開發(fā)沒有多大的影響。但是我這個想法錯了,錯的太離譜。后來任務(wù)下來了,第一個任務(wù)就是調(diào)用Rhapsody的java api解析Rhapsody的工程文件獲取想要的數(shù)據(jù),然后我就懵了。因為這方面的資料很少幾乎等于沒有,連IBM的官網(wǎng)都沒啥說的,畢竟這是款商業(yè)工具,講的都是如何使用,沒有講怎么調(diào)api去解析文件工程的。沒辦法,先硬著頭皮整嘛,整不出來就跑路吧。
最開始這款工具在我電腦上安裝不了,在官網(wǎng)上下載了一個8.0.6的版本,但是始終用不了,沒有l(wèi)icense。最后在IBM官網(wǎng)一個不起眼的地方下載了一個可以免費使用三個月的license.dat文件,需要放在系統(tǒng)盤C盤下一個名為“flexlm”的文件夾里,然后工具就可以打開了。拿別人做好的Rhapsody項目樣例,來測試,就是一個文件,后綴名為.rpy。這是工程文件,所有的信息都是從這里面獲取的。
Rhapsody是安裝的一個桌面端程序,但是它有版本區(qū)分,有java版和C++版。Java版只需要引入Rhapsody.jar文件,如果是C++版需要既引入Rhapsody.jar文件,又要把Rhapsody.dll文件放入%JRE_HOME%/bin目錄下,這兩個文件都在Rhapsody安裝目錄下可以找到。比較幸運在Rhapsody工具的幫助文檔里找到了一張類的繼承圖,我就是根據(jù)這張圖和導(dǎo)入的rpy文件所生成的目錄相結(jié)合逐步解析文件
然后我們來解析了
Rhapsody解析過程
1:判斷當(dāng)前電腦上是否存在rhapsody的進程,若進程存在調(diào)用RhapsodyAppServer.getActiveRhapsodyApplication(),返回一個IRPApplication對象。因為如果沒有后臺進程,必須手動打開一個Rhapsody工具,然后調(diào)用api,這個已打開的Rhapsody工具會被api控制。若進程不存在則調(diào)用RhapsodyAppServer.createRhapsodyApplication(),系統(tǒng)自動創(chuàng)建一個rhapsody的進程。再返回一個IRPApplication對象。
2:調(diào)用IRPApplication對象的openProject方法,傳入rhapsody要解析文件的路徑,返回一個IRPProject對象,若該對象為空,表示該上傳rhapsody文件存在版本差異或中文路徑等問題,不能被解析。若該對象不為空,該上傳rhapsody文件可以被解析
3:IRPProject對象調(diào)用getNestedElementsRecursive方法獲取所需要的遞歸嵌套所有的元素返回一個IRPCollection對象
IRPCollection對象調(diào)用getCount()方法進行循環(huán)遍歷,循環(huán)的下標(biāo)作為參數(shù)傳入IRPCollection對象調(diào)用getItem()方法獲取每一個元素對象(Object類型)
獲取圖:
遍歷的每一個元素對象進行類型判斷是否是
IRPSequenceDiagram、IRPUseCaseDiagram、IRPStructureDiagram、IRPActivityDiagram、IRPStatechartDiagram、IRPObjectModelDiagram的類型,
如果是,強轉(zhuǎn)問對應(yīng)的實現(xiàn)類類型RPSequenceDiagram、RPUseCaseDiagram、RPStructureDiagram、RPActivityDiagram、RPStatechartDiagram、RPObjectModelDiagram
每個類型的對象調(diào)用各自的
getMetaClass()獲取類型
getFullPathName()獲取路徑
getDescription()獲取備注
getIconFileName()獲取圖標(biāo)路徑
getName()獲取名稱
getPictureAs(保存圖片路徑, 圖片格式, 圖形集合, 該對象的getElementsInDiagram()方法);
注:RPObjectModelDiagram對象只取圖標(biāo)路徑ExternalBlockDiagram.ico結(jié)尾的對象
獲取用戶操作:
遍歷的每一個元素對象進行類型判斷是否是RPClass對象,只取圖標(biāo)路徑Block.ico結(jié)尾的對象
該對象只獲取名稱和圖標(biāo)getName(),getIconFileName()
每個RPClass對象調(diào)用getNestedElementsRecursive().toList()返回一個集合對象
遍歷這個集合的每一個Object對象
判斷這個Object對象類型是否是RPOperation,如果是強轉(zhuǎn)為IRPOperation,調(diào)用以下方法
getReturnTypeDeclaration() 獲取返回類型
getName() 獲取名稱
getArguments().toList() 獲取參數(shù)集合,遍歷參數(shù)集合,遍歷的元素強轉(zhuǎn)為IRPArgument
調(diào)用getType().getName()獲取參數(shù)類型,getName()獲取參數(shù)名稱;
判斷這個Object對象類型是否是RPEventReception,如果是強轉(zhuǎn)為IRPEventReception,調(diào)用以下方法
getName() 獲取名稱
getArguments().toList() 獲取參數(shù)集合,遍歷參數(shù)集合,遍歷的元素強轉(zhuǎn)為IRPArgument
調(diào)用getType().getName()獲取參數(shù)類型,getName()獲取參數(shù)名稱;
以上只貼了關(guān)鍵代碼,Rhapsody的源碼太坑了,有注釋,很多地方方法名是什么,注釋就是什么,然后沒了
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。