gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          學習Tuscany

          安裝Tuscany的Eclipse插件

          1. 首先,啟動Eclipse,并依次點擊菜單:Help -> Software Updates -> Find and Install,選擇“Search for new features to install”,點擊下一步:
          2. 在接下來的對話框中,點擊“New Remote Site…”創建一個新的站點,命名為“Tuscany”,其地址為:http://people.apache.org/~jsdelfino/tuscany/tools/updatesite/
          3. 確認選擇了我們剛剛新增的一個遠程站點,并點擊“Finish”按鈕
          4. 選擇“Apache Tuscany SCA Tools”,并在接下來的窗口一路點擊Next,直到點擊Finish為止,接受該插件的使用協議(Plugin License)
           
          創建你的第一個集成服務應用程序
          下面的圖就是我們將要創建的應用的組件圖

          該應用是由四個服務組成的,這個應用是一個在線商店,這里有一個目錄服務,你可以通過它取得項目名單,依靠currencyCode屬性來判斷是以美元還是歐元提供項目價格,目錄服務本身不去做貨幣換算的工作,相反它引用了一個CurrencyConverter服務去完成這個工作。接下來,這里還有一個ShoppingCart服務,從目錄選擇了的項目可以被加進去(購物車),它是使用REST實現的;Catalog使用的是一個JSONRPC綁定,ShoppingCart呢則是通過ATOM進行綁定,最后,就是提供給用戶的、基于瀏覽器的界面服務的Store組件了,Store服務組件分別通過JSONRPCATOM綁定使用CatalogShoppingCart服務。

           

          創建一個Java工程

          這一步你要在Eclipse中建立一個Java工程,點擊工具欄上的New Java Project按鈕 來打開新建工程的對話框,接下來輸入store作為工程名稱,并選擇Create separate

          folders for sources and class files

          點擊下一步按鈕,在接下來的窗口打開Libraries選項卡,點擊Add Library...按鈕以添加Tuscany Libraray到工程中:

          最后,點擊Finish按鈕結束工程創建。

           

          構建服務

          首先,創建兩個包目錄,以便在接下來的步驟中存放服務的實現。選擇“store”工程,點擊工具欄上的新建Java包按鈕 啟動創建包對話框。接下來,輸入services作為包名,點擊Finish按鈕關閉對話框。

           

          重復剛才的步驟,創建另外一個名為ufservices的包,工程現在看起來應該類似這跟樣子:

          記下來,會在services包內放入普通的服務,ufservices內是界面相關服務。

           

          Catalog

          現在,準備創建Catalog服務的接口和實現。

          選擇“services”包,接下來在工具欄的下拉菜單中點擊“New Java Class” 按鈕 和“New Java Interface”按鈕 ,在彈出的對話框中以“Catalog”作為接口名,并點擊Finish關閉對話框,這時在Java編輯器中就會打開新增的Java接口,將下面這段Java接口代碼Copy-Paste到編輯器內:

           

          package services;
          import org.osoa.sca.annotations.Remotable;
          @Remotable
          public interface Catalog {
              String[] get();
          }

          再次選中“services”包,點擊“New Java Class”按鈕 ,在彈出的對話框中以“CatalogImpl”作為類的名字,將“Catalog”作為該類的實現接口,點擊Finish完成。

          Java編輯器中會打開我們新增的類,將下面的代碼復制過去:

           

          package services;
          import java.util.ArrayList;
          import java.util.List;
          import org.osoa.sca.annotations.Init;
          import org.osoa.sca.annotations.Property;
          import org.osoa.sca.annotations.Reference;
          public class CatalogImpl implements Catalog {
              @Property
              
          public String currencyCode = "USD";
              @Reference
              
          public CurrencyConverter currencyConverter;
              
          private List<String> catalog = new ArrayList<String>();
              @Init
              
          public void init() {
                  String currencySymbol 
          = currencyConverter.getCurrencySymbol(currencyCode);
                  catalog.add(
          "Apple - " + currencySymbol +
                  currencyConverter.getConversion(
          "USD", currencyCode, 2.99f));
                  catalog.add(
          "Orange - " + currencySymbol +
                  currencyConverter.getConversion(
          "USD", currencyCode, 3.55f));
                  catalog.add(
          "Pear - " + currencySymbol +
                  currencyConverter.getConversion(
          "USD", currencyCode, 1.55f));
              }
              
          public String[] get() {
                  String[] catalogArray 
          = new String[catalog.size()];
                  catalog.toArray(catalogArray);
                  
          return catalogArray;
              }
          }

           

          當完成這些步驟以后,store項目看起來會類似這樣:

           

          注意,CatalogImpl上面有一個紅叉,因為它引用了我們還沒由實現的CurrencyConverter接口。
           
          CurrencyConverter

          在這一步,我們將創建CurrencyConverter的接口和實現,首先,按照之前的方式建立接口和類文件,并將下面的代碼復制過去:

           

          package services;
          import org.osoa.sca.annotations.Remotable;
          @Remotable
          public interface CurrencyConverter {
              
          public float getConversion(String fromCurrenycCode,
              String toCurrencyCode, 
          float amount);
              
          public String getCurrencySymbol(String currencyCode);
          }
           
          下面,我們來創建上面這跟接口的實現類CurrencyConverterImpl:
          package services;
          public class CurrencyConverterImpl implements CurrencyConverter {
              
          public float getConversion(String fromCurrencyCode,
                  String toCurrencyCode, 
          float amount) {
                  
          if (toCurrencyCode.equals("USD"))
                      
          return amount;
                  
          else             if (toCurrencyCode.equals("EUR"))
                          
          return amount*0.7256f;
                  
          return 0;
              }
              
          public String getCurrencySymbol(String currencyCode) {
                  
          if (currencyCode.equals("USD"))
                      
          return "$";
                  
          else
                      
          if (currencyCode.equals("EUR"))
                          
          return "?";
                  
          return "?";
              }
          }
           
          現在,項目看起來是這樣:
           
          ShoppingCart
          在這里我們要創建ShoppingCart的實現類。
          仍然在services包內創建我們的實現類,代碼如下:
          package services;
          import java.util.Date;
          import java.util.HashMap;
          import java.util.Map;
          import java.util.UUID;
          import org.apache.tuscany.sca.binding.feed.collection.Collection;
          import org.apache.tuscany.sca.binding.feed.collection.NotFoundException;
          import com.sun.syndication.feed.atom.Content;
          import com.sun.syndication.feed.atom.Entry;
          import com.sun.syndication.feed.atom.Feed;
          import com.sun.syndication.feed.atom.Link;
          public class ShoppingCartImpl implements Collection {
              
          // needs to change to instance var once conversation scope works
              private static Map<String, Entry> cart = new HashMap<String, Entry>();
              
          public Feed getFeed() {
                  Feed feed 
          = new Feed();
                  feed.setTitle(
          "shopping cart");
                  Content subtitle 
          = new Content();
                  subtitle.setValue(
          "Total : " + getTotal());
                  feed.setSubtitle(subtitle);
                  feed.getEntries().addAll(cart.values());
                  
          return feed;
              }
              
          public Entry get(String id) throws NotFoundException {
                  
          return cart.get(id);
              }
              
          public Entry post(Entry entry) {
                  String id 
          = "cart-" + UUID.randomUUID().toString();
                  entry.setId(id);
                  Link link 
          = new Link();
                  link.setRel(
          "edit");
                  link.setHref(
          "" + id);
                  entry.getOtherLinks().add(link);
                  link 
          = new Link();
                  link.setRel(
          "alternate");
                  link.setHref(
          "" + id);
                  entry.getAlternateLinks().add(link);
                  entry.setCreated(
          new Date());
                  cart.put(id, entry);
                  
          return entry;
              }
                  
          public void put(String id, Entry entry) throws NotFoundException {
                  entry.setUpdated(
          new Date());
                  cart.put(id, entry);
              }
              
          public void delete(String id) throws NotFoundException {
                  
          if (id.equals(""))
                      cart.clear();
                  
          else
                      cart.remove(id);
              }     
          private String getTotal() {
                  
          float total = 0;
                  String symbol 
          = "";
                  
          if (!cart.isEmpty()) {
                      Entry entry 
          = cart.values().iterator().next();
                      String item 
          = ((Content)entry.getContents().get(0)).getValue();
                      symbol 
          = item.substring(item.indexOf("-")+2, item.indexOf("-")+3);
                  }
                  
          for (Entry entry : cart.values()) {
                      String item 
          = ((Content)entry.getContents().get(0)).getValue();
                      total 
          += Float.valueOf(item.substring(item.indexOf("-")+3));
                  }
                  
          return symbol + String.valueOf(total);
              }
          }
           
          注意:由于Tuscany的會話支持目前還實現,購物籃在這里通過一個hack來實現,cart被定義成一個靜態域。
          目前,項目看起來如下:
           
          Store
          這里將創建一個用戶界面服務,通過瀏覽器為我們創建的其他服務提供交互的接口和界面。在ufservices內新建一個文件store.html,代碼如下:
          <html>
          <head>
          <title>Store</TITLE>

          <script type="text/javascript" src="store.js"></script>

          <script language="JavaScript">

              
          //Reference
              catalog = (new JSONRpcClient("../Catalog")).Catalog;
              
          //Reference
              shoppingCart = new AtomClient("../ShoppingCart");


              
          function catalog_getResponse(items) {
                  
          var catalog = "";
                  
          for (var i=0; i<items.length; i++)
                      catalog 
          += '<input name="items" type="checkbox" value="' +
                                  items[i] 
          + '">' + items[i]+ ' <br>';
                  document.getElementById(
          'catalog').innerHTML=catalog;
              }

              
          function shoppingCart_getResponse(feed) {
                  
          if (feed != null) {
                      
          var entries = feed.getElementsByTagName("entry");
                      
          var list = "";
                      
          for (var i=0; i<entries.length; i++) {
                          
          var item = entries[i].getElementsByTagName("content")[0].firstChild.nodeValue;
                          list 
          += item + ' <br>';
                      }
                      document.getElementById(
          "shoppingCart").innerHTML = list;
                      document.getElementById(
          'total').innerHTML = feed.getElementsByTagName("subtitle")[0].firstChild.nodeValue;
                  }
              }
              
          function shoppingCart_postResponse(entry) {
                  shoppingCart.get(
          "", shoppingCart_getResponse);
              }


              
          function addToCart() {
                  
          var items  = document.catalogForm.items;
                  
          var j = 0;
                  
          for (var i=0; i<items.length; i++)
                      
          if (items[i].checked) {
                          
          var entry = '<entry xmlns="http://www.w3.org/2005/Atom"><title>cart-item</title><content type="text">'+items[i].value+'</content></entry>'
                          shoppingCart.post(entry, shoppingCart_postResponse);
                          items[i].checked 
          = false;
                      }
              }
              
          function checkoutCart() {
                  document.getElementById(
          'store').innerHTML='<h2>' +
                          
          'Thanks for Shopping With Us!</h2>'+
                          
          '<h2>Your Order</h2>'+
                          
          '<form name="orderForm" action="store.html">'+
                              document.getElementById(
          'shoppingCart').innerHTML+
                              
          '<br>'+
                              document.getElementById(
          'total').innerHTML+
                              
          '<br>'+
                              
          '<br>'+
                              
          '<input type="submit" value="Continue Shopping">'+
                          
          '</form>';
                  shoppingCart.del(
          ""null);
              }
              
          function deleteCart() {
                  shoppingCart.del(
          ""null);
                  document.getElementById(
          '

          posted on 2008-05-07 10:46 gembin 閱讀(1315) 評論(0)  編輯  收藏 所屬分類: SCASOA

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊

          收藏夾(9)

          Adobe

          Android

          AS3

          Blog-Links

          Build

          Design Pattern

          Eclipse

          Favorite Links

          Flickr

          Game Dev

          HBase

          Identity Management

          IT resources

          JEE

          Language

          OpenID

          OSGi

          SOA

          Version Control

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          free counters
          主站蜘蛛池模板: 临沭县| 东平县| 徐闻县| 铜鼓县| 普陀区| 天柱县| 麟游县| 滨州市| 祁连县| 常山县| 聊城市| 灵璧县| 石首市| 新邵县| 齐齐哈尔市| 新野县| 石楼县| 牙克石市| 虞城县| 东宁县| 土默特右旗| 崇信县| 运城市| 景宁| 六枝特区| 阜南县| 古浪县| 密山市| 榆中县| 琼海市| 河曲县| 昌都县| 东光县| 凤山县| 秀山| 寻乌县| 洛阳市| 咸丰县| 微博| 房产| 黑河市|