分享
 
 
 

EMF-Ecore模型创建

王朝java/jsp·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

1

包定义

1.1

UML方式:

a)

定义:

i.

图:

ii.

生成代码:

public

interface 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 extends

EObjectImpl implements Teacher {

}

b)

接口:

i.

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

c)

抽象类:

i.

图:

ii.

生成代码:

public abstract class TeacherImpl

extends EObjectImpl implements Teacher {

}

d)

单继承:

i.

图:

ii.

生成代码:

public class JavaTeacherImpl extends

TeacherImpl implements JavaTeacher {

}

e)

多继承

i.

图:

ii.

生成代码:

public interface JavaTeacher extends

Teacher, Nothing, Java {

}

public class JavaTeacherImpl extends

TeacherImpl implements JavaTeacher {

}

2.2

Java方式:

a)

定义:

i.

代码:

/**

* @model

*/

public interface

Student{}

说明:需要使用“@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 extends

Teacher{}

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:complexType

name="Teacher" abstract="true"/>

d)

单继承:

i.

代码:

<xsd:complexType

name="Teacher"/>

<xsd:complexType

name="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 extends

EObjectImpl implements Teacher {

protected

static final String NAME_EDEFAULT = null;

protected

String name = NAME_EDEFAULT;

public

String getName() {…}

public

void setName(String newName) {…}

}

b)

多值属性:

i.

图:

ii.

生成代码:

public class TeacherImpl extends

EObjectImpl implements Teacher {

protected

EList students = null;

public

EList getStudents() {…}

}

c)

修改属性的Ecore属性值:

i.

图:

ii.

生成代码:

public class TeacherImpl extends

EObjectImpl implements Teacher {

protected

static final String UNCHANGEABLE_EDEFAULT = null;

protected

String unchangeable = UNCHANGEABLE_EDEFAULT;

protected

static final String VOLATILE_EDEFAULT = null;

protected

static final String UNSETTABLE_EDEFAULT = null;

protected

String unsettable = UNSETTABLE_EDEFAULT;

protected

boolean unsettableESet = false;

public

String getUnchangeable() {…}

public

String getVolatile() {

throw

new UnsupportedOperationException();

}

public

void setVolatile(String newVolatile) {

throw

new UnsupportedOperationException();

}

public

String getUnsettable() {…}

public

void setUnsettable(String newUnsettable) {… }

public

void unsetUnsettable() {…}

public

boolean isSetUnsettable() {…}

}

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

d)

枚举类型:

i.

图:

ii.

生成代码:

public final class Score extends

AbstractEnumerator {

public

static final int GOOD = 0;

public

static 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"

* */

public

List getStudents();

}

c)

修改属性的Ecore值:

i.

代码:

public interface Teacher extends

EObject{

/**

* @model

changeable="false"

*/

public

String getUnchangeable();

/**

* @model

volatile="true"

*/

public

String getVolatile();

/**

* @model

unsettable="true"

*/

public

String getUnsettable();

}

d)

枚举类型:

i.

代码:

/**

* @model

*/

public final

class Score {

/**

* @model

*/

public

static final int GOOD = 0;

/**

* @model

*/

public

static final int BAD = 1;

}

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

3.3

XML方式:

a)

单值属性:

i.

代码:

<xsd:complexType

name="Teacher">

<xsd:sequence>

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

</xsd:sequence>

</xsd:complexType>

b)

多值属性:

i.

代码:

<xsd:complexType

name="Teacher">

<xsd:sequence>

<xsd:element

name="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 extends

EObjectImpl implements Teacher {

protected

Student student = null;

public

Student getStudent() {…}

public

void setStudent(Student newStudent) {…}

}

b)

双向引用:

i.

图:

ii.

生成代码:

public class TeacherImpl extends

EObjectImpl implements Teacher {

protected

Student student = null;

public

Student getStudent() {…}

public

void setStudent(Student newStudent) {…}

}

public class StudentImpl extends

EObjectImpl implements Student {

protected

Teacher teacher = null;

public

Teacher getTeacher() {…}

public

void setTeacher(Teacher newTeacher) {…}

}

c)

多值引用:

i.

图:

ii.

生成代码:

public class TeacherImpl extends EObjectImpl

implements Teacher {

protected

EList student = null;

public

EList getStudent() {…}

}

d)

包含引用:

i.

图:

ii.

生成代码:

public class TeacherImpl extends

EObjectImpl implements Teacher {

protected

EList student = null;

public

EList getStudent() {…}

}

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

e)

修改引用的Ecore值:

i.

图:

ii.

生成代码:

public class TeacherImpl extends

EObjectImpl implements Teacher {

protected

NonProxy nonProxy = null;

protected

NonChange nonChange = null;

protected

Unset unset = null;

protected

boolean unsetESet = false;

public

NonProxy getNonProxy() {

return

nonProxy;

}

public

void setNonProxy(NonProxy newNonProxy) {…}

public

Volatile getVolatile() {…}

public

void setVolatile(Volatile newVolatile) {

throw

new UnsupportedOperationException();

}

public

NonChange getNonChange() {…}

public

Unset getUnset() {…}

public

void setUnset(Unset newUnset) {…}

public

void unsetUnset() {…}

public

boolean isSetUnset() {…}

}

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

f)

Map引用:

i.

图:

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

ii.

生成代码:

public class TableImpl extends

EObjectImpl implements BasicEMap.Entry {

protected

static final int KEY_EDEFAULT = 0;

protected

int key = KEY_EDEFAULT;

protected

Student value = null;

public

Object getKey() {…}

public

void setKey(Object key) {…}

public

Object getValue() {…}

public

Object setValue(Object value) {…}

}

public class TeacherImpl extends

EObjectImpl implements Teacher {

protected

EMap table = null;

public

EMap 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

*/

public

Student getStudent();

}

/**

* @model

*/

public interface Student {}

b)

双向引用:

i.

代码:

/**

* @model

*/

public interface Teacher {

/**

* @model

*/

public

Student getStudent();

}

/**

* @model

*/

public interface Student {

/**

* @model

* */

public

Teacher getTeacher();

}

c)

多值引用:

i.

代码:

/**

* @model

*/

public interface Teacher {

/**

* @model

type="Student"

*/

public

List getStudent();

}

d)

包含引用:

i.

代码:

/**

* @model

*/

public interface Teacher extends

EObject {

/**

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

*/

public

EList getStudent();

}

e)

修改引用的Ecore值:

i.

代码:

/**

* @model

*/

public interface Teacher extends

EObject{

/**

* @model resolveProxies="false"

*/

public

NonProxy getNonProxy();

/**

* @model volatile="true"

*/

public

Volatile getVolitile();

/**

* @model changeable="false"

*/

public

NonChange getNonChange();

/**

* @model unsettable="true"

*/

public

Unset getUnset();

}

f)

Map引用:

i.

代码:

/**

* @model

*/

public interface Teacher extends

EObject {

/**

* @model keyType="int"

valueType="Student"

* */

public

EMap getTable();

}

4.3

XML方式:

a)

单向引用:

i.

代码:

<xsd:complexType

name="Teacher">

<xsd:sequence>

<xsd:element

name="student" type="st:Student"/>

</xsd:sequence>

</xsd:complexType>

<xsd:complexType

name="Student">

</xsd:complexType>

b)

双向引用:

i.

代码:

<xsd:complexType

name="Teacher">

<xsd:sequence>

<xsd:element

name="student" type="st:Student"/>

</xsd:sequence>

</xsd:complexType>

<xsd:complexType

name="Student">

<xsd:sequence>

<xsd:element

name="teacher" type="st:Teacher"/>

</xsd:sequence>

</xsd:complexType>

c)

多值引用:

i.

代码:

<xsd:complexType

name="Teacher">

<xsd:sequence>

<xsd:element

name="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 extends

EObjectImpl implements Teacher {

protected

static final Date BORN_EDEFAULT = null;

protected

Date born = BORN_EDEFAULT;

public

Date getBorn() {…}

public

void setBorn(Date newBorn) {… }

}

5.2

Java方式:

a)

定义:

i.

代码:

public interface StPackage {

/**

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

* */

EDataType getNewDate();

}

/**

* @model

*/

public interface Teacher extends

EObject {

/**

* @model

*/

public

NewDate getBorn();

}

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

5.3

XML方式:

a)

定义:

i.

代码:

<xsd:simpleType

name="NewDate">

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

</xsd:simpleType>

<xsd:complexType

name="Teacher">

<xsd:sequence>

<xsd:element

name="born" type="st:NewDate"/>

</xsd:sequence>

</xsd:complexType>

6

方法定义

6.1

UML方式:

a)

定义:

i.

图:

ii.

生成代码:

public class TeacherImpl extends

EObjectImpl implements Teacher {

public

void doSomething(String par) {

throw new UnsupportedOperationException();

}

}

6.2

Java方式:

a)

定义:

i.

代码:

/**

* @model

*/

public interface Teacher {

/**

* @model

*/

public

void doSomething(String par);

}

6.3

XML方式:

a)

定义:

i.

说明:Schema不能定义操作。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有