楼主: macmics

扩展和自定义 SDO 的解决方案

[复制链接]
论坛徽章:
1
会员2007贡献徽章
日期:2007-09-26 18:42:10
11#
 楼主| 发表于 2007-3-21 06:43 | 只看该作者
该包的名称来自 targetNamespace,它在 XSD 声明的 schema 中定义(图 9)。


图 9. TargetNamespace 声明

schema_targetnamespace.jpg (38.47 KB, 下载次数: 10)

schema_targetnamespace.jpg

使用道具 举报

回复
论坛徽章:
1
会员2007贡献徽章
日期:2007-09-26 18:42:10
12#
 楼主| 发表于 2007-3-21 06:44 | 只看该作者
向已经生成的 SDO 增添附加的属性和行为
用户可以修改已经生成的 SDO,使之包含特定的变量或者行为。当再次生成该 SDO 以用于同一个 schema 的命名空间时,任何没有使用 @generated 标签注解的方法或者变量将不能被替换。用户也可以将这样的文件标记为 non-derived 类型,以便项目 "clean" 时删除这些文件。

向策略 SDO 接口中添加 get/set 方法,xyz.brokerservice.PolicyType:


/**
* Get the value for selected
*/
boolean getSelected();
/**
* Set the value for selected
*/
void setSelected(boolean selected);




向策略 SDO 实现类中添加以下的属性和方法,xyz.brokerservice.impl.PolicyTypeImpl:


/**
* add selected attribute as local variable.
*/
protected boolean selected = false;
/**
* Get the value for selected
*/
public boolean getSelected(){
        return selected;
  }
/**
* Set the value for selected
*/
public void setSelected(boolean selected){
        this.selected = selected;
  }




向客户端 SDO 接口中添加获取的方法,xyz.brokerservice.ClientType:


/**
* TotalPolicyAmount is computed by summation of the client's Policy Amounts
*/
  double getTotalPolicyAmount();




向客户端 SDO 接口中添加以下的方法,xyz.brokerservice.impl.ClientTypeImpl;以下的方法演示了基本的转换能力:


/**
* totalPolicyAmount is computed by summation of the client's Policy Amounts
*/
public double getTotalPolicyAmount(){
        double totalPolicyAmount = 0.00;
        for(int index=0; index < getPolicy().size(); ++index){
                PolicyType policyType = (PolicyType)getPolicy().get(index);
                if(policyType.getPolicyAmount() != null){
                        double temp = 0.00;
                        try{
                                temp = Double.parseDouble(policyType.getPolicyAmount());
                        }catch(NumberFormatException ex){

                        }
                        totalPolicyAmount += temp;
                }
        }
        return totalPolicyAmount;
}




将已经改动的文件标记为 non-derived,以便在项目“clean”期间保留这些改动(图 10)。


图 10. 更改派生属性

mark_files_non_derived_jsp.jpg (27.01 KB, 下载次数: 13)

mark_files_non_derived_jsp.jpg

使用道具 举报

回复
论坛徽章:
1
会员2007贡献徽章
日期:2007-09-26 18:42:10
13#
 楼主| 发表于 2007-3-21 06:45 | 只看该作者
添加新的根 bean 封装器
ValidCodesServiceRoot.java 文件包含了计划命名空间 URI 的注册,用于有效代码服务的属性和它的获取/设置方法。通过调用这些有效的代码服务来慢慢地装载所有有效的代码。在 brokerservice.root 包中添加 ValidCodesServiceRoot.java Java 类:
package brokerservice.root;
import org.eclipse.emf.ecore.EPackage;
import proxy.ValidCodesServiceProxy;
import xyz.validcodesservice.DocumentRoot;
import xyz.validcodesservice.ValidCodesServiceType;
import xyz.validcodesservice.ValidcodesservicePackage;
import dw.ibm.etools.xsd.sdo.xmltransformservice.XMLTransformServiceFactory;

public class ValidCodesServiceRoot extends BaseRoot{
        protected ValidCodesServiceType validCodesServiceRoot;
        static{
                EPackage.Registry.INSTANCE.put(
                                ValidcodesservicePackage.eINSTANCE.getNsURI()
                                , ValidcodesservicePackage.eINSTANCE);
        }
        protected void loadValidCodesResponse(String response){

                DocumentRoot docRoot=
                 (DocumentRoot) XMLTransformServiceFactory.INSTANCE.load(response);
                validCodesServiceRoot =  docRoot.getValidCodesService();
        }
        public ValidCodesServiceType getValidCodesServiceRoot() {
                if(validCodesServiceRoot == null){
                        preLoadValidCodes();
                }
                return validCodesServiceRoot;
        }
        public void setValidCodesServiceRoot(
                        ValidCodesServiceType validCodesServicetRoot) {
                this.validCodesServiceRoot = validCodesServicetRoot;
        }
        protected void preLoadValidCodes(){
            String response = ValidCodesServiceProxy.invoke(
                                    ValidCodesServiceProxy.ALL_REQUEST);
            loadValidCodesResponse(response);
        }
}



更新现有的根 bean 封装器
更新 brokerservice.root 包中现有的BrokerUpdateRoot.java Java 类 ,该包提供了相关的下载文件,或者更新带有以下附加物的文件:

下列方法通过使用框架 API 以将数据对象转变为 XML 字符串的方式向服务发送这些更新,从而更新 broker 信息。转变 API 的第 2 个参数确保所有的空属性将不属于序列化 XML 的一部分。如果这样的元素声明被接收端的 XML 处理器接收,那么用户就可以使用转变 API 的其他实现。


public void applyPolicyChanges(){
                //unset all the features that are empty
            String xmlData = XMLTransformServiceFactory.INSTANCE.convert((DataObject)brokerServiceRoot, true);
            String response =
                    BrokerServiceProxy.invoke(xmlData,
                                    BrokerServiceProxy.BROKERUPDATE_REQUEST);
            loadBrokerDetailUpdateResponse(response);
        }




使用装载 API 调用来装载从服务调用中返回的响应。创建 SDO 包时,所有不属于计划的元素将会通过装载调用记录下来。当该数据对象使用转变 API 被序列化到 XML 时, 这些元素就会被写回。


protected void loadBrokerDetailUpdateResponse(String response){
                DocumentRoot docRoot=
                  (DocumentRoot) XMLTransformServiceFactory.INSTANCE.load(response);
                BrokerServiceType brokerdetailUpdateRespRoot =  docRoot.getBrokerService();
                //set the error type
                brokerServiceRoot.setError(brokerdetailUpdateRespRoot.getError());
        }




该方法向客户端现有的策略清单中添加新的策略。ClientType 中的 createPolicy 方法创建新的 PolicyType 对象,并将其添加到现有 Policy 清单中。


public void addNewPolicy(ClientType clientType){
                clientType.createPolicy();
        }




该方法删除了客户端现有策略清单中选中的策略。


public void deleteSelectedPolicy(ClientType clientType){
                for(int index=clientType.getPolicy().size()-1; index >= 0; --index){
                        PolicyType policyType = ((PolicyType)clientType.getPolicy().get(index));
                        if(policyType.getSelected()){
                                clientType.getPolicy().remove(policyType);
                        }
                }
        }





向页代码中添加命令方法
编辑 brokerupdate.jsp 的 Brokerupdate.java 页代码文件,并添加下列方法作为命令行为来使用。(这些方法中使用的控制数据访问器在下一步中定义。)

该操作调用了 BrokerUpdateRoot.class 上的 addNewPolicy 方法以向现有的策略清单中添加新的策略行。当前的 Client 行是使用 Client 数据表的 rowData 检索得到的。


public String doAddNewPolicyAction(){
                this.getVarBrokerUpdateRootBean().addNewPolicy((ClientType)getTable1().getRowData());
                //returning empty string re-displays the page with same data binding
                return "";
        }





该操作调用了BrokerUpdateRoot.class上的 deleteSelectedPolicy 方法来删除现有的策略清单上选中的策略。


public String doDeleteSelectedPolicyAction(){
                this.getVarBrokerUpdateRootBean().deleteSelectedPolicy((ClientType)getTable1().getRowData());
                return "";
        }





该操作反映了带有任何数据改动的 Java bean,在此仅作演示之用。在实际的应用程序中,用户在这里可以进行一些数据处理,或者根本不需要这种方法。


public String doUpdatePolicyAction(){
                return "";
        }





该操作调用了 BrokerUpdateRoot.class 上的 applyPolicyChanges 方法以将更新后的数据发送给服务。varBrokerUpdateRootBean,会话的受 JSF 管理的会话范围 bean,它将从该会话中移出,以便该 bean 从下一个调用的新数据中重新写入。


public String doApplyPolicyChangesAction(){
                this.getVarBrokerUpdateRootBean().applyPolicyChanges();
                this.sessionScope.remove("varBrokerUpdateRootBean";
                //a navigation rule is defined for this return
                return "applyChanges";
        }






附加到页数据的 Bean

在页数据中配置 varBrokerUpdateRootBean 使其成为受 JSF 管理的 bean,并设置范围为 session (图 11)。这将用户会话生命周期的 bean 实例。这样有关策略的创建、更新或者删除操作,将会继续保存在会话中,除非他们被应用到 Apply Changes 行为。
图 11. 配置页数据中的 Java Bean

configure_bu_brokerupdatero.jpg (77.03 KB, 下载次数: 14)

configure_bu_brokerupdatero.jpg

使用道具 举报

回复
论坛徽章:
1
会员2007贡献徽章
日期:2007-09-26 18:42:10
14#
 楼主| 发表于 2007-3-21 06:46 | 只看该作者
在页数据中添加 varValidCodesRootBean 使其成为受 JSF 管理的 bean,并设置范围为应用程序。这将缓存应用程序实例生命周期的 bean 实例。
图 12. 配置页数据中的 Java Bean

add_bu_validcodes_bean.jpg (87.44 KB, 下载次数: 14)

add_bu_validcodes_bean.jpg

使用道具 举报

回复
论坛徽章:
1
会员2007贡献徽章
日期:2007-09-26 18:42:10
15#
 楼主| 发表于 2007-3-21 06:47 | 只看该作者
将页上的控制绑定更新为页数据中的 SDO 类型

选择 Policy 数据表,并在其属性中添加新列(图 13)。将该列重命名为 "Delete",并将其移动到列表的第一列。
图 13. 添加列

add_new_column_to_policy.jpg (32.12 KB, 下载次数: 14)

add_new_column_to_policy.jpg

使用道具 举报

回复
论坛徽章:
1
会员2007贡献徽章
日期:2007-09-26 18:42:10
16#
 楼主| 发表于 2007-3-21 06:48 | 只看该作者
从控制面板中拖动 checkbox,将其添加到新的表格列中(图 14)。
图 14. 添加 Checkbox

add_checkbox_control_to_tab.jpg (8.38 KB, 下载次数: 13)

add_checkbox_control_to_tab.jpg

使用道具 举报

回复
论坛徽章:
1
会员2007贡献徽章
日期:2007-09-26 18:42:10
17#
 楼主| 发表于 2007-3-21 06:48 | 只看该作者
从页数据视图中定义的策略 SDO 中拖动"selected"属性,并且将其放到测量数据表中的 checkbox 上(图 15)。
图 15. Checkbox 绑定

drag_selected_to_table.jpg (20.02 KB, 下载次数: 15)

drag_selected_to_table.jpg

使用道具 举报

回复
论坛徽章:
1
会员2007贡献徽章
日期:2007-09-26 18:42:10
18#
 楼主| 发表于 2007-3-21 06:49 | 只看该作者
向策略数据表中添加命令按钮,并且将按钮的标签改为 "Add New Policy"(图 16)。显示出用于策略数据表的页脚区,以便用户能够放置该命令按钮。
图 16. 添加命令按钮

add_new_policy_bu_1.jpg (12.37 KB, 下载次数: 11)

add_new_policy_bu_1.jpg

使用道具 举报

回复
论坛徽章:
1
会员2007贡献徽章
日期:2007-09-26 18:42:10
19#
 楼主| 发表于 2007-3-21 06:50 | 只看该作者
将这个命令按钮绑定到 doAddNewPolicyAction(图 17)。如果没有显示 "action" 属性,那么就显示数据表的所有属性。
图 17. 将命令绑定到行为

add_new_policy_bu_2.jpg (45.03 KB, 下载次数: 13)

add_new_policy_bu_2.jpg

使用道具 举报

回复
论坛徽章:
1
会员2007贡献徽章
日期:2007-09-26 18:42:10
20#
 楼主| 发表于 2007-3-21 06:50 | 只看该作者
向策略数据表中添加命令按钮,将该按钮的标签改为 "Delete Selected Policy"(图 18),并将此按钮绑定到 doDeleteSelectedPolicyAction(图 19)。
图 18. 添加命令按钮

delete_sel_policy_bu_1.jpg (30.07 KB, 下载次数: 12)

delete_sel_policy_bu_1.jpg

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表