解析IBM Rational Rhapsody的过程

网友投稿 1816 2022-05-28

这是我的第一篇技术博客,为什么会写关于使用java api解析Rhapsody的过程呢?差不多已经工作三年了,这三年中遇到过很多问题,但是遇到的最大的问题就是Rhapsody。因为这个问题,差点萌生想辞职走人的冲动。

IBM Rational Rhapsody是IBM旗下一款关于UML建模工具,有点类似于Rational Rose、Power Designer等工具,包含用例图(UseCase)、时序图(

Sequence)、结构图(Structure)、流程图(Activity)、状态图(Statechart)、对象模型图(ObjectModel)等对象以及用户的相关操作信息。

刚开始接到通知说是要会用这款工具,但是我的电脑一直使用不了这款工具,就没怎么折腾了,因为我想的是,只是一款建模工具,可能和后面的开发没有多大的影响。但是我这个想法错了,错的太离谱。后来任务下来了,第一个任务就是调用Rhapsody的java api解析Rhapsody的工程文件获取想要的数据,然后我就懵了。因为这方面的资料很少几乎等于没有,连IBM的官网都没啥说的,毕竟这是款商业工具,讲的都是如何使用,没有讲怎么调api去解析文件工程的。没办法,先硬着头皮整嘛,整不出来就跑路吧。

最开始这款工具在我电脑上安装不了,在官网上下载了一个8.0.6的版本,但是始终用不了,没有license。最后在IBM官网一个不起眼的地方下载了一个可以免费使用三个月的license.dat文件,需要放在系统盘C盘下一个名为“flexlm”的文件夹里,然后工具就可以打开了。拿别人做好的Rhapsody项目样例,来测试,就是一个文件,后缀名为.rpy。这是工程文件,所有的信息都是从这里面获取的。

Rhapsody是安装的一个桌面端程序,但是它有版本区分,有java版和C++版。Java版只需要引入Rhapsody.jar文件,如果是C++版需要既引入Rhapsody.jar文件,又要把Rhapsody.dll文件放入%JRE_HOME%/bin目录下,这两个文件都在Rhapsody安装目录下可以找到。比较幸运在Rhapsody工具的帮助文档里找到了一张类的继承图,我就是根据这张图和导入的rpy文件所生成的目录相结合逐步解析文件

然后我们来解析了

Rhapsody解析过程

1:判断当前电脑上是否存在rhapsody的进程,若进程存在调用RhapsodyAppServer.getActiveRhapsodyApplication(),返回一个IRPApplication对象。因为如果没有后台进程,必须手动打开一个Rhapsody工具,然后调用api,这个已打开的Rhapsody工具会被api控制。若进程不存在则调用RhapsodyAppServer.createRhapsodyApplication(),系统自动创建一个rhapsody的进程。再返回一个IRPApplication对象。

2:调用IRPApplication对象的openProject方法,传入rhapsody要解析文件的路径,返回一个IRPProject对象,若该对象为空,表示该上传rhapsody文件存在版本差异或中文路径等问题,不能被解析。若该对象不为空,该上传rhapsody文件可以被解析

3:IRPProject对象调用getNestedElementsRecursive方法获取所需要的递归嵌套所有的元素返回一个IRPCollection对象

IRPCollection对象调用getCount()方法进行循环遍历,循环的下标作为参数传入IRPCollection对象调用getItem()方法获取每一个元素对象(Object类型)

获取图:

遍历的每一个元素对象进行类型判断是否是

IRPSequenceDiagram、IRPUseCaseDiagram、IRPStructureDiagram、IRPActivityDiagram、IRPStatechartDiagram、IRPObjectModelDiagram的类型,

如果是,强转问对应的实现类类型RPSequenceDiagram、RPUseCaseDiagram、RPStructureDiagram、RPActivityDiagram、RPStatechartDiagram、RPObjectModelDiagram

每个类型的对象调用各自的

getMetaClass()获取类型

getFullPathName()获取路径

getDescription()获取备注

getIconFileName()获取图标路径

解析IBM Rational Rhapsody的过程

getName()获取名称

getPictureAs(保存图片路径, 图片格式, 图形集合, 该对象的getElementsInDiagram()方法);

注:RPObjectModelDiagram对象只取图标路径ExternalBlockDiagram.ico结尾的对象

获取用户操作:

遍历的每一个元素对象进行类型判断是否是RPClass对象,只取图标路径Block.ico结尾的对象

该对象只获取名称和图标getName(),getIconFileName()

每个RPClass对象调用getNestedElementsRecursive().toList()返回一个集合对象

遍历这个集合的每一个Object对象

判断这个Object对象类型是否是RPOperation,如果是强转为IRPOperation,调用以下方法

getReturnTypeDeclaration() 获取返回类型

getName() 获取名称

getArguments().toList() 获取参数集合,遍历参数集合,遍历的元素强转为IRPArgument

调用getType().getName()获取参数类型,getName()获取参数名称;

判断这个Object对象类型是否是RPEventReception,如果是强转为IRPEventReception,调用以下方法

getName() 获取名称

getArguments().toList() 获取参数集合,遍历参数集合,遍历的元素强转为IRPArgument

调用getType().getName()获取参数类型,getName()获取参数名称;

以上只贴了关键代码,Rhapsody的源码太坑了,有注释,很多地方方法名是什么,注释就是什么,然后没了

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:说下我用Python分析美股财报的事
下一篇:clam av的使用
相关文章