解析IBM Rational Rhapsody的过程

举报
mythcsj 发表于 2019/12/21 16:11:56 2019/12/21
【摘要】 这是我的第一篇技术博客,为什么会写关于使用java api解析Rhapsody的过程呢?差不多已经工作三年了,这三年中遇到过很多问题,但是遇到的最大的问题就是Rhapsody。因为这个问题,差点萌生想辞职走人的冲动。 IBM Rational Rhapsody是IBM旗下一款关于UML建模工具,有点类似于Rational Rose、Power Designer等工具,包含用例图(UseCas...

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

 

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

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

 

刚开始接到通知说是要会用这款工具,但是我的电脑一直使用不了这款工具,就没怎么折腾了,因为我想的是,只是一款建模工具,可能和后面的开发没有多大的影响。但是我这个想法错了,错的太离谱。后来任务下来了,第一个任务就是调用Rhapsodyjava 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对象。

1576915291951248.png

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

1576915332213619.png

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

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

 

获取图:

 

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

IRPSequenceDiagramIRPUseCaseDiagramIRPStructureDiagramIRPActivityDiagramIRPStatechartDiagramIRPObjectModelDiagram的类型,

如果是,强转问对应的实现类类型RPSequenceDiagramRPUseCaseDiagramRPStructureDiagramRPActivityDiagramRPStatechartDiagramRPObjectModelDiagram

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

getMetaClass()获取类型

getFullPathName()获取路径

getDescription()获取备注

getIconFileName()获取图标路径

getName()获取名称

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

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

 

1576915418510786.png


获取用户操作:

 

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

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

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

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

1576915455535414.png

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

getReturnTypeDeclaration() 获取返回类型

getName() 获取名称

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

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

1576915497497505.png

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

getName() 获取名称

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

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

1576915512343172.png


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

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。