文档章节

EMF模型中的资源管理

西昆仑
 西昆仑
发布于 2012/09/11 23:44
字数 707
阅读 130
收藏 0
在GMF项目中,初期阶段的工作是建立业务模型,该模型通过EMF编辑器建立并生成代码。这些代码主要包含如下内容:

1. 业务模型接口、实现类

EllipseShape、EllipseShapeImpl、ShapeFactoryImpl

该工程中生成各对应的业务模型,并通过工厂进行创建。

2. 适配器类:(在工程org.eclipse.myTestShapes.edit)

public class EllipseShapeItemProvider
extends AbstractShapeItemProvider
implements
IEditingDomainItemProvider,
IStructuredItemContentProvider,
ITreeItemContentProvider,
IItemLabelProvider,
IItemPropertySource

从字面上看,是提供者,提供哪些内容? 提供内容,提供图标、提供属性、提供domainProvider~
界面元素直接通过适配器获取需要的内容,避免与模型对象的直接接触。将内容提供的工作交给适配器

工程结构如下:

 

此处主要讨论业务模型的资源管理,暂不讨论界面的相关元素,所以其他工程不介绍。
资源管理:包括业务模型的序列化文件、内存管理,这些操作通过谁来实现? EditDomain

public interface EditingDomain
{
  //负责文件资源的加载,URI代表序列化后的文件资源
  Resource createResource(String fileNameURI);
  Resource loadResource(String fileNameURI);
  ResourceSet getResourceSet();

  //command用于对内存对象的修改
  Command createCommand(Class<? extends Command> commandClass, 
                        CommandParameter commandParameter);
  Command createOverrideCommand(OverrideableCommand command);
  CommandStack getCommandStack();

  .............
}

1. 序列化后的模型内容存放于文件中,通过loadResource将文件中的资源加载到内存中,并形成对应的对象,存放于resourceSet中。

2. 存放于内存中的内存对象的修改,通过command修改,用户的编辑信息被封装成command并置于commandStack中执行,对模型对象进行修改。

 

命令栈(CommandStack)

public class BasicCommandStack implements CommandStack 
{
  protected List<Command> commandList;   //command队列,
  protected int top;                     //堆栈指针
  protected Command mostRecentCommand;   //最近执行的命令
  protected Collection<CommandStackListener> listeners;    //命令栈的监听者
  
  public BasicCommandStack() 
  {
    commandList = new ArrayList<Command>();
    top = -1;
    listeners = new ArrayList<CommandStackListener>();
  }

  //命令的操作:执行、是否可以回退、回退,再执行、命令栈清空
  public void execute(Command command);
  public boolean canUndo();
  public void undo() 
  public boolean canRedo();
  public void redo();
  public void flush();

  //监听者相关操作:添加、删除、通知
  public void addCommandStackListener(CommandStackListener listener);
  public void removeCommandStackListener(CommandStackListener listener);
  protected void notifyListeners();
}

针对上述接口,主要得出如下主要结论:
1. 命令栈是命令的容器,有一个指针指向堆顶
2. 命令堆栈有监听者,支持添加删除Listener,有命令的相关操作,会通知监听者
4. 最新的命令执行完毕后,会进行记录,并进入命令堆栈
5. 支持撤销操作(这就是为什么将命令进入堆栈的原因,撤销就是对堆顶的命令执行undo)
6.清空操作:将堆栈中得所以命令清除、释放,并通知listener
还有其他功能,可见具体代码,对模型的修改,最终都通过命令实现~

© 著作权归作者所有

共有 人打赏支持
西昆仑

西昆仑

粉丝 137
博文 141
码字总数 102735
作品 0
南京
高级程序员
私信 提问
EMF介绍系列(二、从模型生成应用程序)

还是从一个例子里看看EMF的使用方法和作用吧。假设我们的应用是一个网上商店,在系统里有这些对象:商店Shop、类别Category、 商品Product,其中类别可以包含子类别。现在我们用EMF从头到尾生...

青夜之衫
2017/12/06
0
0
Eclipse基金会十周年:知名开源项目盘点

  【IT168 专稿】Eclipse基金会已经成立了整整10年了。目前,这个开源组织拥有众多项目,其中就包含了最为出名的Java IDE Eclipse以及Mylyn。在Eclipse基金会成立之初,由其发起并指导的项...

it168网站
2014/02/24
0
0
Graphical Modeling Framework简介

本文假设读者有Eclipse平台应用程序开发经验,了解Eclipse平台的插件机制,使用EMF和GEF开发过应用程序。在本文中,“Eclipse应用程序”等价于“Eclipse插件”。 Eclipse是一个开源的平台,从...

青夜之衫
2017/12/07
0
0
EMF Validation Builder

EMF Validation Builder 是一个Eclipse的插件,实现自动的 EMF 验证过程,当你保持模型时,该模型就会自动进行验证。EMF Validation Builder 会维护一个依赖关系表,因此整个验证过程可以在需...

匿名
2011/02/18
718
0
写代码的代码:JET

用过EMF的人想必都对它的代码生成功能印象深刻吧,有没有想过这是怎样实现的呢? 代码生成一般是通过写好的模板,在用户输入一些限制条件后,由程序把这两者结合起来得到需要的代码。EMF也是...

青夜之衫
2017/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

从 for of 聊到 Generator

你能学到什么 对 for of 更深入的理解 iterator 到底是何方神圣? 数组也是对象,为什么不能用 for of 来遍历对象呢? 如何实现对象的 for of? Generator 又是何方神圣? Generator 有什么用呢...

Jack088
12分钟前
0
0
怎么判断go-sql-driver 安装成功

.下载安装   执行下面两个命令:     下载:go get github.com/Go-SQL-Driver/MySQL     安装:go install github.com/Go-SQL-Driver/MySQL   怎么判断go-sql-driver 安装成功 ...

dragon_tech
20分钟前
0
0
刚入职阿里,告诉你真实的职场生活,兼谈P6、P7、P8的等级

一:拿下offer的人,基本上都有什么特征? 二:为什么选择阿里? 三:阿里的工作氛围什么样? 四:阿里的薪资情况? 五:阿里的晋升空间有多大? 最近部门招聘,很多工程师,包括我在内都参与...

java知识分子
33分钟前
2
0

中国龙-扬科
36分钟前
1
0
windows 安装nvm

1、nvw-windows的官网:https://github.com/coreybutler/nvm-windows/releases 2、选择nvm-setup.zip安装 3、配置环境变量 4、检查nvm是否安装成功 使用管理员权限打开一个命令行。输入nvm v...

灰白发
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部