我在IBM做的第一件事情就是开发一个DataConversion插件,这个插件的主要功能就是进行各种数据类型之间的转换。数据类型包括有:二进制,十进制,十六进制之间的互转,Unicode编码到Char的转换,Hex与Timestamp之间的转换等等,这个插件的功能很简单,实现不是很困难,主要是刚进入IBM,然后第一次接触eclipse插件开发,在完全不知道RCP是啥东西的情况下做这个事情的。
在我进入IBM的第一个星期,我几乎没有写任何代码,因为我完全不懂RCP,所以我做的事情就是看team里面项目的相关资料,包括我们组的产品IFA的介绍,以及IFA的一些概要设计等等,此外,开始搜寻一些关于eclipse插件开发方面的资料,通过学习,了解插件开发体系架构,了解到了OSGi规范,并且知道eclipse本身就是基于这个规范,基于这个插件体系架构的一个成功案例,通过翻看eclipse帮助文件等,开始了解eclipse插件开发中的各种eclipse本身预留出来的扩展点,并且开始尝试依据扩展点所预留出来的接口,编写代码,实现例程。
DataConversion这个插件,最后的目标就是希望在我们的产品上有一个button,通过点击这个button会出来一个图形界面,通过图形界面(一个类似于windows下计算器一样的界面),用户可以方便的进行所提供的数据类型之间的转换,并且能够容易的得到转换结果(有复制,粘贴,剪切等按钮)。
这块开发的难点其实在于GUI的开发,也就是界面的开发,因为作为产品的界面,将力图友好,易用。所以这个模块中就涉及到各种GUi事件的捕捉,处理等,以及各种错误,异常处理。界面上包括需要将按钮和菜单联动起来。关于错误处理方面,主要有两方面的错误,第一,用户输入有误,第二,在数据类型转换过程中,转换有误(就是该类型的该数据无法转换为合法的目标数据类型),在处理用户输入的问题上,尽量在输入的时候就控制让用户尽可能的输入正确,这个通过监听器来达到,但可能有部分输入无法在输入过程中发现输入错误,只有当输入以后才发现输入有误,于是通过显示屏来显示错误;在数据转换错误上,当发现无法合法转换的时候,显示屏也将显示错误,但是有个特别需求,用户需要点击radio button将数据再退回到原来的数据类型上去,也就是用户发现转换不了的时候,他需要退回去以发现到底是哪个输入输入错了,所以这个地方需要处理一下小细节。
以下是我开发完后给出的tips:In this tool, there may be some errors after a conversion, including the input error and the conversion error. I suggest dealing with these two errors respectively. I mean if there is an input error, the program should not allow users to do conversion work any more until users correct their input.
二、 navigator插件的开发
我的第二项工作就是开发一个导航栏视图插件,类似于eclipse中的navigator视图那样,依据底层文件系统的文件目录,以树状形式显示出工作区的文件目录,组里给的要求是尽量复用eclipse已有的东西,于是我调研了CNF(Common Navigator Framework)框架,CNF是一个专门用来在eclipse插件开发过程中定制自己的导航视图的框架,由于我需要显示我们产品自己的相关文件目录,所以不能再用eclipse本身定义的底层文件数据模型IResource(IProject,IFolder,IFile),需要自定义数据模型,为了能够在后续的开发中最大复用eclipse的东西,我在定义数据模型的时候,就是对eclipse的数据模型IResource进行一层封装。
BTW:About the whole idea of this navigator tree, its main opinion is the data model. We designed our own data model named IIfaResource which wraps the data model in eclipse called IResource. However, all the actions in the navigator tree are still based on the data model in eclipse. When we select some item in the tree and trigger some actions, the whole process is as following:
1 gets the selected resources which are IIfaResources we defined ourselves.
2 unwrap the resources and get the IResource out.
3 do the actions to the IResource with actions already defined in eclipse, return the result.
4 wrap the result with the format of IIfaResource
5 display the result.
Some tips: There is some thing worthy noting down. When we define our own data model in the navigator tree project. We should override the equals() and hashCode() method in each class. If we do not do so, then when we refresh our navigator view, the navigator tree can not sustain its
expanding state any more, as in the deeper source, the data model is used as a key in HashMap.
三、对特定XML文件的多页编辑器插件开发在分析数据结构的过程中,在分析长度的时候,当碰到类似数组等数据,光从这些源文件无法分析出长度来,需要配置其维数等等,这个时候就需要一个配置文件叫做configure.xml,我就是负责开发一个对这个configure.xml文件的特定多页编辑器,其实就只有两页,一个是用来查看源文件的,一个是用图形界面查看这个xml文件的,类似于插件开发中eclipse提供的查看plugin.xml文件的编辑器一样,不过没有那么复杂,任务也很简单,也就是对xml文件内的各个节点建模,然后初始化图形editor的输入editorInput为代表整个xml文件的一个对象,以此再进行显示,同样是利用jface的viewer来进行,当然是复用到了eclipse中UI插件已有的一些editor的功能了。再继承他们的基础上进行扩展。另外,还需要开发出一些图形界面内能够加入节点,删除节点,修改节点的功能,还要求能够保存等等。
这部分还存在的问题就是:
1 Keep the array page and the text editor (source page) consistent with each other. I gave a method named “pageChange()” in the ConfigurefileEditor.java, but have not finished it. Please finish that to achieve this.
2 There is some thing wrong when saving the configure file. As we know, in the configure file, the array node is like this: <array fieldname=””, dimfield=””/>, however, after saving it, it will turn into this: <array dimfield=””, fieldname=””/>. I thought there might be some attributes or some other thing to set when saving the file in order to make the order of the array node’s attributes unchanged.
3 About the quick fix, in the source code, I tried to achieve this goal in two ways. One is extending the org.eclipse.core.resources.markers extension point and org.eclipse.ui.ide.markerResolution extension point. Another one is making an action menu on the marker in the problem view which can also named after “quick fix”. However, so far I have not finish this work and just given two ways.(这个地方遗留的问题最大,之所以没有实现的了,是因为存在视图,或者说是程序之间通信的困难,就是我在quickfix视图里面发现了这个错误,然后我也能够改正这个错误,但是如何把这个与编辑器联动起来是个问题,并且如何像eclipse的quickfix一样显示备选fix方案也是一个问题。这个地方由于时间关系,在离开ibm之前一直没有解决,离开ibm以后没有继续相关调研,也就是一直是个问题,不过我相信一定存在这个方面的api,或者一定有方法能够实现这一点,而我提出的第二个解决方案就是一个不是很理想但是也能够实现功能的方案,它完全脱离了eclipse的quickfix的意思,但是能够让用户用起来感觉跟quickfix一样。)
四、文本文件分析工具开发:功能就是分析一些用我看不懂的语言写的数据结构,并用XML格式存储起来,存储每个变量开始的位置,所占长度,结尾位置。工作有点类似是一个文法分析,但是由于时间紧迫,而且最重要的就是我对该语言完全不懂,所以无法利用所学的编译原理的知识来解决这个问题,于是只能将其作为字符处理,由于这个工具只是一个应急工具,所以就权且这样子做了,而产品以后将完全采用编译原理那套东西来进行工具开发。通过在IBM的实习,极大的锻炼了我的调研能力和自学能力,我是在完全不懂RCP的情况下进行工作的,而我能够在很短的时间内学习它,并使用它,而且我有着极强的激情去学习新东西,敢于去接受挑战。此外,或许由于自己的经验不足,在开发过程中导致了一些错误的发生,甚至有些bug曾经困扰了长达一个星期之久,但是我始终坚信这个bug有办法解决,而且一定要解决,在周围同事都无法帮助我的情况下,我坚持阅读SWT的源代码,最后终于能够找到问题症结所在,让我无比欣慰和开心,也让自己长了经验,这点我觉得我对自己很是感到骄傲,我有着很强的解决问题的激情,虽然解决问题的道路是曲折的,甚至可以说是痛苦的,但是我很是享受这个过程,以及问题解决后的愉悦!
在整个IBM的实习过程中,我能够很好的team work,在team会议上,不会因为自己是个实习生而胆怯,认真思考后积极的合理的提出自己的意见,并且认真听取各位同事的意见,吸取他们的经验,事实上,我的同事在我整个实习过程中给予了我很大的帮助,最后他们也对我的工作结果和效率给予了充分肯定。我感到很是高兴。