<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://www.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
    主站蜘蛛池模板: 亚洲精品第一国产综合精品99| 亚洲av乱码一区二区三区| 国产一级a毛一级a看免费人娇 | 亚洲乱妇老熟女爽到高潮的片| 一级做a爱片特黄在线观看免费看| 亚洲一区二区三区免费观看| 亚洲精品影院久久久久久| 久久久久国色AV免费观看性色| 亚洲AV日韩AV天堂久久| 3344永久在线观看视频免费首页| 国内精品99亚洲免费高清| 无码免费一区二区三区免费播放| 国产成人精品久久亚洲高清不卡 | 亚洲色精品VR一区区三区 | 免费H网站在线观看的| 337p日本欧洲亚洲大胆人人| 亚洲国产精彩中文乱码AV| 成人毛片免费在线观看| 在线毛片片免费观看| 亚洲日本成本人观看| 亚洲欧洲日产国码av系列天堂| 未满十八私人高清免费影院| 亚洲国产av美女网站| 亚洲午夜国产精品无码| 亚洲欧洲免费无码| 91在线视频免费观看| 亚洲AV无码一区二区三区网址| 在线观看人成视频免费| 国内精品一级毛片免费看| 亚洲成av人无码亚洲成av人| 亚洲国产精品一区二区久久| 亚洲第一页日韩专区| 好先生在线观看免费播放| 久久精品国产这里是免费| 色噜噜狠狠色综合免费视频 | 夜夜亚洲天天久久| 久久久久亚洲AV成人网人人软件| 一个人看的免费观看日本视频www| 亚洲成A人片77777国产| 国产成人免费爽爽爽视频| 99久久99久久免费精品小说|