`

Tuscany SDO 中的Bug 续

    博客分类:
  • SOA
XML 
阅读更多

下面是测试用例:

//从schema文件和xml文件反序列化成一个SDO对象

DataObjectPtr generateSDOFromFile(const char* xsdFileUri, const char* xmlFileUri,const char* nameSpace = "")

{    

      DataObjectPtr root=NULL;

      try          

      {            

             DataFactoryPtr mdg=DataFactory::getDataFactory();

             XSDHelperPtr xsdHelper=HelperProvider::getXSDHelper(mdg);

             string rootTypeURI = xsdHelper->defineFile(xsdFileUri);

 

             XMLHelperPtr xmlHelper = HelperProvider::getXMLHelper(mdg);

             XMLDocumentPtr xmlDoc=xmlHelper->loadFile(xmlFileUri,nameSpace);              

             root=xmlDoc->getRootDataObject();          

      }

      catch(SDORuntimeException e)

      {

             cout << "Exception in generateSDOFromFile"<< endl;           

      }

      catch(…)

{

             cout<<”…Exception in generateSDOFromFile”<<endl;

}

      return root;   

}

 

void testSDOXsdBug()

{

      DataObjectPtr company = generateSDOFromFile("company2.xsd", "company2.xml");

 

      cout<<"aname = "<<company->getCString("aname")<<endl;

      cout<<"ename = "<<company->getCString("ename")<<endl;

 

      generateXsdFile(company, "generatedCompany2.xsd");//使用未更正的tuscany_sdo.dll 与company2.xsd不一致 anme属性变成了aname元素

      generateXmlFile(company, "generatedCompany2.xml", "company");//与company2.xml一致

             

}

 

//从SDO对象中构造schema文件

void generateXsdFile(DataObjectPtr dataObject,const char* xsdFileUri, const char* targetNamespace = "")

{

      try

      {            

             DataFactoryPtr mdg  = DataFactory::getDataFactory();

             mdg = dataObject->getDataFactory();

             XSDHelperPtr xsdHelper = HelperProvider::getXSDHelper(mdg);

             TypeList tList = mdg->getTypes( );

 

             cout<<"generateXsdFile: before generateFile"<<endl;

 

             xsdHelper->generateFile(tList,xsdFileUri,targetNamespace);

 

             cout<<"generateXsdFile: before generateFile"<<endl;

      }

      catch(SDORuntimeException e)

      {

             cout<<"Exception in generateXsdFile "<< endl;

             cout<< e<<endl; 

      }

      catch(…)

{

       cout<<"…Exception in generateXsdFile "<< endl;

}

}

 

 

//-------------company2.xsd

/*

 

  <?xml version="1.0" encoding="UTF-8"?>

  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

  <xs:element name="company">

             <xs:complexType>

             <xs:sequence>

             <xs:element name="ename" type="xs:string"/>

             </xs:sequence>

             <xs:attribute name="aname" type="xs:string"/>                              

             </xs:complexType>

             </xs:element>

             </xs:schema>

 

*/

 

//-------------generatedCompany2.xsd (使用原始的tuscany_sdo.dll)

/*

<xsd:schema xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="company" type="company"/>

<xsd:complexType name="company">

<xsd:sequence>

<xsd:element name="ename" type="xsd:String" minOccurs="0"/>

<xsd:element name="aname" type="xsd:String" minOccurs="0"/>

</xsd:sequence>

</xsd:complexType>

</xsd:schema>

 

*/

 

 

//----------company2.xml

/*

<?xml version="1.0" encoding="UTF-8"?>

<company aname = "aname">

<ename>ename</ename>

</company>

*/

//----------generatedCompany2.xml

/*

<?xml version="1.0" encoding="UTF-8"?>

<company xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" aname="aname">

<ename>ename</ename>

</company>

*/

 

 

 

 

3.4 解决方案

前后两个schema文件不一致的原因是在从shema文件构造SDO对象时,遇到attribute,构造成的propertybisContainment属性没有重置为false,该属性的默认值为true。所以在从这个SDO对象生成schema文件时,property会被构造为element,而不是attribute

在补丁程序中,只要在从attribute构造SDO对象的property时,将其bisContainment属性设为false即可。

下面是更正的方法,只在语句thisProperty.isElement = false;后添加了thisProperty.isContainment = false;语句:

void SDOSchemaSAX2Parser::startAttribute(

            const SDOXMLString& localname,

            const SDOXMLString& prefix,

            const SDOXMLString& URI,

            const SAX2Namespaces& namespaces,

            const SAX2Attributes& attributes)

        {

 

            LOGINFO_1( INFO,"SchemaParser:startAttribute:%s",(const char*)localname);

 

            if (!bInSchema) return;

 

            PropertyDefinitionImpl thisProperty;

           

            thisProperty.isElement = false;

            thisProperty.isContainment = false;   //!!!!!! new added. The default value of isContaintment is true.   !!!!!!

           

            setName(attributes,

                thisProperty.name,

                thisProperty.localname);

 

            thisProperty.namespaceURI = schemaInfo.getTargetNamespaceURI();

 

            setType(thisProperty, attributes, namespaces);

           

            setCurrentProperty(thisProperty);                   

        }

 

使用改正后的tuscany_sdo构造的shcema文件为:

//-------------generatedCompany2.xsd (使用改正后的 tuscany_sdo.dll)

/*

<xsd:schema xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="company" type="company"/>

<xsd:complexType name="company">

<xsd:sequence>

<xsd:element name="ename" type="xsd:String" minOccurs="0"/>

</xsd:sequence>

<xsd:attribute name="aname" type="xsd:String"/>

</xsd:complexType>

</xsd:schema>

*/

 

 

 

这就与原来的company2.xsd文件保持一致了。

分享到:
评论

相关推荐

    Tuscany的开源项目Tuscany_sdo(C++版)

    在C++版的Tuscany SDO中,这个概念被实现为一个库,允许C++开发者轻松地处理和操作数据。 **SDO的核心特性** 1. **统一的数据模型**:SDO定义了一种统一的数据模型,无论数据来源何处,如数据库、XML文件或Web服务...

    Tuscany-SDO-学习笔记

    ### Tuscany-SDO-学习笔记 #### 1. SDO基础知识 ##### 1.1 创建DataObject **1.1.1 动态定义类型,然后创建DataObject** 在这一节中,我们将探讨如何通过动态定义类型来创建DataObject。这种方式允许我们在运行...

    tuscany-das&sdo&distribution-all.zip

    标题中的“tuscany-das&sdo&distribution-all.zip”提到了三个关键概念:Tuscany Data Access Service (Tuscany DAS),Service Data Objects (SDO) 和 Distribution。这表明该压缩包可能包含了与这些技术相关的软件...

    tuscany-sdo-1.1.1-javadoc.chm

    自制CHM版的API文档,带索引。 注:如果各位下载后打开或无法显示页面,请在CHM文件右键—属性—解除锁定即可。

    tuscany发布webservice实例

    在这个“Tuscany发布Web服务实例”中,我们将深入探讨如何利用Tuscany来配置和发布一个简单的Web服务接口。 1. **Tuscany简介** Tuscany的设计目标是支持多种服务交互协议和服务模型,如SOAP、REST、JMS等,并且...

    tuscany1.6.2

    【压缩包子文件的文件名称列表】中的 "tuscany-sca-1.6.2-src" 表明这是Apache Tuscany SCA框架的1.6.2版本的源代码文件。源代码对于开发者来说至关重要,因为它提供了项目的原始构建块,允许他们深入理解代码的工作...

    apaceh -TUSCANY 源码

    Tuscany源码的分析有助于深入理解SCA的工作原理以及如何在实际开发中应用这一框架。 SCA的核心概念包括组件、服务、绑定和配置。组件是应用程序的基本单元,可以提供或消费服务。服务是组件对外提供的接口,供其他...

    tuscany的一点文档

    Tuscany是一个开源的服务组合架构(Service Component Architecture, SCA)实现,它提供了一种方式来管理和控制应用程序中与业务逻辑正交的方面,比如日志、监控和安全性。策略在Tuscany和SCA中扮演着关键角色,它们...

    Apache Tuscany SCA 用户指南StepByStep

    在“Apache Tuscany SCA 用户指南StepByStep”中,读者可以期待获得以下关键知识点: 1. **SCA基础概念**:首先,你需要理解SCA的核心概念,包括组件(Component)、服务(Service)、引用(Reference)和绑定...

    Tuscany SCA与Spring、Hibernate整合实例-简洁方法

    由于压缩包中已删除了`lib`文件夹中的jar,你需要手动添加这些依赖到你的项目类路径中,包括Tuscany的SCA实现、Spring的核心库和Hibernate的JAR文件。 2. **创建SCA组件**:定义SCA组件,这些组件可以是Spring Bean...

    Tuscany 架构图

    Tuscany架构 Tuscany架构.jpg Tuscany架构.jpg

    sdo规范及其应用介绍

    实现SDO需要在项目中引入相应的库,如Apache Tuscany,它是开源实现SDO的一个重要框架。配置完成后,可以通过创建数据图和数据对象来开始数据访问操作。 1. **Apache Tuscany的Java SDO** - **将XML转换为Data ...

    apache-tuscany-sca-1.6.2

    在“apache-tuscany-sca-1.6.2”这个压缩包中,我们能找到Apache Tuscany的特定版本——1.6.2。这个版本包含了项目的所有源代码,这对于开发者来说是极其宝贵的资源,因为源码可以提供深入理解其内部工作原理的机会...

    Tuscany SCA in Action

    《Tuscany SCA在行动》一书深入探讨了Service Component Architecture(SCA)与Apache Tuscany项目,这是IT领域内对服务组件架构及其实现的重要研究资料。以下是基于标题、描述、部分目录和标签生成的相关IT知识点:...

    Apache tuscany SCA实例

    2. **示例代码**:实例中可能包含了演示如何使用Apache Tuscany创建和部署SCA组件的代码。这些代码可能包括服务组件、绑定接口和服务配置文件。 3. **文档**:除了代码,可能还附带了详细的文档,解释了如何理解和...

    tuscany-wsdl2java-1.5

    tuscany wsdl2java tools

    是tuscany与spring,axis整合所有的jar包,已解决冲突问题。

    根据提供的文件信息,本文将详细解析Tuscany与Spring、Axis整合的相关知识点,以及如何解决在整合过程中可能遇到的jar包冲突问题。 ### Tuscany简介 Tuscany项目是Apache软件基金会的一个顶级项目,专注于提供一个...

    soa-tuscany资料与5个小例子

    5个代码例子使用的是 Tuscany1.5版本。请在官网下载jar包。 下载地址:http://archive.apache.org/dist/tuscany/java/sca/1.5/apache-tuscany-sca-1.5.zip 5个例子从不同的角度讲解了tuscany的整体架构思想。文档...

Global site tag (gtag.js) - Google Analytics