EMF-Ecore模型创建

core|创建

1          包定义

1.1         UML方式:

a)       定义:

                                    i.             图:

                                          

                                 ii.             生成代码:

     publicinterface StPackage extends EPackage {

          String eNAME = "st";

          String eNS_URI = "http://st";

          String eNS_PREFIX = "st";

}

 

1.2         Java方式:

a)       定义:

                                    i.             代码:

public interface stPackage {

public String eName = "st";

public String eNS_URI = "http://st";

public String eNS_PREFIX = "st";

}

说明:interface声明中不能带“@model”标记,接口名称要以“Package”结尾。接

口可以声明以下三个字段eName,eNS_URI,eNS_PREFIX。

 

 

1.3         XML方式

a)       定义:

                                    i.             代码:

<xsd:schema xmlns:xsd=http://www.w3.org/2001/XMLSchema

targetNamespace=http://st

xmlns:st="http://st">

</xsd:schema>

说明:nsURI的值由targeNamespace指定。nsPrefix的值由targetNamespace导出。

name是targetNamespace的最后一段。

 

2          类定义

2.1         UML方式

a)       定义:

                                    i.             图:

                                 ii.             生成代码:

public class TeacherImpl extendsEObjectImpl implements Teacher {

     …

}

 

b)       接口:

                                    i.             说明:如果把类的stereotype设置为<<interface>>,则EMF将使生成的EClass的interface字段设为true,但在EMF 2.1.0的测试版中,EMF并不能识别出这个<<interface>>类型。

 

c)       抽象类:

                                    i.             图:

                                 ii.             生成代码:

public abstract class TeacherImplextends EObjectImpl implements Teacher {

}

 

d)       单继承:

                                    i.             图:

                                 ii.             生成代码:

public class JavaTeacherImpl extendsTeacherImpl implements JavaTeacher {

}

 

 

e)       多继承

                                    i.             图:

                                 ii.             生成代码:

public interface JavaTeacher extendsTeacher, Nothing, Java {

}

 

public class JavaTeacherImpl extendsTeacherImpl implements JavaTeacher {

     …

}

 

2.2         Java方式:

a)       定义:

                                    i.             代码:

/**

*   @model

*/

public interfaceStudent{}

说明:需要使用“@model”标记。

 

b)       接口:

                                    i.             代码:

/**

 * @model interface="true"

 * */

public interface Teacher{}

说明:通过声明interface属性,在生成代码当中将不会有TeacherImpl类生成。

 

c)       抽象类:

                                    i.             代码:

/**

 * @model abstract="true"

 * */

public interface Teacher{}

说明:通过声明abstract属性,在生成代码中TeacherImpl将成为一抽象类。

 

d)       单继承:

                                    i.             代码:

/**

 * @model

 * */

public interface JavaTeacher extendsTeacher{}

 

e)       多继承:

                                    i.             代码:

/**

 * @model

 * */

public interface JavaTeacher extends Teacher,Java{}

说明:在多继承时,接口的实现类将会扩展排在extends中第一个位置的接口的实现类。上例中,生成代码中的JavaTeacherImpl将会extends TeacherImpl。

 

2.3         XML方式:

a)       定义:

                                    i.             代码:

<xsd:complexType name="Teacher"/>

说明:类名由complexType中的name属性指定。

 

b)       接口:

                                    i.             说明:XML没有提供用于定义接口的机制。

 

c)       抽象类:

                                    i.             代码:

<xsd:complexTypename="Teacher" abstract="true"/> 

 

d)       单继承:

                                    i.             代码:

<xsd:complexTypename="Teacher"/>   

<xsd:complexTypename="JavaTacher">

     <xsd:complexContent>

         <xsd:extension base="st:Teacher"/>

     </xsd:complexContent>

</xsd:complexType>

     说明:通过ComplexType的扩展机制来实现单继承。

 

e)       多继承:

                                    i.             说明:还没找到合适的多继承机制。

 

3          属性定义

3.1         UML方式:

a)       单值属性:

                                    i.             图:

                                 ii.             生成代码:

public class TeacherImpl extendsEObjectImpl implements Teacher {

     protectedstatic final String NAME_EDEFAULT = null;

     protectedString name = NAME_EDEFAULT;

     publicString getName() {…}

     publicvoid setName(String newName) {…}

     …

}

 

b)       多值属性:

                                    i.             图:

                                 ii.             生成代码:

public class TeacherImpl extendsEObjectImpl implements Teacher {

     protectedEList students = null;

     publicEList getStudents() {…}

     …

}

 

c)       修改属性的Ecore属性值:

                                    i.             图:

                                 ii.             生成代码:

public class TeacherImpl extendsEObjectImpl implements Teacher {

     protectedstatic final String UNCHANGEABLE_EDEFAULT = null; 

     protectedString unchangeable = UNCHANGEABLE_EDEFAULT; 

 

     protectedstatic final String VOLATILE_EDEFAULT = null;

 

     protectedstatic final String UNSETTABLE_EDEFAULT = null;

     protectedString unsettable = UNSETTABLE_EDEFAULT;

     protectedboolean unsettableESet = false;

    

     publicString getUnchangeable() {…}

 

     publicString getVolatile() {       

         thrownew UnsupportedOperationException();

     }

    

     publicvoid setVolatile(String newVolatile) {     

         thrownew UnsupportedOperationException();

     }

 

     publicString getUnsettable() {…}

     publicvoid setUnsettable(String newUnsettable) {… }   

     publicvoid unsetUnsettable() {…}

     publicboolean isSetUnsettable() {…}

}

说明:对于unchangeable属性,我把他的changeable属性修改为false,于是在生成的代码当中,他将不包含有set方法。对于volatile属性,我把他的isVolatile属性设为true,于是在生成的代码当中对英语volatile的get()/set()方法都实现为空方法体,且抛出一个异常。对于unsettable属性,我把他的isUnsettable属性设为ture,于是在生成的代码当中除了有unsettable属性以外,还有一个用于标记该属性是否已设置的boolean量unsettableESet。

 

d)       枚举类型:

                                    i.             图:

                                 ii.             生成代码:

public final class Score extendsAbstractEnumerator {  

     publicstatic final int GOOD = 0;

     publicstatic final int BAD = 1;

}

 

3.2         Java方式:

a)       单值属性:

                                    i.             代码:

/**

 *  @model

 */

public interface Teacher{

/**

* @model

* */

public String getName();

}

说明:定义属性时,必须带有“@model”标记,且方法名必须符合getXyz(),或者

isXyz()的形式。

 

b)       多值属性:

                                    i.             代码:

/**

 *  @model

 */

public interface Teacher{

/**

      * @model type="String"

      * */   

     publicList getStudents();

}

 

c)       修改属性的Ecore值:

                                    i.             代码:

public interface Teacher extendsEObject{

     /**

      * @modelchangeable="false"

      */

     publicString getUnchangeable();

 

     /**

      * @modelvolatile="true"

      */

     publicString getVolatile();

 

     /**

      * @modelunsettable="true"

      */

     publicString getUnsettable();

}

 

d)       枚举类型:

                                    i.             代码:

/**

 * @model

 */

public finalclass Score {

     /**

      * @model

      */

     publicstatic final int GOOD = 0;

 

     /**

      * @model

      */

     publicstatic final int BAD = 1;

}

说明:枚举类型需要定义为final class类型,枚举值由类内部的static final int指定。

 

3.3         XML方式:

a)       单值属性:

                                    i.             代码:

<xsd:complexTypename="Teacher">

<xsd:sequence>

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

</xsd:sequence>

</xsd:complexType>

 

b)       多值属性:

                                    i.             代码:

<xsd:complexTypename="Teacher">

<xsd:sequence>

<xsd:elementname="name" type="xsd:string" minOccurs="0"

maxOccurs="unbounded"/>                       

         </xsd:sequence>

     </xsd:complexType>

 

c)       修改属性的Ecore值:

                                    i.             说明:Schema没有提供修改Ecore值的方法。

 

d)       枚举类型:

                                    i.             代码:

<xsd:simpleType name="Score">

<xsd:restriction base="xsd:NCName">

<xsd:enumeration value="GOOD"/>

<xsd:enumeration value="BAD"/>

</xsd:restriction>

</xsd:simpleType>

 

4          引用定义

4.1         UML方式:

a)       单向引用:

                                    i.             图:

                                 ii.             生成代码:

public class TeacherImpl extendsEObjectImpl implements Teacher {

     protectedStudent student = null;

     publicStudent getStudent() {…}

     publicvoid setStudent(Student newStudent) {…}

     …

}

 

b)       双向引用:

                                    i.             图:

                                 ii.             生成代码:

public class TeacherImpl extendsEObjectImpl implements Teacher {

     protectedStudent student = null;

     publicStudent getStudent() {…}

     publicvoid setStudent(Student newStudent) {…}

     …

}

 

public class StudentImpl extendsEObjectImpl implements Student {

     protectedTeacher teacher = null;

     publicTeacher getTeacher() {…}

     publicvoid setTeacher(Teacher newTeacher) {…}

     …

}

 

c)       多值引用:

                                    i.             图:

                                 ii.             生成代码:

public class TeacherImpl extends EObjectImplimplements Teacher {

     protectedEList student = null;

     publicEList getStudent() {…}

     …

}

 

d)       包含引用:

                                    i.             图:

                                 ii.             生成代码:

public class TeacherImpl extendsEObjectImpl implements Teacher {

     protectedEList student = null;

     publicEList getStudent() {…}

}

说明:当使用包含引用时,由于被引用的对象和引用的对象会被保存在同一个资源内部,因此可以不使用Proxy的方式,因此Teacher内部会使用EObjectContainmentEList来保存对Student的引用。如果是普通引用,则考虑会使用EObjectResolvingEList。

 

e)       修改引用的Ecore值:

                                    i.             图:

                                 ii.             生成代码:

public class TeacherImpl extendsEObjectImpl implements Teacher {

     protectedNonProxy nonProxy = null;

 

     protectedNonChange nonChange = null;

 

     protectedUnset unset = null;

     protectedboolean unsetESet = false;

 

     publicNonProxy getNonProxy() {

         returnnonProxy;

     }

     publicvoid setNonProxy(NonProxy newNonProxy) {…}

 

     publicVolatile getVolatile() {…}

 

     publicvoid setVolatile(Volatile newVolatile) {

         thrownew UnsupportedOperationException();

     }

 

     publicNonChange getNonChange() {…}

 

     publicUnset getUnset() {…}

     publicvoid setUnset(Unset newUnset) {…}

     publicvoid unsetUnset() {…}

     publicboolean isSetUnset() {…}

}

说明:当引用的resolveProxy值设定为false时,生成的get方法将进行代理的解释步骤,而只简单的返回引用值。当引用的unchangeable值设定为true时,生成代码中将不包含set方法。当引用的volatile值设定为true时,生成的代码中将只包含空方法体。当引用的unsettable设定为true时,除了生成引用值以外,还生成用于判断引用是否已经设置的boolean量。

 

f)       Map引用:

                                    i.             图:

说明:StudentTable的stereotype必须为MapEntry,她必须包含一个key的属性,且必须有一个名称为value的引用。

 

                                 ii.             生成代码:

public class TableImpl extendsEObjectImpl implements BasicEMap.Entry {

     protectedstatic final int KEY_EDEFAULT = 0;

     protectedint key = KEY_EDEFAULT;

     protectedStudent value = null; 

     publicObject getKey() {…}

     publicvoid setKey(Object key) {…} 

     publicObject getValue() {…}

     publicObject setValue(Object value) {…}

}

 

public class TeacherImpl extendsEObjectImpl implements Teacher {

     protectedEMap table = null;

     publicEMap getTable() {…}

     …

}

 

说明: Ecore中的EMap并不是从java.util.Map中继承而来,她继承的是EList,所以,她只有一列而不是两列值。对于EMap中的每个值,都是继承自java.util.Map$Entry的一个EClass,且该EClass包含了key和value属性。由于EMap的这个结构,因此我们不能用单值引用Table,而必须用多值,这等价于:

     /**

      *   @model type="Table"

*/

     EList getTable();

 

?SHAPE?\* MERGEFORMAT
key:value

key:value

key:value

key:value

key

value

key

key

key

value

value

value

java.util.Map

EMap

 

4.2         Java方式:

a)       单向引用:

                                    i.             代码:

/**

 * @model

 */

public interface Teacher {

     /**

      * @model

      */

     publicStudent getStudent();

}

 

/**

 * @model

 */

public interface Student {}

 

b)       双向引用:

                                    i.             代码:

/**

 * @model

 */

public interface Teacher {

     /**

      * @model

      */

     publicStudent getStudent();

}

 

/**

 * @model

 */

public interface Student {

     /**

      * @model

      * */

     publicTeacher getTeacher();

}

 

c)       多值引用:

                                    i.             代码:

/**

 * @model

 */

public interface Teacher {

     /**

      * @modeltype="Student"

      */

     publicList getStudent();

}

 

d)       包含引用:

                                    i.             代码:

/**

 * @model

 */

public interface Teacher extendsEObject {

     /**

      * @model type="Student" containment="true"

      */

     publicEList getStudent();

}

 

e)       修改引用的Ecore值:

                                    i.             代码:

/**

 * @model

 */

public interface Teacher extendsEObject{

     /**

      * @model resolveProxies="false"

      */

     publicNonProxy getNonProxy();

 

     /**

      * @model volatile="true"

      */

     publicVolatile getVolitile();

 

     /**

      * @model changeable="false"

      */

     publicNonChange getNonChange();

 

     /**

      * @model unsettable="true"

      */

     publicUnset getUnset();

}

 

f)       Map引用:

                                    i.             代码:

/**

 * @model

 */

public interface Teacher extendsEObject {    

     /**

      * @model keyType="int"valueType="Student"

      * */

     publicEMap getTable();

}

 

4.3         XML方式:

a)       单向引用:

                                    i.             代码:

<xsd:complexTypename="Teacher">

<xsd:sequence>

<xsd:elementname="student" type="st:Student"/>

</xsd:sequence>

</xsd:complexType>

 

<xsd:complexTypename="Student">

</xsd:complexType>

 

b)       双向引用:

                                    i.             代码:

<xsd:complexTypename="Teacher">

<xsd:sequence>

<xsd:elementname="student" type="st:Student"/>

</xsd:sequence>

</xsd:complexType>

 

<xsd:complexTypename="Student">

<xsd:sequence>

<xsd:elementname="teacher" type="st:Teacher"/>

</xsd:sequence>

</xsd:complexType>

 

c)       多值引用:

                                    i.             代码:

<xsd:complexTypename="Teacher">

<xsd:sequence>

<xsd:elementname="student" type="st:Student"

minOccurs="0"maxOccurs="unbounded"/>

</xsd:sequence>

</xsd:complexType>

    

d)       包含引用:

                                    i.             说明:通过complexType定义的,除了元素的类型为anyURI,QName,IDREF,IDREFS以外,containment的值都为true。

 

e)       修改引用的Ecore值:

                                    i.             说明:Schema没有提供修改引用的Ecore值的机制。

 

f)       Map引用:

                                    i.             说明:Schema没有提供用于定义Map引用的机制。

 

5          数据类型定义

5.1         UML方式:

a)       定义:

                                    i.             图:

                                 ii.             生成代码:

public class TeacherImpl extendsEObjectImpl implements Teacher {

     protectedstatic final Date BORN_EDEFAULT = null;

     protectedDate born = BORN_EDEFAULT;

     publicDate getBorn() {…}

     publicvoid setBorn(Date newBorn) {… }

     …

}

5.2         Java方式:

a)       定义:

                                    i.             代码:

public interface StPackage {

     /**

      * @model instanceClass="java.util.Date"

      * */

     EDataType getNewDate();

}

 

/**

 * @model

 */

public interface Teacher extendsEObject {

     /**

      * @model

      */

     publicNewDate getBorn();

}

说明:使用Java方式声明新的类型时,需要在Package的声明中增加类型定义。

 

5.3         XML方式:

a)       定义:

                                    i.             代码:

<xsd:simpleTypename="NewDate">

<xsd:restriction base="xsd:date"/>

</xsd:simpleType>

<xsd:complexTypename="Teacher">

<xsd:sequence>

<xsd:elementname="born" type="st:NewDate"/>

</xsd:sequence>

</xsd:complexType>

 

6          方法定义

6.1         UML方式:

a)       定义:

                                    i.             图:

                                 ii.             生成代码:

public class TeacherImpl extendsEObjectImpl implements Teacher {

     publicvoid doSomething(String par) {

          throw new UnsupportedOperationException();

     }

}

 

6.2         Java方式:

a)       定义:

                                    i.             代码:

/**

 * @model

 */

public interface Teacher {

     /**

      * @model

      */

     publicvoid doSomething(String par);

}

 

6.3         XML方式:

a)       定义:

                                    i.             说明:Schema不能定义操作。

时间: 2024-10-26 05:27:48

EMF-Ecore模型创建的相关文章

【区块链之技术进阶】从技术现实理解区块链:基于SQL模型创建BQL

在前面的两篇文章里,咱们看到了知乎上的两位妹纸关于区块链的理解,一位从金融角度切入同时兼顾了技术概况,另一位呢则偏重于技术层面(一言不合就放代码).通过两位妹子(萌萌哒)的叙述,想必大家对于区块链有了更深的理解,并且巧合的是两位妹子都不约而同提到了创世区块链,这在咱们之前的文章中很少提到的.(是不是妹纸写文章更细心,这我就不知道了...)读完上一篇文章中的妹子画的图大家是不是对于"区块分叉"还有"共识攻击"的技术原理更加理解了呢?毕竟图中有妹子的自拍... 本文是[

一种基于EMF模型的在GEF中判断创建连接线有效性的方法

简介: 结合目前比较受欢迎的 EMF(Eclipse Modeling Framework)和 GEF(Graphical Editing Framework)技术,提出了一种在图形化开发中创建连接线时普遍适用的验证方法. 最后给出了一个创建 连接线时动态 Schema 验证的例子,并根据 Schema 的定义列出创建连接线的真值表.针对该真值表的每 项进行验证,保证不符合 Schema 定义规则的模型对应的图形之间不能创建连接线,降低了 Schema 验证 和修改的复杂性. 一种基于 EMF

使用Topcased改进EMF模型编辑视图

EMF 是 Eclipse 建模框架,它是 Eclipse MDA(Model Driven Architecture)的重要组成部分,其 元模型 ECore 是 MOF 的 Java 实现,根据 Java 语言特性对 MOF 适当简化并增加 Java 特性.EMF 主 要提供了元模型的创建,利用模型生成 java 代码,并且提供了一个基本的模型文件编辑环境.通过 EMF 可以自动生成模型的编辑视图.但 EMF 的默认编辑视图功能简单,用户界面不够灵活,难以满足大型业 务系统要求.Topcase

EMF介绍系列(二、从模型生成应用程序)

还是从一个例子里看看EMF的使用方法和作用吧.假设我们的应用是一个网上商店,在系 统里有这些对象:商店Shop.类别Category.商品Product,其中类别可以包含子类别.现在 我们用EMF从头到尾生成一个可以管理类别和商品的应用程序.如果你的Eclipse里还没有安 装 EMF,在eclipse.org/emf下载适合你Eclipse版本的EMF SDK,建议你下载全部包含的那种 .安装后,在新建对话框里会增加EMF的类别,如图1所示: 图1 新建向导里的EMF类别 其中"EMF Mod

使用EMF Query查询EMF模型

EMF 是 Eclipse 组织推出的建模框架.它能够帮助我们将模型(UML, XSD等)转换成为健壮且功能丰富的Java 代码.通过使用 EMF,我们编写的程序能免费的获得一个健壮的模型层,它通常比我们自己手工编写的模型层更为健壮.事实上,有很多商业产品都使用了 EMF 来作为其模型层.由于 EMF 的广泛使用,Eclipse 组织为其推出了众多的周边模块. 1 介绍 由于EMF(全称Eclipse Modeling Framework)在Java阵营中的广泛使用,用户迫切的需要更多基于EMF

IBM为日新月异的能源世界创建新的业务模型

一个世纪以前,电力行业实施了第一个重大的业务模型创新之举,即使近距离供电的小型本地发电厂转变为通过高压电缆进行远距离供电的集中式发电厂.自此,"发展和建造"的理念便占据了主导地位且经久不衰,这使得电能在二十世纪中叶就已在全球多数地区得到普及.二十世纪后期,这一理念达到了顶峰,但此后业务模型却鲜有发展(请参阅侧边栏中的"'发展和建造'模型的兴衰"). 但现如今,为了适应以下关键领域的转变,要求电力行业重新评估其业务模型的呼声此起彼伏: • 政府政策转变:政府正密切关注

EMF-edit功能解析

1.      EMF.edit a)       说明:EMF.edit位于EMF.editor和EMF.Ecore之间,他起了一个中介者的作用.他负责把来自EMF.editor的UI相关的请求转换成符合EMF.Ecore的UI无关的调用.他需要提供以下四个功能:实现用于支持Viewer显示的ContentProvider和LabelProvider:实现用于支持属性显示的IPropertySource:实现用于支持对模型进行操作的CommandFramework:实现用于支持修改通知的Fra

Rational:应用RSA实现EMF的开发

开发EMF模型仅限于XML Schema.IBM Rational Rose.Java source或者EMF Ecore.IBM Rational Software Architect(RSA)使许多应用程序开发任务能够在与其他商业应用程序开发工具的协调中充分享受到UML模型的好处.RSA和EMF的结合将给商业性的或者开放源代码的开发者提供一个强有力的工具. 导言 本文探讨运用IBM Rational Software Architect(RSA)来开发一种可以被转换为Eclipse Mode

EMF介绍系列(三、定制应用程序的基本方法)

借助EMF的帮助,不用亲自编写一行代码就可以生成一个完整的应用程序,你是不是对EMF 有些感兴趣了?不过生成的应用程序看起来都像是从同一个模子里出来的,即一个多页编辑 器,一个大纲视图和属性页,这当然无法满足所有人的需求.不用耽心,只要了解EMF的机制 ,按照我们的要求修改这个应用程序并不是一件很困难的事情. 首先大概的看一下EMF为我们生成了哪些东西吧.按照前文的操作,EMF应该一共生成了四 个插件项目:com.my.shop. com.my.shop.edit.com.my.shop.edi