- 浏览: 2447897 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (574)
- Book (62)
- Architecture (6)
- Java (39)
- Taobao (41)
- Distributed (4)
- Life (72)
- Database (7)
- Spring (16)
- Photography (15)
- Bicycle (41)
- Test (20)
- jBPM (8)
- Business (12)
- Movie (3)
- Ajax (15)
- Code (7)
- Eclipse (96)
- VIM (2)
- Music (6)
- Groovy (10)
- AutoHotKey (3)
- Dorado (10)
- Maven (7)
- Scrum (5)
- English (20)
- Financial (12)
- OSGi (3)
- Other (4)
- Tool (6)
- Browser (1)
- PPT (1)
- Project Management (4)
- Agile (6)
- Nosql (1)
- Search engine (6)
- Shell (2)
- Open Source (4)
- Storm (10)
- Guava (3)
- Baby (1)
- netty (1)
- Algorithm (1)
- Linux (1)
- Python (2)
最新评论
-
roy2011a:
https://github.com/ebottabi/sto ...
storm的序列化问题及与spring的结合方式 -
roy2011a:
能抗能打 写道哥们儿,你好!能共享下那个storm与sprin ...
storm的序列化问题及与spring的结合方式 -
Alick1:
兄弟,你之前是不是在深圳的正阳公司呆过啊?
storm的ack和fail -
liuleixwd:
先点个赞,写的非常好!有个问题请教下,如果我再bolt里不用e ...
storm的ack和fail -
yao-dd:
solr的facet查询
Dorado是一个专注于web表现层界面展现的开发框架,能与各种后台业务逻辑层实现无缝集成,Remedy AR System作为BMC提供的一个ITSM开发平台,为了提供给用户更多的灵活性,提供了一套Java API,这样为Remedy和Dorado进行整合提供了可能.
Dorado 架构,原理,技术实现...省略字若干
Remedy AR System组成元素,系统原理,具体用法...省略字若干
I)Dorado操作后台数据库,包含核心典型代码。
首先这个提法有些问题,如果能直接用dorado来操作数据库了,那还要remedy AR System干嘛?所以应该是Dorado调用Remedy AR System后台业务逻辑层,我们知道所有涉及到数据库的信息管理系统,其业务逻辑归根结底都是对DBMS进行增加,删除,查找和修改操作(CURD), 作为开发平台Remedy AR System也不例外,只是它除了将所有操作的数据保存在数据库里面之外,它还将系统的所有的界面信息(这里主要指的是Forms),相关的操作信息(这里指的是Active Link, Filter, Escalation)也保存到了数据库中.
MVC(model-view-control)是我们进行软件开发时通常的分层方法和设计模式,不过在Remedy AR System中,这种做法没有得到很好的实现,即其View和Model的分层并不明显,所以我们需要做这个工作:找出该表单中的model信息,然后加以定义,比如对一个城市的维护form中,我们需要从form中分离出关于城市的model信息,然后生成成相应的JavaBean.
至此,我们将根据JavaBean信息以及Remedy AR System系统中的Form布局信息来创建Dorado所需要的view.xml文件(dataset+control),最终生成jsp文件.
界面创建完毕之后,接下来就是调用Remedy Java API,在Dorado将通过使用dataset的监听器类以及DataModel类的相应方法,来处理从前台页面发出的CRUD请求以及实现相应的权限控制,这里也是我们调用Java API完成与后台业务层集成的结合点.
Remedy提供的Java API调用一般分为三个部分:根据当前登录用户信息创建ARServerUser对象;然后使用Server Object Factory创建Remedy Server Object,并为Server对象设置相应的参数;执行Server对象的方法(增删查改操作);最后销毁ARServerUser以及创建的Server Object.
下面我们以Remedy自带的Sample中City信息的维护为例,来说明如何使用Dorado与Remedy AR System后台整合进行CRUD操作
(1)查询操作
在dataset监听器的onInit方法中,使用当前登录用户信息实例化一个ARServerUser对象:
- public void onInit(Dataset arg0) throws Exception {
- System.out.println("In Dataset Listener Connecting to AR Server...");
- context = new ARServerUser();
- context.setServer("bstek-macro");
- // 通常用户信息将从session中取得
- context.setUser(new AccessNameID("Demo"));
- context.setPassword(new AccessNameID(""));
- try {
- context.verifyUser(new VerifyUserCriteria());
- } catch (ARException e) {
- // This exception is triggered by a bad server, password or,
- // if guest access is turned off, by an unknown username.
- System.out.println("Error verifying user: " + e);
- // Clear memory used by our user context object
- context.clear();
- System.exit(1);
- }
- System.out.println("In Dataset Listener Connected to AR Server.");
- }
接下来我们在afterLoadData()方法中根据jsp页面传过来的参数,构造操作参数调用Remedy AR System的Java API进行查询操作,Remedy Java API的查询参数非常类似于SQL语法,所以其用法相对来说也十分简单:
- public void afterLoadData(Dataset dataset) throws Exception {
- ParameterSet parameters = dataset.parameters();
- String qualStr = "";
- String city = parameters.getString("city");
- String code = parameters.getString("airPortCode");
- boolean andFlag = false;
- // 构造查询参数
- if (StringUtils.isNotEmpty(city)) {
- qualStr = "( \'City\' like \"%" + city + "%\" )";
- andFlag = true;
- }
- if (StringUtils.isNotEmpty(code)) {
- qualStr += (andFlag ? " and " : "")
- + "( \'Airport Code\' like \"%" + code + "%\" )";
- }
- //设置参数,执行查询操作
- List list = queryRecordsByQual(qualStr);
- //将查询结果返回给dataset,用于jsp页面进行展示
- dataset.fromDO(list);
- }
- private List queryRecordsByQual(String qualStr) {
- List result = new ArrayList();
- System.out.println("Retrieving records with qualification " + qualStr);
- try {
- // 查询参数包括两部分,以部分是列信息,另外一部分是行信息,在得到的结果中,Remedy AR System将自动执行权限控制,也就是说返回的数据是进行了权限约束的,只有当前用户有权限查看到的数据还会返回
- // 首先是根据当前登录用户信息,取得查询要返回数据的列,也就是制定form中的列信息
- FieldCriteria fCrit = new FieldCriteria();
- fCrit.setRetrieveAll(true);
- FieldListCriteria fListCrit = new FieldListCriteria(formName,
- new Timestamp(0), FieldType.AR_ALL_FIELD);
- // 这里的得到的field已经包含了权限信息,只有当前用户可见的列在查询结果中才会出现
- Field[] formFields = FieldFactory.findObjects(context, fListCrit,
- fCrit);
- // 对查询行添加进行解析,类似于SQL中的where条件语句
- QualifierInfo myQual = Util.ARGetQualifier(context, qualStr,
- formFields, null, Constants.AR_QUALCONTEXT_DEFAULT);
- FieldFactory.getFactory().releaseInstance(formFields);
- // 下面是设置行信息,也就是对最终查询结果的行进行处理
- EntryListCriteria listCriteria = new EntryListCriteria();
- listCriteria.setSchemaID(formName);
- listCriteria.setQualifier(myQual);
- EntryListFieldInfo[] entryListFieldList = new EntryListFieldInfo[3];
- // id
- entryListFieldList[0] = new EntryListFieldInfo(
- new FieldID(FIELD_ID), 15, " ");
- // city
- entryListFieldList[1] = new EntryListFieldInfo(new FieldID(
- FIELD_CITY), 15, " ");
- // code
- entryListFieldList[2] = new EntryListFieldInfo(new FieldID(
- FIELD_CODE), 25, " ");
- // Set the entry criteria
- EntryCriteria criteria = new EntryCriteria();
- criteria.setEntryListFieldInfo(entryListFieldList);
- // 最终取得查询结果
- Integer nMatches = new Integer(0);
- Entry[] list = EntryFactory.findObjects(context, listCriteria,
- criteria, false, nMatches);
- System.out.println("Query returned " + nMatches + " matches.");
- if (nMatches.intValue() > 0) {
- for (int i = 0; i < list.length; i++) {
- EntryItem[] items = list[i].getEntryItems();
- result.add(new City(
- (String) items[0].getValue().getValue(),
- (String) items[1].getValue().getValue(),
- (String) items[2].getValue().getValue()));
- }
- }
- EntryFactory.getFactory().releaseInstance(list);
- } catch (ARException e) {
- handleException(e, "Problem while querying by qualifier: ");
- }
- // 清除销毁操作
- cleanup();
- return result;
- }
对于删除操作,则放到DataModel的实现类中处理,在DataModel实现类中(当然也可以放在dataset监听器中处理),与查询操作一样,在init()方法中实例化一个ARServerUser对象,删除操作在制定的方法中实现:
- public void deleteCity(ParameterSet parameters,
- ParameterSet outParameters) throws Exception {
- // find then remove
- Dataset dsCity = getDataset("dsCity");
- Record record = dsCity.getCurrent();
- if (record != null) {
- String id = dsCity.getString("id");
- try {
- // 同所有的操作一样,创建要删除的记录实体对象,这里得到的实体对象也包含了权限信息,如果得到的实体没有删除操作的权限将导致删除失败
- EntryID entryID = new EntryID(id);
- EntryKey entryKey = new EntryKey(formName, entryID);
- Entry entry = EntryFactory.findByKey(context, entryKey, null);
- // 执行实体对象的操作
- entry.remove();
- System.out.println("Record #" + id + " delete successfully.");
- } catch (ARException e) {
- handleException(e, "Problem while modifying record: ");
- }
- }
- // 清除销毁创建对象
- cleanup();
- super.doUpdateData(parameters, outParameters);
- }
新增和修改与删除基本类似,这里就不做详细说明,主要代码如下:
- public void afterUpdateData(Dataset ds) throws Exception {
- List list = new ArrayList();
- ds.toDO(list);
- City city = (City) list.get(0);
- String id = city.getId();
- if (StringUtils.isNotEmpty(id)) {
- // edit
- try {
- EntryID entryID = new EntryID(id);
- EntryKey entryKey = new EntryKey(formName, entryID);
- Entry entry = EntryFactory.findByKey(userInfo, entryKey, null);
- EntryItem[] entryItems = new EntryItem[2];
- entryItems[0] = new EntryItem(new FieldID(FIELD_CITY),
- new Value(city.getCity()));
- entryItems[1] = new EntryItem(new FieldID(FIELD_CODE),
- new Value(city.getAirPortCode()));
- entry.setEntryItems(entryItems);
- entry.store();
- System.out.println("Record #" + id + " modified successfully.");
- } catch (ARException e) {
- handleException(e, "Problem while modifying record: ");
- }
- } else {
- // add
- try {
- EntryFactory entryFactory = EntryFactory.getFactory();
- Entry entryr = (Entry) entryFactory.newInstance();
- entryr.setContext(userInfo);
- entryr.setSchemaID(new NameID(formName));
- EntryItem[] entryItems = new EntryItem[2];
- entryItems[0] = new EntryItem(new FieldID(FIELD_CITY),
- new Value(city.getCity()));
- entryItems[1] = new EntryItem(new FieldID(FIELD_CODE),
- new Value(city.getAirPortCode()));
- // #2 is done in one line just to show another method.
- entryr.setEntryItems(entryItems);
- entryr.create();
- System.out.println("Entry created, id #"
- + entryr.getEntryID().toString());
- } catch (ARException e) {
- handleException(e, "Problem while creating entry: ");
- }
- }
- cleanup();
- }
II)Dorado操作Remedy流程引擎,包含核心典型代码。
因为Remedy的流程处理是与业务相关的,因此属于后台部分,对于dorado来说不存在特殊处理,因此与前面的处理类似
III)Dorado整合Remedy后的性能表现:绝对响应时间以及和Remedy原有系统响应时间对比(后者数据可能目前没法获得)。
一套系统的系能瓶颈主要集中在两个方面:即一个是中间Web Server的并发处理能力,另一个就是数据库访问能力,而dorado展现层开发框架的性能经历过了多个大小项目的考验,事实证明了性能上的可行性,所以如果性能出现问题,只能出现在后台Remedy Java API的执行效率上,这个需要得到BMC公司提供相关的性能指标来加以参考
IV)整合过程的工作量评估,以几个典型界面的改造为例得出的工作量,以及对比传统MIS系统对应界面的开发工作量。
这里工作量的对比应该是相对于其他的改造方案的对比,与传统mis系统没有可比性.与ext2.0之类的纯客户端ajax解决方案来比,dorado不仅有开发工具支持,同时还对前后台通信进行了封装,整合的工作量我们会有明显的优势.
目前对于改造的工作量来说还无法准确进行准确评估,不过针对联通的电子运维系统中一个典型的应用来说,粗略估计周期在2周-4周之间,这个取决于合作双方的人员参与情况,我们的工程师熟悉Remedy AR System系统相关技术的过程,对方提供的相关的Remedy相关的技术支持和业务支持情况,还有就是取决于系统的复杂程度以及最终的改造目标的明确情况
V)可维护性:代码调试性、代码阅读性、流程和界面的松耦合性以及需求变更的解决方案。
因为是一个特殊的表现层改造项目,其特殊之处在于如果界面需求发生改变,需要同时维护两套代码:一套Remedy AR System中定义的Forms, Action Links界面元素,一套是Dorado的Java代码+配置文件,但这也是采用所有其他改造方案都无法避免的问题.所以我们只能通过重用将这个工作量降到最低
VI)附一个典型界面改造的开发步骤。
(1)根据Remedy AR System Forms定义JavaBean数据模型
(2)根据Remedy AR System Forms定义view.xml(如果需要的话module.xml)
(3)给view.xml添加DataModel实现类或dataset监听器实现类调用Remedy Java API实现与Remedy集成
(4)根据Remedy AR System Active Links的定义,转换成Dorado中相应控件的事件代码,完成客户端的操作处理
(4)生成jsp,调整布局得到最终的展现界面
(6)测试通过,模块改造完成
VII)下图是以Remedy 自带是sample中城市维护为例做的一个Remedy与Dorado整合的Demo效果
代码结构图
Remedy Web UI效果:
使用Dorado后的效果:
发表评论
-
几个经常用到的通用Dorado基础类
2008-08-03 01:22 24381.Dorado中虽然提供了ViewModel的接口, 但是这 ... -
使用Dorado框架开发必备参考(更新中)
2008-07-17 18:21 4878[size=medium]下面是我经常 ... -
Dorado重用最佳实践
2008-06-13 21:57 3625在实际开发中我们 ... -
如何在bstek IDE插件版中支持多种服务器
2007-11-27 11:59 2028默认情况下, bstekIDE使用tomcat作为服务器, ... -
插件高级应用---通过扩展点自定义组件
2007-11-08 23:44 3440在前面我介绍 ... -
bstekIDE Eclipse插件扩展点应用介绍
2007-11-06 20:39 4909众所周知,Eclipse开发平台本身就是基于插件 ... -
dorado studio插件定制扩展应用两则
2007-09-21 11:02 3921为了减少在使用dorado框架进行开发中的大量重复劳动,我们提 ... -
dorado学习笔记(二)
2007-09-05 17:45 4657·isFirst, isLast在什么情况下使用?在遍历dat ... -
Dorado学习笔记
2006-12-23 22:45 8729·具有过滤功能的dropdown控件是DynamicDropD ...
相关推荐
Dorado+Spring+Hibernate与Maven整合项目,需要自己创建示例数据库及一张示例表,可以根据entity包下的JavaBean创建。
dorado 中间件 整合插件 jfreechart
整合spring和dorado,使用spring的jdbcTemplate操作数据库
Dorado 整合前端框架,解决无法整合的问题!!!
资源:eclipse-4.3_for_dorado7_ide.zip 之前公司Dorado7开发环境(含插件开箱即用)压缩包珍藏版,支持dorado9开发。
整合spring和dorado的框架
dorado-hibernate和dorado-core的jar包,网上我没下到,
内含Dorado7插件,Eclipse+dorado7插件合集下载地址,百度网盘永久有效地址。
Dorado Client Api.chm dorado 客户端 手册
资源中提供了,下载地址和Dorado 7插件安装方法,可以安装在MyEclipse,Eclipse中任意版本,注意选择你IDE内嵌的Eclipse版本
DORADO是上海锐道开发的一套展现层中间件产品,使用AJAX技术开发提供了非常便捷的方式,本文讨论如何在DORADO开发环境中使用EJB3作为数据持久层方案的具体实现方法
dorado client-api ,dorado client-api
dorado5最新版本dorado5最新版本
Dorado Marmot使用简介
此资源为dorado7前端框架研发工具,适用于国企,银行等老项目后期维护使用
dorado用户指南
dorado资料,文档,组件详解,通过Marmot框架整合dorado5与spring,通过整合的集成框架开发HR系统,持久层采用了Hibernate
Dorado和Excel的结合。
dorado excel dorado excel
dorado7实战 standard lesson 初级中级 示例代码 Dorado7实战-企业通讯录(初级) Dorado7实战-企业通讯录(中级)