eclipse cas_案例研究:CAS Software AG中的Eclipse Rich Ajax平台使用

eclipse cas

介绍

CAS Software AG是一家软件公司,总部位于德国卡尔斯鲁厄,成立于1986年。他们是CRM(客户关系管理)领域的专家,尤其是SME(中小型企业)领域的专家。 多年来,CAS Software凭借其在CRM领域的软件产品赢得了认可,这些产品包括用于教育,汽车经销以及会员组织和协会的专用CRM产品。

最近,CAS Software一直在开发一种名为CAS PIA(个人信息助手)的产品,这将是SaaS(软件即服务)产品,这是CAS的首个此类产品。 它建立在许多技术上,稍后将详细讨论。 本案例研究将重点关注Eclipse RAP(Rich Ajax平台)及其如何应用于CAS PIA的体系结构,以及RAP的一些有趣用途,CAS在使用中的经验教训以及产品的未来发展方向。

CAS Software AG为自由职业者和SME(中小型企业)部门开发CRM(客户关系管理)软件。 CAS的目标受众当前倾向于不使用特定的CRM应用程序,而是倾向于使用多种工具和应用程序来跟踪其客户,市场营销等。但是,CAS认为,对帮助管理客户的软件有很大的需求以集中且易于访问的方式提供信息。 有针对特定行业的桌面应用程序,但它们往往只限于CRM功能。 通过使用诸如Eclipse RAP和Eclipse Equinox这样的技术,CAS PIA不仅可以提供“标准” CRM功能,而且还可以在干净,模块化的程序包中管理营销活动,电子邮件合并,个性化信件。

通过将Eclipse RAP用于用户界面,CAS PIA提供了类似于桌面的体验,可快速使用户对应用程序感到满意。 用户界面在设计时考虑了人体工程学,充分利用了熟悉的小部件和行为(例如拖放),这是用户甚至对Web应用程序所期望的一切。 此外,在线功能允许企业内的所有同事管理约会,任务和文档,以及其他重要的工作流程和过程,例如地址转移和路线规划。 在下一节中,我们将深入探讨为CAS PIA开发的体系结构,以及开源软件如何发挥至关重要的作用。

解决方案概述

CRM解决方案已经存在了很多年,无论是在台式机还是在线解决方案上,并且最近都变得功能丰富。 在使用这些应用程序时,用户期望基本功能之外的某些功能和特性,例如报告,安全性,熟悉的外观和感觉,以及快速响应的用户界面。 鉴于CRM解决方案用户的期望和要求,CAS选择采用开源软件作为其解决方案的基础。

CAS PIA是一个Web应用程序,旨在通过利用几个共享工作负载并提供冗余的服务器实例来轻松扩展。 每个服务器实例都将Apache Tomcat作为应用程序服务器运行,其中包含基于RAP的应用程序层和服务器核心。 应用层负责显示用户界面并处理用户交互,而服务器核心则提供业务功能和数据库访问。

CAS选择使用基于Web的应用程序,因此客户不必担心安装,硬件成本和配置以及数据的安全性。 同样,基于Web的方法允许用户从任何位置访问CAS PIA,而不必每台计算机都安装胖客户端。 作为Web应用程序前端的表示层将利用Eclipse RAP。 RAP项目页面将其描述为使开发人员能够使用的框架:

通过使用Eclipse开发模型,具有众所周知的Eclipse工作台扩展点的插件以及具有SWT API(加上JFace)的小部件工具箱来构建丰富的,支持Ajax的Web应用程序。RAP与Eclipse RCP非常相似,但是RAP不是在台式计算机上执行,而是在服务器上运行,客户端可以使用标准浏览器访问该应用程序。 这主要是通过提供SWT(SWT API的子集)的特殊实现来实现的。 ( http://www.eclipse.org/rap/about.php

下面是一个简单的体系结构图,将Eclipse RCP与Eclipse RAP进行了比较。

出于各种原因,将Eclipse RAP用作CAS PIA的表示层的用户界面:

  • 外观-他们能够构建非常丰富的,符合人体工程学的,可主题化的界面,很难与胖客户端区分开。
  • 开发效率-AJAX和JavaScript被烘焙到可供开发人员使用的现成可用组件中,从而使开发人员可以使用熟悉的库和IDE用Java进行编码。
  • 灵活性-尽管RAP允许开发人员避免编写JavaScript,HTML和CSS,但它具有足够的灵活性,因此可以添加自定义组件和样式,而不会出现任何问题。
  • 工程质量-Eclipse及其产品采用最佳实践软件设计和实践,RAP也不例外。
  • 单一代码库-RAP可以编译为AJAX或RCP应用程序。

表示层还包含一个OSGi运行时,该运行时提供了其他CAS产品之间的模块化和可重用性。 CAS选择Eclipse Equinox项目作为其OSGi的实现提供者,其定义为:

... OSGi R4核心框架规范的实现,这是一组捆绑软件,用于实施各种可选的OSGi服务和其他基础设施,以运行基于OSGi的系统。

更一般而言,Equinox项目的目标是成为一流的OSGi社区,并树立Eclipse作为捆绑软件的愿景。 作为其一部分,它负责开发和交付用于所有Eclipse的OSGi框架实现。

通过利用Equinox提供的分离,CAS已实现了核心模块,该模块由多个束组成,这些束是在各种应用中使用的通用组件。 每个模块提供各种扩展点,这些扩展点允许根据正在开发的应用程序来实现特定的行为。 例如,用户管理模块可以用在许多应用程序中,但是联系人管理模块更特定于CRM相关的应用程序。 OSGi提供的灵活性允许轻松扩展模块,并轻松地将其包含(或不包含),例如在构建或部署阶段。

CAS PIA的另一面是业务逻辑和与服务器端相关的典型功能,称为服务器核心或EIM(企业信息管理)。 EIM的设计和开发构成了CAS正在开发的完整企业产品线的核心。 服务器核心通过使用Sun JAX-WS,RMI和REST服务来提供远程访问功能,这些功能都可以通过使用Spring Framework以模块化的方式进行扩展。

持久层使用MySQL数据库,但还包含CAS专门创建的自定义组件。 定制组件提供了可扩展的数据模型,专用查询语言(CAS-SQL)和权限管理组件。 权限管理组件依靠ACEGI框架通过公司身份验证服务对用户进行身份验证,但随后它在数据库层为每个对象提供ACL(访问控制列表)。 此自定义权限系统类似于Oracle的OLS(Oracle标签安全性),但允许CAS在可能使用除MySQL以外的其他数据库的其他产品上重用它。

Eclipse RAP的单元测试

单元测试是任何软件开发工作中的重要方面,即使在软件的客户端也是如此。 很多时候,软件应用程序的用户界面部分的开发人员发现很难对其代码进行单元测试。 通常,这是因为存在表示和应用程序逻辑的网格,这使单元测试的开发和维护变得复杂。 CAS的开发人员已经付出了很多努力,以便在单元测试更加可靠的情况下在服务器上保留尽可能多的逻辑。 但是,并不是所有的事情都可以在服务器上完成,而这正是可靠的UI设计起着主要作用的地方。

通过使用常见的设计模式(例如MVC,Presentation Model,Model View Presenter等)实现用户界面,视图与逻辑解耦,从而使单元测试变得更加容易。 即使采用可靠的设计,也要面对其他问题,尤其是在测试RAP用户界面时。 首先,RAP UI组件由Java层和JavaScript层组成,这意味着有两部分代码需要测试。 RAP使用的Ajax应用程序框架Qooxdoo提供了类似于JUnit和JSUnit提供的功能的单元测试工具。 CAS利用这些工具来测试其自定义组件JavaScript层,并使用JUnit来测试Java层。 以下是CAS提供的单元测试,该单元演示了如何测试自定义组件JavaScript层:

/**
* Memory leak test.
*        * Creates and disposes an objects, and checks if there are some leaking instances.
*
* @type member
* @return {void}
*/
testMemoryLeak : function() {

  var ms1 = de.tests.MemoryLeakUtil.getMemorySnapshot();
  // create
  var dc = new de.cas.qx.ui.widget.calendar.datechooser.DateChooser();

  qx.ui.core.Widget.flushGlobalQueues();

  // dispose
  dc.dispose();
  var ms2 = de.tests.MemoryLeakUtil.getMemorySnapshot();

  var msg = de.tests.MemoryLeakUtil.checkMemoryLeak(ms1, ms2);
  this.assertEquals("", msg, "There are some leaking objects!");
},

此特定测试正在寻找可能由DateChooser组件(由CAS开发的自定义组件之一)引起的内存泄漏。 MemoryLeakUtil类是CAS创建的自定义实用程序类,它利用了Qooxdoo提供的几个功能,例如列出内存中的所有对象。 使用Qooxdoo提供的功能,他们可以轻松测试内存泄漏错误,这在自定义JavaScript组件的开发中很常见。 测试RAP用户界面时面临的第二个问题是处理UI的异步和动态状态。 有几种工具可以记录用户与应用程序的交互,将其存储为脚本并允许其反复运行。 这种类型的测试有助于检查用户界面的行为和交互,就像真实用户正在对其进行操作一样,但是它们往往有局限性。 到目前为止,在他们对Web应用程序测试工具的简要检查中,CAS尚未找到能够处理基于异步和非基于页面的用户界面的应用程序,同样,这也是一个基于Ajax的应用程序,可以在不更改页面的情况下动态加载内容。

有时有时会成为问题的单元测试领域之一就是测试与服务器和/或数据层的交互。 通常会编写直接与服务器,数据库等通信的单元测试,以正确执行它们的测试。 这种类型的测试具有CAS开发人员所经历的缺点,由于与应用程序其他层的通信需要,所以大多数情况下都是围绕单元测试的缓慢性进行的。 常见的解决方案是使用模拟对象,这些对象在单元测试期间实质上代替了“真实的东西”。 Java有多种模拟对象框架,包括MockitoEasyMockJMock ,旨在简化模拟对象的创建。 还有针对JavaScript的模拟对象框架availabel ,例如JSMockMock4JS

之前,您看到了对自定义组件JavaScript层进行单元测试的示例,稍后您将看到测试Java层的示例。 从Eclipse RAP 1.1开始,该框架实质上包括与JUnit测试等效的内容,不同之处在于它允许运行需要运行OSGi环境的测试。 如果您需要在执行过程中更新UI的单元测试,则可以从org.eclipse.rap.junit.RAPTestCase扩展。 但是,如果单元测试不需要对用户界面进行视觉更新,则可以直接从defacto JUnit org.junit.TestCase进行扩展。 以下是与UI交互的RAP测试用例的示例:

public class RapJUnitTest extends RAPTestCase {
   public void testOpenView() {
     try {
       IWorkbenchPage page = getPage();
       page.showView( " org.eclipse.rap.demo.DemoTreeViewPartI " );
     } catch ( PartInitException e ) {
       e.printStackTrace();
     }
     assertEquals( 1, getPage().getViewReferences().length );

     getPage().hideView( getPage().getViewReferences()[ 0 ] );
     assertEquals( 0, getPage().getViewReferences().length );
   }

   private IWorkbenchPage getPage() {
     IWorkbench workbench = PlatformUI.getWorkbench();
     IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
     return window.getActivePage();
   }
} 

此示例演示如何测试实际的UI组件以验证可见视图的数量。 这确实为基于RAP的应用程序的单元测试提供了朝正确方向迈出的一步,但是它没有提供自动的用户驱动的交互。 通过模拟用户单击按钮或在文本字段中输入值来测试UI的能力,是CAS将在不久的将来研究的其他工具所能提供的。

自定义用户界面组件

RAP开箱即用,提供了在SWT中发现的称为RAP Widget Toolkit或RWT的大量组件,这足以满足许多应用程序的需求。 但是,当需要“标准”以外的东西时,Eclipse RAP支持开发和使用定制组件的功能。 开发定制组件时首先要考虑的是组件的类型,在RAP中,有两种不同的类型:“复合”和“所有者绘制”。 复合组件只是现有RAP组件的组合,这些组件组合在一起以在UI中提供新的行为或功能。 另一方面,所有者绘制的组件是源自JavaScript的组件,通常需要大量的工作,有时还需要第三方库。 RAP开发人员指南提供了有关创建“所有者绘制”的自定义组件的分步教程,该组件通过屏幕截图和代码示例概述了整个过程。 如本教程中所述,定制组件开发过程中有四个主要步骤:

  • 创建将在服务器上运行的组件的Java实现。
  • 创建将在浏览器中运行的组件JavaScript实现。
  • 用Java创建一个适配器,该适配器将JavaScript组件与Java组件和RAP生命周期连接起来
  • 通过将扩展添加到org.eclipse.rap.ui.resources extension point来注册JavaScript文件。

CAS的开发人员必须创建几个自定义组件,包括日历,日期选择器,工具栏和类似于Microsoft Outlook中的手风琴导航控件。 日历和工具栏是用JavaScript和CSS和HTML开发的“所有者绘制”组件的示例,这些组件已转换为RAP组件以用于CAS PIA。 Qooxdoo确实为简化组件开发过程提供了丰富的功能和抽象。 下面的屏幕截图显示了几个“所有者绘制”的组件,特别是日历和工具栏。

如您所见,日历组件提供了很多功能,例如左上角的可导航迷你日历,中间的可导航详细日历,添加约会和基于自定义视图过滤日历的功能(即“所有约会”)。 这个特定的组件由大约20,000行代码组成,并且需要大量的时间和精力来实现。 上图中显示的另一个“所有者绘制”组件是工具栏,它提供了Microsoft Office和Microsoft Outlook等应用程序中最近看到的功能。

复合组件的一个示例是时间选择器,可以在CAS PIA中找到它,并在下面的屏幕快照中显示。

这个复合组件由几个组件组成,包括DialogButtonsCombo ,它们共同构成时间选择器。 CAS PIA的屏幕快照中值得注意的另一件事是应用程序的整体样式或主题。 RAP通过使用级联样式表(CSS)提供主题,并且需要将扩展​​名添加到org.eclipse.rap.ui.themes extension point in the plugin.xml file for the applicationorg.eclipse.rap.ui.themes extension point in the plugin.xml file for the application

在开发自定义RAP组件时,在设计和开发阶段要考虑并牢记几件事。 首先,对于需要开发人员来熟悉自定义组件HTML,JavaScript,CSS和Qooxdoo的开发人员来说,有一些学习曲线。 我之所以这样说是因为RAP的好处之一是开发人员可以编写Java代码并且可以远离JavaScript,这是正确的,除非是自定义组件。 其次,开发人员需要做任何必要的事情才能在各种浏览器中提供功能正常的组件。 编写RAP随附的核心组件的开发人员已竭尽全力以确保浏览器兼容性,并且在Qooxdoo的未来版本中,预计将进行重大改进以从组件开发人员中抽象出浏览器兼容性问题。 最后,要记住的另一件事是RAP随附的Qooxdoo版本与您从其网站下载的版本不同。 相反,RAP的开发人员选择包括Qooxdoo的子集,该子集仍提供所需的功能,但允许他们减小框架的整体大小。 最终,这意味着某些功能和类对于Qooxdoo API中出现的RAP开发人员可能不可用。

开发过程中遇到的问题

与开发人员所使用的任何新技术一样,在开发过程中必定会出现学习曲线和问题。 在CAS PIA的开发过程中,开发团队遇到了一些与性能和部署有关的问题。

他们立即遇到的第一个问题是客户端和服务器端的性能差和资源消耗高。 通过实现对象池和缓存,CAS能够进行一些改进,从而实现了GUI控件的重用,而不必一次又一次地创建它们。 这些自行开发的解决方案完全消除了与性能和资源消耗有关的问题,但是,这还不足以完全消除Internet Explorer中的性能问题,这使CAS PIA无法对其进行支持。 CAS有信心Qooxdoo框架的近期改进以及即将发布的Internet Explorer 8将提供合理的性能并使CAS支持IE。 另一方面,最近对其他浏览器(最著名的是Firefox)进行了改进,使其可以继续提高性能并减少客户端的资源使用。

引起麻烦的另一个问题是使用连续集成(CI)生成过程来构建和部署应用程序的RAP组件。 这只是一个问题,因为CAS选择将Eclipse Equinox部署到Tomcat中,而不是将Web服务器嵌入到Equinox运行时中。 在问题的构建方面,CAS使用了Eclipse的Releng-Tools,它可以进行自动夜间构建,但是,他们发现使用Ant的文档很少,而且魔术很多(例如,动态生成的构建脚本) 。 经过大量的日志监视和反复试验,最终将事情调整到每晚构建和运行的状态。

同时,CAS必须解决将Equinox部署到Tomcat的问题。 对于此配置,建议的解决方案是生成一个WAR文件,其中包括所有业务包以及运行时环境,Equinox和RAP。 但是,CAS PIA还要求作为非OSGi组件的EIM与应用程序的RAP部分集成在一起,以便这两个部分可以直接通信而无需使用Web服务或RMI。 解决此问题需要采取两个步骤,首先,他们必须将EIM服务器组件放入其WAR文件的“ lib”目录中。 第二步涉及在应用程序的web.xml文件中对servlet桥进行特殊配置。 具体而言,CAS利用了Servlet桥的“ extendedFrameworkExports ”参数,该参数允许根据需要集成EIM和RAP组件。

得到教训

CAS Software在开发和部署Eclipse RAP应用程序方面非常活跃,即使遇到入门方面的问题,他们仍然喜欢使用Eclipse RAP。 他们发现他们的开发人员已经变得非常有生产力,主要是因为Java开发人员已经习惯了Eclipse IDE,调试支持和组件模型。

一旦CAS解决了上述问题和陡峭的学习曲线,每个人都喜欢使用RAP。 CAS希望RAP将来提供的唯一功能是能够从服务器触发客户端中的操作。 目前,CAS PIA使用的本地解决方案并不是理想的解决方案,但是CAS对RAP的未来持乐观态度。

未来发展方向

CAS Software AG当前在中小企业市场中领导CRM市场,他们计划在2010年之前将其扩展到整个欧洲。CASPIA将在2009年第一季度开始看到营销和促销活动的增加。目标是成为最多20个席位的公司的SaaS CRM的欧洲领先提供商。

CAS将继续致力于使用和支持Eclipse RAP的坚定承诺,实际上CAS将在2009年2月在匈牙利的塞格德大学教授RAP课程。

附加链接

翻译自: https://www.infoq.com/articles/eclipse-rap-casestudy/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

eclipse cas

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值