<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>


    隨筆-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://m.tkk7.com/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 三告習習 閱讀(1109) 評論(0)  編輯  收藏 所屬分類: emf/gef/gmf
    主站蜘蛛池模板: 亚洲精品视频在线看| 亚洲国产精品无码专区在线观看| 色欲色欲天天天www亚洲伊| 亚洲精品在线视频| 免费无码毛片一区二区APP| 亚洲中文字幕一二三四区| 久久久久国产亚洲AV麻豆 | 亚洲sm另类一区二区三区| 亚洲中文字幕久久精品无码喷水| 1000部羞羞禁止免费观看视频| 亚洲爆乳无码专区www| 亚洲欧洲第一a在线观看| 日韩精品免费一区二区三区| 久久免费线看线看| 亚洲AV第一成肉网| 精品亚洲国产成AV人片传媒| 国产视频精品免费| 久久www免费人成看片| 国产精品免费看久久久香蕉| 亚洲午夜成人精品无码色欲| 亚洲人成网站在线播放影院在线| 免费国产真实迷j在线观看| 99爱在线精品视频免费观看9| 免费人成在线观看播放a| 亚洲伊人色一综合网| 久久亚洲高清观看| 四虎永久成人免费| 国产国产人免费视频成69堂| 在线视频网址免费播放| 亚洲AV无码一区二区三区久久精品 | 一个人看的www在线观看免费| 三级毛片在线免费观看| 精品久久久久久亚洲综合网| 亚洲国产福利精品一区二区| 久久精品国产亚洲av四虎| 亚洲乱码中文字幕综合234| 午夜视频在线观看免费完整版| 99精品视频在线观看免费播放| 国产成人精品免费视频大全| 亚洲AV香蕉一区区二区三区| 亚洲中文字幕无码爆乳app|