<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
    主站蜘蛛池模板: 午夜一区二区免费视频| 亚洲大香人伊一本线| 免费观看一级毛片| 一级毛片成人免费看免费不卡| 亚洲精品成a人在线观看☆| h视频在线观看免费| 中文字幕精品三区无码亚洲 | 亚洲国产美女精品久久久久| 久久久亚洲精品蜜桃臀| 国产精品免费综合一区视频| 亚洲国产一区二区三区在线观看| 亚洲一区二区在线免费观看| 免费看美女裸露无档网站| 中文字幕免费在线视频| 欧洲乱码伦视频免费国产| 亚洲风情亚Aⅴ在线发布| 色老板亚洲视频免在线观| 亚洲网站在线免费观看| 亚洲av日韩av天堂影片精品| 亚洲一区精品无码| 久久久久亚洲av毛片大| 亚洲不卡AV影片在线播放| 免费精品国产自产拍观看| 国产精品免费小视频| 成人免费视频一区| 午夜色a大片在线观看免费| 成人免费一区二区三区| av片在线观看永久免费| 色婷婷综合缴情综免费观看| 亚洲欧洲中文日产| 亚洲熟妇av一区| 亚洲午夜久久久精品电影院| 亚洲国产精品张柏芝在线观看| 亚洲成在人线电影天堂色| 亚洲国产美女福利直播秀一区二区| 亚洲一区免费观看| 亚洲成a人片在线网站| 亚洲AV无码久久久久网站蜜桃 | 国产精品九九久久免费视频 | 日韩免费观看的一级毛片| 日韩一区二区免费视频|