<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 三告習習 閱讀(1117) 評論(0)  編輯  收藏 所屬分類: emf/gef/gmf
    主站蜘蛛池模板: jjzz亚洲亚洲女人| 最近中文字幕免费mv视频7| 亚洲综合色区在线观看| 精品国产亚洲第一区二区三区 | 91福利免费网站在线观看| 亚洲成a人片在线观看国产| 国产精品成人亚洲| 亚洲字幕AV一区二区三区四区| 美女隐私免费视频看| 国产一区二区三区在线观看免费| 亚洲精品无播放器在线播放| 在线免费一区二区| 久久久久久亚洲精品无码| 亚洲精品在线免费观看视频| 亚洲精品人成电影网| 国产精品免费观看久久| 国产成人精品日本亚洲语音| 亚洲A∨午夜成人片精品网站| jizz中国免费| 日韩免费一级毛片| 一级毛片完整版免费播放一区| 亚洲女同成av人片在线观看| 久久午夜夜伦鲁鲁片免费无码| 亚洲色成人网一二三区| 国产亚洲精品免费视频播放| 亚洲AV日韩AV永久无码久久| 18禁美女裸体免费网站| 亚洲精品无码aⅴ中文字幕蜜桃| 亚洲人成无码网WWW| 久久国产免费观看精品3| 亚洲国语在线视频手机在线| 四虎永久成人免费影院域名| 在线看片免费人成视频播| 亚洲午夜久久久精品电影院| 又粗又硬免费毛片| 国产精品免费观看调教网| 亚洲色精品VR一区区三区| 久久亚洲国产成人精品无码区| 精品国产免费人成电影在线观看| 蜜臀亚洲AV无码精品国产午夜.| 亚洲乱码精品久久久久..|