隨筆-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.aygfsteel.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 三告習習 閱讀(1107) 評論(0)  編輯  收藏 所屬分類: emf/gef/gmf
          主站蜘蛛池模板: 宣化县| 贵南县| 张家港市| 安吉县| 阜平县| 同心县| 清原| 射阳县| 丹江口市| 淳化县| 增城市| 临武县| 临清市| 公安县| 德兴市| 津南区| 成都市| 湘乡市| 黑山县| 革吉县| 通许县| 巴彦淖尔市| 太仆寺旗| 仁寿县| 平和县| 巴中市| 昌江| 衡阳市| 新源县| 土默特左旗| 习水县| 棋牌| 南平市| 乐平市| 霍山县| 当涂县| 凉城县| 南涧| 达州市| 武城县| 偏关县|