EMF 自学笔记 2

继续看下一篇Tutorial Generating an Extended EMF Model.

 

归纳下使用 Annotated Java 的规则(java 1.5):

  • 为每个类模型创建一个 Interface, 枚举的话就使用 enum. 这些 Interface 和 enum 都要标注@model.
  • 类属性通过为 Interface 增加 get 方法定义,要标注@model. 如果有默认值,就在@model 后面加上 default="value"
  • 组合关系过为 Interface 增加 get 方法定义,要标注@model containment=true. 函数返回值要使用泛型来告知EMF该组合关系的目标是谁。
  • 双向关联通过为两个 Interface 增加对应的 get 方法定义,要标注@model opposite="关联对象的相关方法名称"。
  • 继承关系通过 Interface 继承对应 Interface 来定义。
  • 枚举使用 enum 来定义,形式为 "TYPE_A, TYPE_B, TYPE_C;". 每个枚举值都要定义@model name="str".

Tutorial 后半段说明了如何修改 Generator Model 以及如何修改生成的方法(记得把@generated删掉)。

 

现在回到八进制的blog,还是中文的看着爽。

blog中的例子用Annotated Java实现代码如下:

 

package com.my.shop;
/**
 * @model
 */
public interface NamedElement {
 /**
  * @model
  */
 String getName();
}

----------------------------------

package com.my.shop;
/**
 * @model
 */
public interface Shop extends NamedElement {
 /**
  * @model containment="true" opposite="shop"
  */
 java.util.List<Category> getCategories();
}

----------------------------------

package com.my.shop;
/**
 * @model
 */
public interface Category extends NamedElement {
 /**
  * @model containment="true" opposite="parent"
  */
 java.util.List<Category> getChildren();
 /**
  * @model opposite="children"
  */
 Category getParent();
 /**
  * @model opposite="categories"
  */
 Shop getShop();
 /**
  * @model containment="true" opposite="category"
  */
 java.util.List<Product> getProducts();
}

----------------------------------

package com.my.shop;
/**
 * @model
 */
public interface Product extends NamedElement {
 /**
  * @model
  */
 boolean isAvailable();
 /**
  * @model
  */
 String getDescription();
 /**
  * @model
  */
 double getPrice();
 /**
  * @model opposite="products"
  */
 Category getCategory();
}

 

该例中组合关系也定义了opposite,因为UML图中定义了被组合类向组合类的关联。而自包含关系(Category类)的实现与组合的实现类似。

 

各生成项目简介:

模型项目:主要包含你定义的ecore模型里各类型(EClass,在ecore元模型里类型称为EClass,属性称为 EAttribute)对应的java接口和缺省的实现类代码,例如Product.java和ProductImpl.java,它们分别被放置在 com.my.shop和com.my.shop.impl包里;一个工厂类(ShopFactory)使用工厂模式创建新的模型实例;一个 Package类(ShopPackage)维护关于元模型的信息,提供了一堆静态成员变量;此外还生成了ShopAdapterFactory和 ShopSwitch这两个类,它们是可选的。

Edit项目:包含了一系列ItemProvider类,用来为在jface的各种查看器(Viewer)里显示这些模型对象提供便利,以CategoryItemProvider为例,它实现了IStructuredItemContentProvider、 ITreeItemContentProvider和IItemLabelProvider这些接口,注意把这些接口名字中的"Item"去掉就是 jface里需要的Provider,可以把这些带有"Item"字样的Provider想象成对jface相应Provider的包装。有了这些 Provider,在应用程序里使用jface的TreeViewer、TableViewer等查看器就很方便了。

Editor项目:依赖.edit部分,主要包含了几个UI方面的类。EMF为我们生成的这个编辑器有两个用途:一是让我们可以不用从零开始,而是在这个编辑器的基础上进行修改得到自己的编辑器;二是通过这些代码展示怎样在应用程序里使用前两个项目里的那些类,编辑器包含那么多Tab正是为了演示各种查看器的用法。

测试项目:无描述。

 

如何定制应用程序?

方法一:修改ecore模型和genmodel模型。

文中给NamedElement类的name属性添加默认值,是直接改的ecore文件。如果使用Annotated Java,最好直接改NamedElement接口getName()方法的@model注解,加上default="(Unnamed)". 因为如果今后要增加模型(比如后面的增加Score),使用Annotated Java会需要重新生成genmodel,这个过程中ecore model也会重新生成,结果添加的默认值也消失了。

 

方法二:直接修改生成的代码。

记住一定要处理@generated注解!可以删掉,或者改成@generated NOT.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值