解析IBM Rational Rhapsody的过程
这是我的第一篇技术博客,为什么会写关于使用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()获取图标路径
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的源码太坑了,有注释,很多地方方法名是什么,注释就是什么,然后没了
- 点赞
- 收藏
- 关注作者
评论(0)