安徽新华电脑专修学院_安徽电脑培训_安徽电脑培训学校_合肥电脑培训

當前位置:首頁 > 網(wǎng)站舊欄目 > 學習園地 > 設(shè)計軟件教程 > EMF開發(fā)指南之客戶端編程

EMF開發(fā)指南之客戶端編程
2010-01-14 22:44:56  作者:  來源:
★emf 運行時編程
★通過package和factory我們可以非常方便的取得class的metamodel信息,并且創(chuàng)建class instance。
★EClass,EPackage,EFactory提供了一些通用的方法,由此派生而來的class,package,factory則提供了更多便利的方法以供我們使用。
★訪問指定的class除了通過package的getXxxx()方法之外,還可以取得那些沒有g(shù)enerated的class,其用法是XxxxPackage.getEClassifier("Yyyyy")。
★通過package,我們可以遍歷訪問所有的class(以及attribute,reference,operation),datatype,enumeration
★訪問package中所有的類使用EPackage.getEClassifiers()方法,遍歷EClass所有屬性用EClass.getEAttributes()方法,遍歷reference用EClass.getEReferences()方法
★通過package創(chuàng)建制定類實例的幾種做法:第一種就是使用XxxxPackage.createYyyy();第二種則是先通過XxxxPackage.eINSTANCE.getYyyyy()這種方式得到相關(guān)的實例類,以及XxxxFactory.eINSTANCE得到factory實例,最后使用xxxxFactory.create(yyyyClass)創(chuàng)建實例。
★通過一個給定的class name和相關(guān)的package uri創(chuàng)建類實例,一般為了得到類實例,我們需要得到class以及factory,而這些都可以通過package取得(通過getEClassifier()和getEFactoryInstance()方法)
★EPackage是對ecore xml文件的一個序列化對象,因此可以直接使用resouce,從一個ecore文件得到package對象,實際上這是一種比較底層的做法,通常我們不這樣做,而是通過使用Package的Registry來映射到給定uri的package對象,Registry從java.util.Map繼承而來,通過uri跟一個Package或者Package.Discriptor關(guān)聯(lián),這里的Discriptor主要在plugin模式下使用,除非真的需要Package,否則在初始化的時候?qū)iscriptor注冊到Registry中。在需要使用Package的時候,則通過Discriptor來取得(通過調(diào)用其getEPackage()方法),通過EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(packageNsURI)方法,我得到了package,接著得到class name和factory以及最終所需要的class instance就易如反掌了。
★emf presistence framework
★emf的持久化機制主要圍繞4個接口:Resource,ResourceSet,Resource.Factory, URIConvertor。通過這4個接口便可以實現(xiàn)emf model的加載和保存
★URI 統(tǒng)一資源標識是一個標識和定義各種類型(文件、網(wǎng)絡(luò)、數(shù)據(jù)庫、文件對象以及數(shù)據(jù)流)資源開放標準。一個URI由三部分組成:scheme,scheme-specific以及fragment(可選)。org.eclipse.emf.common.util.URI是對URI的一種封裝,scheme標識訪問resource協(xié)議,文件為file,jar為jar,eclipse為platform
★file:/c:/dir1/dir2/myfile.xml和file:///c:/dir1/dir2/myfile.xml表示的資源是同一個,但是卻是不同的URI對象
★scheme-specific由authority,device以及其他的segment組成,authority由//打頭,device和segment都是以/打頭,uri中從#開始往后都是fragment
★emf使用帶有fragment的URI就可以引用到指定的EObject
★URIConvertor 用來將一個uri跟一個實際的uri建立映射關(guān)系,比如將一個namespace uri(http:///com/example/epo2.ecore)映射為一個物理uri(platform:/resource/project/somemodel.ecore),它還有一個功能就是normalize,也就是convert的意思,沒明白這個機制
★URIConvertor提供createInputStream() and createOutputStream()兩個方法,用來在制定的uri上打開兩個input和output stream。
★Resouce表示一個EObject集合的持久容器,可以通過URI來進行定位,Resource.getContents()的add方法向一個Resource添加一個EObject,也可以通過給容器類型的關(guān)聯(lián)添加一個引用來給Resource添加一個EObject,Resource比較重要的是save()和load()方法,這兩個方法定義了持久化的格式,還有g(shù)etEObject()和getURIFragment()方法則用來使用URI查找對象
★save和load方法的實現(xiàn)機制:首先使用URIConvertor將指定的uri進行轉(zhuǎn)換,然后打開相應(yīng)的stream,接著調(diào)用doSave和doLoad方法,這些方法交給子類去實現(xiàn),在save和load兩個方法調(diào)用中會傳一個map參數(shù),這個參數(shù)用來控制save和load的行為
★Resource.Factory 用來創(chuàng)建resoruce對象的,所有的factory都使用一個map的registry來加以管理,跟package的registry一樣的做法,不同之處它是根據(jù)uri scheme以及extension來進行分類注冊的。在plugin中默認情況下所有的emf model都使用XMIResourceFactoryImpl,如果要自定義factory,可以通過添加擴展點org.eclipse.emf.ecore.extension_parser,并指定自己的factory實現(xiàn),一般情況下resource factory只是用來給resourceset來使用
★ResourceSet 用來管理已經(jīng)load和create的resource集合,主要使用createResource(),getResource(),getEObject()這幾個方法。createResource()用于在set中創(chuàng)建一個空的resource對象,getResource()也會先創(chuàng)建一個Resource,然后用指定的resource URI去加載指定的resource,getEObject()則在已有的resource(或者根據(jù)uri調(diào)用getResource()方法先加載resource)中根據(jù)需要加載EObject,
★除了可以直接通過new以及resource.factory的createResource()方法來創(chuàng)建resource對象之外,也可以通過調(diào)用ResourceSet的getResource() and createResource()方法來創(chuàng)建(其內(nèi)部會調(diào)用resource.factory的相應(yīng)方法),這樣做的一個重要原因是它能夠跟蹤某個uri是否已經(jīng)被打開,這樣可以避免內(nèi)存里面出現(xiàn)兩份一樣的resource,resource set還可以按需加載當前resource對另外一個resource的引用
★使用ResourceSet的時候需要resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION,new  XMIResourceFactoryImpl());這樣設(shè)置一把,否則會因為找不到rsourceFactory而無法使用resource

★emf resource implementation
★在生成一對一的屬性的時候,會在當前節(jié)點上以attribute的形式添加
★在生成一對多的屬性的時候,會在當前節(jié)點中以子節(jié)點的方式添加屬性
★在生成包含關(guān)系的引用的時候,會在當前節(jié)點中以子節(jié)點的方式添加引用節(jié)點
★在生成非包含關(guān)系的引用的時候,會在當前節(jié)點中以attribute的形式引用子節(jié)點的fragment,但是如果設(shè)置在被包含引用的iD屬性的話,則采用id的方式加以引用。
★在創(chuàng)建交叉引用的時候需要把resource的save放在所有resource生成之后。交叉引用可以使用相對路徑也可以使用絕對路徑,但是相對路徑更好一些,因為可移植性更好,要做到使用相對路徑引用,則需要在創(chuàng)建resource的時候使用絕對uri路徑
★如果引用存在繼承關(guān)系,那么對于引用的具體子類,會在生成的xml中添加xmi:type屬性來表明具體引用的是哪個子類

★xml輸出的定制
★OPTION_DECLARE_XML為false標識沒有xml頭聲明
★OPTION_LINE_WIDTH好像沒有效果
★OPTION_USE_ENCODED_ATTRIBUTE_STYLE 為true則總是使用uri方式來進行引用
★OPTION_SKIP_ESCAPE為true(默認為true)表示針對轉(zhuǎn)義字符(<,>,&)進行轉(zhuǎn)換
★OPTION_XML_MAP 用來將制定的節(jié)點內(nèi)容進行轉(zhuǎn)換
★OPTION_ENCODING為xml設(shè)置字符集
★xml輸入定制
★OPTION_DISABLE_NOTIFY 為true取消觸發(fā)通知
★OPTION_XML_MAP 在save的時候使用了OPTION_XML_MAP,那么在load的時候也要使用

★adapter編程
★給一個model object添加一個adapter有三種方式:第一種通過model object的eAdapters屬性將一個adapter跟model關(guān)聯(lián)起來;第二種通過adapter factory的adapt方法將一個adapter與一個model object關(guān)聯(lián)起來;第三種通過擴展已有的adapter factory創(chuàng)建制定類型的adapter來與model object關(guān)聯(lián)。
★Notification用來封裝通知信息,這里除了getNotifier()方法返回通知的發(fā)送者之外,還包括通知的類型,發(fā)生改變的feature(即 feature id),改動前后的值,如果需要屏蔽掉非狀態(tài)改變的通知,則可以使用isTouch()方法來實現(xiàn)。
★通過adapter除了可以給一個model object添加一個監(jiān)聽器之外,還可以用來給model object增加一些功能。其做法是先定義一個需要實現(xiàn)功能的接口,然后實現(xiàn)該接口并擴展AdapterImpl實現(xiàn)一個Adapter,并創(chuàng)建一個adapter factory來負責創(chuàng)建該adapter,最后通過adapter factory的adapt()方法將model object與前面定義的接口關(guān)聯(lián)起來,這樣model object就被擴展成具有該接口的一些功能了。

安徽新華電腦學校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
主站蜘蛛池模板: 免费会员管理系统,会员管理软件,会员卡积分系统—智络软件 | 污水处理控制系统设计_plc编程控制柜_电气成套设备生产厂家_合肥鸿昇自动化 | 一次性妇科用品_一次性医疗用品_一次性口腔器械盒_天津市双利医疗器械有限责任公司 | 检重秤,液化气充装秤,滚筒电子秤,汽车衡厂家|上海越衡实业 | 沈阳机电一体化电热锅炉_沈阳蓄热式电锅炉_沈阳壁挂式电锅炉【沈阳远鹏电热供水设备工程安装有限公司】 | 酒店宾馆一次性用品厂家-酒店洗漱用品,洗浴用品品牌方案-江苏欧佩 | 面粉加工设备-面粉加工机械-面粉机组-面粉磨粉机-面粉机成套设备-河南粮院机械制造有限公司 | 液压万能试验机价格_电子万能试验机|摩擦磨损试验机厂家-济南辰达试验机制造有限公司 | 江苏广分检测技术有限公司、电力安全工具检测、苏州绝缘工具检测、昆山电力安全工具检测-广分检测技术(苏州)有限公司 | 水环式真空泵-旋片式真空泵-上海飞鲁泵业科技有限公司 | 轴流风机_混流风机_排烟防火阀-德州辰特空调设备有限公司 | 惠州清洁公司|惠州保洁公司|惠州清洁|惠州保洁|惠州清洁服务|惠州保洁服务|壹壹集团 | 免费的PPT幻灯片演示制作软件,动画视频及课件制作软件 - Focusky万彩演示大师官网 | 天津市金色巨腾科技发展有限公司-天津监控安装,天津弱电工程,天津无线网络覆盖 | 金蝶软件_金蝶湖南公司_长沙金蝶软件_精斗云软件_财务软件_进销存软件_云ERP软件_金蝶软件销售电话 | 液压万能试验机价格_电子万能试验机|摩擦磨损试验机厂家-济南辰达试验机制造有限公司 | 直流电机维修_杭州高压电机修理-杭州先恒机电有限公司 | 影像测量仪|检测设备定制|平面度测量仪|三坐标测量机|广州市海科思自动化设备有限公司-400-0528-668 | 河南新百福国际物流有限公司 | 美国渗透压仪-PSI渗透压仪|华泰和合 | 无锡泡沫包装生产厂家-江阴源欧包装材料有限公司 | 河南康振机械有限公司 | 洒水车_水车_洒水车价格_喷水车_绿化喷洒车_绿化洒水车- 程力专用汽车股份有限公司 | 起名字典|宝宝新生儿男孩女孩起名免费网-诗经周易生辰八字取名字大全 | 山东华德耐特工业设备有限公司-仓储货架-钢托盘-物流车-周转箱-工位器具 | 模具|数控加工-车床加工-精密数控铣床-东莞市方菱精密模具有限公司专注零件及模具加工 | 席高设计型地板官网_拼花地板_高端木地板定制专家_轻奢地板 | 无尘投料站-真空上料机-旋振筛|超声波振动筛|摇摆筛|筛分机-新乡市欧霖佳机械有限公司 | 吉安市圣宫制冷设备有限公司 | 丝杆升降机-蜗轮丝杆升降机-电动推杆-德州市金宇机械有限公司 | 申江储气罐厂家,储气罐批发价格,储气罐规格-上海申江压力容器有限公司(厂) | 客服外包_电话调查_电话调研_售前售后在线外包客服公司-北京美宸互联 | 暖气片厂家_散热器厂家_力春散热器| 消防改造安装,消防维修检测,消防工程安装,气体灭火施工安装,火灾烟感探测器清洗 | 专业色素炭黑生产厂家,提供各种用途色素炭黑价格-枣庄鑫源化工 | 水分测定仪_微量水分测定仪_高低温试验箱_昆山鹭工精密仪器有限公司 | 陕西锐锋建筑安装有限公司,锐锋建筑,总承包,专业分包,市政综合,劳务,水电钢构,铁路公路,房建,房屋建筑施工 | 四氟瓶塞-塑料离心机-双联恒温水浴锅-常州天瑞仪器有限公司 | 网络广播_公共广播系统_校园,学校数字ip,itc智能广播系统方案 | 芜湖市皖创管业有限公司| 啤酒厂家_啤酒代工厂_原浆啤酒厂家 - 山东十谷啤酒有限公司 |