SDO对EMF的依赖.doc_第1页
SDO对EMF的依赖.doc_第2页
SDO对EMF的依赖.doc_第3页
SDO对EMF的依赖.doc_第4页
SDO对EMF的依赖.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

事实上,IBM 的 SDO 参考实现就是一种 SDO 的 EMF 实现。一、 SDO 创建对象的过程与Ecore创建对象的过程比较1、 SDO创建对象分两种情况:直接从XSD文件创建和用程序创建。 我们这里所说的直接从XSD文件创建是指:在创建对象暂时理解为由schema定义的一个有一定结构的xml文档之前它的模型(也就是相应的schema)就已经存在了,程序运行过程中只需要把这个模型加载便可。HelperContext scope=SDOUtil.createHelperContext();XSDHelper xsdHelper=scope.getXSDHelper();URL url=getClass().getResource(“/”+”company.xsd”);xsdHelper.define(url.OpenStream(),url.toString();如此静态模型加载完毕,之后要创建一个根对象。DataObject company=scope.getDataFactory().create(“Company.xsdThe url of the tyep”,”CompanyTypeThe name of the Type.”);其实这个时候我们创建的company对象就是之前我们所提到的根对象(RootObject),接下来的工作就是按照schema模型的定义,一层一层对company进行填充。用程序创建指:在创建对象之前不存在它的定义,我们需要在程序运行过程当中定义,这个过程可能比较麻烦。其实就是用程序来生成一个schema.看下面这段实例代码:Type intType = typeHelper.getType(commonj.sdo, Int); Type stringType = typeHelper.getType(commonj.sdo, String); DataObject customerType = scope.getDataFactory().create(commonj.sdo, Type); customerType.set(uri, /customer); customerType.set(name, Customer); 创建一个类型 DataObject custNumProperty = customerType.createDataObject(property); custNumProperty.set(name, custNum); custNumProperty.set(type, intType);创建一个属性对象,并且设置它的名称和类型 DataObject lastNameProperty = customerType.createDataObject(property); lastNameProperty.set(name, lastName); lastNameProperty.set(type, stringType); DataObject firstNameProperty = customerType.createDataObject(property); firstNameProperty.set(name, firstName); firstNameProperty.set(type, stringType); Type t = typeHelper.define(customerType); Type testType = scope.getTypeHelper().getType(/customer, Customer); DataFactory factory = scope.getDataFactory(); DataObject customer1 = factory.create(/customer, Customer); customer1.setInt(custNum, 1); customer1.set(firstName, John); customer1.set(lastName, Adams);按照上面创建的schema创建一个customer对象 2、 Ecore创建对象过程EcoreFactory ecoreFactory = EcoreFactory.eINSTANCE;EcorePackage ecorePackage = EcorePackage.eINSTANCE;/创建一Company类EClass companyClass = ecoreFactory.createEClass();companyClass.setName(Company);/创建公司名 EAttribute companyName = ecoreFactory.createEAttribute();companyName.setName(name);companyName.setEType(ecorePackage.getEString();companyClass.getEStructuralFeatures().add(companyName);/创建一Employee类EClass employeeClass = ecoreFactory.createEClass();employeeClass.setName(Employee);/在Employee类上添加一个名字属性EAttribute employeeName = ecoreFactory.createEAttribute();employeeName.setName(name);employeeName.setEType(ecorePackage.getEString();employeeClass.getEStructuralFeatures().add(employeeName);/创建一Department类EClass departmentClass = ecoreFactory.createEClass();departmentClass.setName(Department);/添加department标志数字EAttribute departmentNumber = ecoreFactory.createEAttribute();departmentNumber.setName(number);departmentNumber.setEType(ecorePackage.getEInt();departmentClass.getEStructuralFeatures().add(departmentNumber);/department类能够包含到一个或多个employee的参考EReference departmentEmployees = ecoreFactory.createEReference();departmentEmployees.setName(employees);departmentEmployees.setEType(employeeClass);/指定它可能是一个或多个employeedepartmentEmployees.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);departmentEmployees.setContainment(true);departmentClass.getEStructuralFeatures().add(departmentEmployees);/company能够包含到一个或多个departments的参考EReference companyDepartments = ecoreFactory.createEReference();companyDepartments.setName(department);companyDepartments.setEType(departmentClass);companyDepartments.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);companyDepartments.setContainment(true);companyClass.getEStructuralFeatures().add(companyDepartments);/创建一个包-描述companyEPackage companyPackage = ecoreFactory.createEPackage();companyPackage.setName(company);companyPackage.setNsPrefix(company);companyPackage.setNsURI(pany.ecore);companyPackage.getEClassifiers().add(employeeClass);companyPackage.getEClassifiers().add(departmentClass);companyPackage.getEClassifiers().add(companyClass);通过使用反射API,你能创建并且初始化一个你的模型的实例:/得到company工厂EFactory companyFactory = companyPackage.getEFactoryInstance();/使用工厂来创建company类的实例并且/设置company名字EObject company = companyFactory.create(companyClass);company.eSet(companyName, MyCompany);/创建一个employee类的实例 EObject employee = companyFactory.create(employeeClass);/使用反射API初始化employee的名字employee.eSet(employeeName, John);/创建一个department类的实例EObject department = companyFactory.create(departmentClass);department.eSet(departmentNumber, new Integer(123);/添加John到department(List)department.eGet(departmentEmployees).add(employee);/添加department到company(List)company.eGet(companyDepartments).add(department);通过上面两个例子,可以很清楚的看到对的依赖,他们创建模型的过程非常相似。二、 (反)串行化因为EMF能够处理多重模型源,包括XML模式,通常,当你调用ResourceSet.createResource(URI)方法时,它查询Resource.Factory.Registry来查找一个工厂-该工厂是为该URI而注册的并且使用它来创建一个适当的资源实现。因此,在你(反)串行化你的数据以前,请确保你已注册了适当的资源工厂实现。EMF提供若干Resource.Factory实现:对于XMI数据,使用org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl。对于Ecore模型,使用org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl。你的工具箱中有了这些EMF资源后,你就能使用下面的代码来串行化你的数据:/创建资源集和资源ResourceSet resourceSet = new ResourceSetImpl();/注册XML资源工厂resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(xmi, new XMIResourceFactoryImpl();Resource resource = resourceSet.createResource(URI.createFileURI(c:/temp/company.xmi);/添加根对象到资源resource.getContents().add(company);/串行化资源-你还能指定串行化/选项,它定义在org.eclipse.emf.ecore.xmi.XMIResource中resource.save(null);company.xmi被串行化后的形式如下:?xml version=1.0 encoding=ASCII?company:Company xmi:version=2.0 xmlns:xmi=/XMIxmlns:company=pany.ecore name=MyCompanydepartment number=123employees name=John/department/company:Company三、 EMF的反射机制和的反射机制1. EMF中的一个关键接口是Eobject,它在概念上等价于java.lang.Object。所有的建模对象,无论是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论