Chinaunix首页 | 论坛 | 博客
  • 博客访问: 647606
  • 博文数量: 155
  • 博客积分: 5688
  • 博客等级: 大校
  • 技术积分: 2134
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-15 15:12
文章分类

全部博文(155)

文章存档

2011年(58)

2010年(97)

分类: Java

2011-02-08 19:08:44

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见Mail:mtloveft@hotmail.com
提示本文是关于介绍EMF,即Eclipse modeling Framework
 
下面介绍EClass与EAttribute的关系,即一个类与属性的关系。
关系图如下:
 

 

前面基本都讲解过了,所以只是简单说明说明。

属性EAttribute,都有类型,即通过eAttributeType来描述,类型是EDataType

eAttributes        是一个Eclass的所有的属性的集合(EList),但不包含超类的属性

eAllAttributes   是所有的属性的集合(EList),即包含Eclass自己的属性,也包含超类的属性。

eIDAttribute     是指在eAllAttribute里的第一个EAttribute

对应的方法如下

EList getEAttributes()

EList getEAllAttributes()

EAttribute getEIDAttribute()

Class关系都能对上。

具体的代码都在getEAllAttributes()这个方法里呢。

如下:

说明:result 是用来放超类和类本身的属性的。

首先通过getESuperTypes()取得超类,然后依次调用所有超类的getEAllAttributes()

这是个迭代过程。

attributes 是用来放类本身的属性的。通过getEStructuralFeatures()取得类本身所有的EAttributeEReference。再判断,如果是EAttribute,就把它放到attributes 里。

以上代码还是比较简单的。

  1. public EList<EAttribute> getEAllAttributes() {
  2.     if (eAllAttributes == null) {
  3.       eIDAttribute = null;
  4.       BasicEList<EAttribute> result = new UniqueEList<EAttribute>() {
  5.           private static final long serialVersionUID = 1L;
  6.           @Override
  7.           protected Object [] newData(int capacity) {
  8.             return new EAttribute [capacity];
  9.           }
  10.           @Override
  11.           protected boolean useEquals() {
  12.             return false;
  13.           }
  14.           @Override
  15.           protected void didAdd(int index, EAttribute eAttribute) {
  16.             if (eAttribute.isID() && eIDAttribute == null) {
  17.               eIDAttribute = eAttribute;
  18.             }
  19.           }
  20.         };
  21.       BasicEList<EAttribute> attributes = new UniqueEList<EAttribute>() {
  22.           private static final long serialVersionUID = 1L;
  23.           @Override
  24.           protected Object [] newData(int capacity) {
  25.             return new EAttribute [capacity];
  26.           }
  27.           @Override
  28.           protected boolean useEquals() {
  29.             return false;
  30.           }
  31.         };
  32.       Set<EClass> computationInProgress = COMPUTATION_IN_PROGRESS.get();
  33.       if (computationInProgress.add(this)) {
  34.         for (EClass eSuperType : getESuperTypes()) {
  35.           result.addAll(eSuperType.getEAllAttributes());
  36.         }
  37.         computationInProgress.remove(this);
  38.       }
  39.       for (EStructuralFeature eStructuralFeature : getEStructuralFeatures()) {
  40.         if (eStructuralFeature instanceof EAttribute) {
  41.           attributes.add((EAttribute)eStructuralFeature);
  42.         }
  43.       }

  44.       attributes.shrink();
  45.       eAttributes = new EcoreEList.UnmodifiableEList.FastCompare<EAttribute>
  46.           (this, EcorePackage.eINSTANCE.getEClass_EAttributes(), attributes.size(), attributes.data()) {
  47.           private static final long serialVersionUID = 1L;
  48.           @Override
  49.           public void addUnique(EAttribute object) {
  50.             ((InternalEList<EAttribute>)(InternalEList<?>)getEStructuralFeatures()).addUnique(object);
  51.           }
  52.           @Override
  53.           public boolean add(EAttribute object) {
  54.             System.err.println("Please fix your code to add using EClass.getEStructuralFeatures() instead of EClass.getEAttributes()");
  55.             return getEStructuralFeatures().add(object);
  56.           }
  57.         };
  58.       result.addAll(eAttributes);
  59.       result.shrink();
  60.       eAllAttributes = new EcoreEList.UnmodifiableEList.FastCompare<EAttribute>
  61.           (this, EcorePackage.eINSTANCE.getEClass_EAllAttributes(), result.size(), result.data());
  62.       getESuperAdapter().setAllAttributesCollectionModified(false);
  63.     }
  64.     return eAllAttributes;
  65.   }

EAttribute类里取得eAttributeType的方法是:

EDataType getEAttributeType()

阅读(1493) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~