随笔-35  评论-97  文章-0  trackbacks-0

EObjectCondition ,从名称上就可以意会到它是有关EObject的条件了。EObject和EMF的模型是关联的,那么,EObjectCondition 当然就是与EMF模型有关咯。比如,你的商店shop聚集了很多个商品的种类categories,你可以根据EObjectCondition 来查询商店shop中是拥有某xxCategory的商品。条件怎么构造?这个章节回有所介绍咯!呵呵,接着下去吧。

首先看看EObjectCondition,还是从结构图上分析:

EObjectCondition有很多内嵌子类,但是很多你都不能直接实例化它们,它们是留给EObjectCondition做逻辑操作使用的,也可以说,条件用于复合时使用到这些类:如And,Or等等,你看看EObjectCondition的所拥有的操作就明白了。

ENot条件,看看名称就懂,呵呵。

EObjectConditionAdapter是用于非EObject Condition 包装成 EObject Condition 的适配器。感觉这个适配器作用同值条件的适配器还是很相似的,值条件适配器在前一篇帖子里有介绍http://www.blogjava.net/orangewhy/archive/2007/06/10/123180.html

好了,看看相关的示例吧。再次强调,模型怎么来?看http://www.cnblogs.com/bjzhanghao/category/38915.html系列的介绍吧(呵呵,不是刻意帮八兄做广告,只是回溯一下模型从哪来的)。

现在假设一个简单的使用场景:

1、假定厂家生成的物品种类有三种: “食物”, “日用品”, 和“体育器材”。

2、假定“人人乐”超市只进货“食物”, “日用品”这两种物品,“体育器材”在“人人乐”没有销售。

        ShopFactory shopFactory = ShopFactory.eINSTANCE;
        
        Category food 
= shopFactory.createCategory();
        food.setName(
"食物");
        Category commodity 
= shopFactory.createCategory();
        commodity.setName(
"日用品");
        Category equipment 
= shopFactory.createCategory();
        equipment.setName(
"体育器材");
        
        
//假定厂家生成的物品种类有三种
        Set<Category> categorySet = new HashSet<Category>();
        categorySet.add(food);
        categorySet.add(commodity);
        categorySet.add(equipment);
        EObjectCondition inShopCondition 
= new IN(categorySet);//集合包含条件
        System.out.println("Test inShopCondition: " + inShopCondition.isSatisfied(food));//是否含有“食物”
        
        
//“人人乐”超市只进货两种物品,“体育器材”在这里没有销售
        Shop shop = shopFactory.createShop();
        shop.setName(
"人人乐");
        shop.getCategories().add(food);
        shop.getCategories().add(commodity);

在看看另外一个EObjectCondition的结构,例子用要到了。

IN条件主要匹配“是否包含有”。它关联了IEObjectSource。EMF 的对象资源都是来自与这个接口,这是使得查询可以被嵌套。

EObjectTypeRelationCondition是同EMF对象类型有关的条件。例子会给出一种简单使用方法。类型的判别,是通过它关联的TypeRelation来定义的。能扩展类型吗?呵呵,我还没试过。

看看例子吧。假设你要看看厂家是否生产了某中商品(从类别体现):

        EObjectCondition inShopCondition = new IN(categorySet);//集合包含条件
        System.out.println("Test inShopCondition: " + inShopCondition.isSatisfied(food));//是否含有“食物”

看看“人人乐”是否有某类商品出售:

这里要有个注意,IN条件好像不能直接满足我们的要求,因为他需要Set类型的集合,但是商品类型却是再shop中关联。这里用了自定义的一个条件来扩展EObjectCondition,然后实现我们需要的逻辑判断,类定义如下(使用内部静态类形式):

    static class CategoryINShopCondition extends EObjectCondition
    
{
        
private Shop shop;
        
public CategoryINShopCondition()
        
{
            
super(PruneHandler.NEVER);
        }

        
public CategoryINShopCondition(Shop shop)
        
{
            
super(PruneHandler.NEVER);
            
this.shop = shop;
        }

        @Override
        
public boolean isSatisfied(EObject eObject)
        
{
            
if(eObject instanceof Category)
            
{
                Category category 
= (Category)eObject;
                
return shop.getCategories().contains(category);
            }

            
return false;
        }

    }

现在查询“人人乐”是否有某类商品出售:

    EObjectCondition categoryINShopCondition = new CategoryINShopCondition(shop);// 超市包含货物种类条件
        System.out.println("Test CategoryINShopCondition: " + categoryINShopCondition.isSatisfied(food));// 是否含有“食物”
但是我想知道否厂商和超市都含有“器材”呢,怎办?
EObjectCondition andCondition = inShopCondition.AND(categoryINShopCondition);// //集合包含条件 且 超市包含货物种类条件
        System.out.println(andCondition.isSatisfied(equipment));// 是否集合和超市都含有“器材”?
对象条件是使用于对象的,也就是它比较的时候会注重是否是“同一对象”但是,你要只比较某属性时,怎么办,其中一种办法就是使用非对象条件,就是你可以通过EObjectConditionAdapter来包装成对象条件。
        // 对象条件是使用于对象的,也就是它比较的时候会注重是否是“同一对象”
        
// 但是,你要只比较某属性时,怎么办,其中一种办法就是使用非对象条件,就是你可以通过EObjectConditionAdapter来包装成对象条件
        StringValue foodNameCondition = new StringValue("食物"false);
        StringValue commodityNameCondition 
= new StringValue("日用品"false);
        Condition shopHasCondition 
= foodNameCondition.OR(commodityNameCondition);
        EObjectConditionAdapter shopHasCategory 
= new EObjectConditionAdapter(shopHasCondition)
        
{
            @Override
            
public boolean isSatisfied(Object object)
            
{
                
if(object instanceof NamedElement)
                
{
                    NamedElement namedElement 
= (NamedElement)object;
                    String name 
= namedElement.getName();
                    
return super.isSatisfied(name);
                }

                
else if(object instanceof String)
                
{
                    String name 
= (String)object;
                    
return super.isSatisfied(name);
                }

                
return false;
            }

            @Override
            
public boolean isSatisfied(EObject object)
            
{
                
if(object instanceof NamedElement)
                
{
                    NamedElement namedElement 
= (NamedElement)object;
                    String name 
= namedElement.getName();
                    
return super.isSatisfied(name);
                }

                
return false;
            }

        }
;
        System.out.println(
"“人人乐”有食物吗? " + shopHasCategory.isSatisfied("食物"));
        System.out.println(
"“人人乐”有食物吗? " + shopHasCategory.isSatisfied(food));
        System.out.println(
"人人乐”有体育器材吗? " + shopHasCategory.isSatisfied("体育器材"));
        System.out.println(
"人人乐”有体育器材吗? " + shopHasCategory.isSatisfied(equipment));
    }
好了,再看看EObjectTypeRelationCondition怎么用吧:
EObjectCondition typeRelationCondition = 
            
new EObjectTypeRelationCondition(ShopPackage.Literals.CATEGORY,
                                            TypeRelation.SAMETYPE_OR_SUBTYPE_LITERAL);
// 如果是相同类型或者是子类
        
        
for(EObject subject : categorySet)
        
{
            
if(typeRelationCondition.isSatisfied(subject))
            
{// 将满足类型条件的输出来
                System.out.println(subject);
            }

        }

顺便再看看EObjectInstanceCondition:

        Shop shop = shopFactory.createShop();// 人人乐处女店(第一间开张)
        shop.setName("人人乐");
        EObjectCondition instanceCondition 
= new EObjectInstanceCondition(shop);
        Shop newShop 
= shopFactory.createShop();
        newShop.setName(
"人人乐");// 人人乐分店(非第一间开张)
        System.out.println(instanceCondition.isSatisfied(shop));// 是处女店吗?
        System.out.println(instanceCondition.isSatisfied(newShop));// 是处女店吗?

 

在这一篇章中,条件主要都是做一些逻辑的判断,如果要查询出来具体的对象合着对象集合呢?不要着急,下一篇就是咯,呵呵。

posted on 2007-06-10 15:10 三告习习 阅读(1104) 评论(0)  编辑  收藏 所属分类: emf/gef/gmf

只有注册用户登录后才能发表评论。


网站导航: