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

           

          [原創] Dynamic DataService registration in OSGi Container for Graniteds v1.1.0

          In last entry(Adding OSGi support to graniteds v1.1.0), i talk about the OSGifition of Graniteds. Now i would like to add dynamic registration of Granite DataService by using annotation (@RemoteDestination).


          Step1:
             Define two constants:
            
             public static final String TOPIC_GDS_ADD_SERVICE ="org/granite/ds/add/serviceClass";
             
          public static final String SERVICE_CLASS="serviceClass";
             Then,we modify the org.granite.config.flex.ServicesConfig.java
            
            
          import org.osgi.service.event.Event;
          import org.osgi.service.event.EventHandler;
          public
           class ServicesConfig implements ScannedItemHandler,EventHandler{
               
          //
               
          //
               public void handleEvent(Event event) {
                  
          if(event.getTopic().equals(TOPIC_GDS_ADD_SERVICE)){
                    Class c
          =(Class) event.getProperty(SERVICE_CLASS);
                    
          if(c!=null)
                      handleClass(c);
          //this method is already provided by this Class, we just call it
                    else
                     System.out.println(
          "Class NOT Found!!");
                  }
              }
           
            }

          Step2:

             in the AMFServiceAdaptor.java I mentioned in the last entry
            
            
              BundleContext context;
              
          public AMFServiceAdaptor(BundleContext context){
                  
          this.context=context;
              }
             
          public void init(ServletConfig config) {
                  
          try {
                      
          super.init(config);
                      graniteConfig 
          = GraniteConfig.loadConfig(getServletContext());
                      servicesConfig 
          = ServicesConfig.loadConfig(getServletContext());
                      Dictionary
          <String, Object> properties = new Hashtable<String, Object>();
                      String[] topics 
          = new String[] { TOPIC_GDS_ADD_SERVICE};
                      properties.put(EventConstants.EVENT_TOPIC, topics);
                      context.registerService(EventHandler.
          class.getName(), servicesConfig, properties);
                  } 
          catch (ServletException e) {
                      e.printStackTrace();
                  }
              }
            
            
          Step3:
             In the Activator we add:

          Activator.java  
           
            Dictionary<String, Object> properties = new Hashtable<String, Object>();
             properties.put(SERVICE_CLASS, TestService.
          class);
             ServiceReference eventAdminRef 
          = context.getServiceReference(EventAdmin.class.getName());
             
          if (eventAdminRef != null){
                 EventAdmin admin
          =context.getService(eventAdminRef);
                  
          if(admin!=null){
                      admin.sendEvent(
          new Event(TOPIC_GDS_ADD_SERVICE,properties));    
             }
            
          TestService.java

           1 package net.blogjava.gembin.domain.services.test;
           2 
           3 import org.granite.messaging.service.annotations.RemoteDestination;
           4 
           5 
           6 @RemoteDestination(id="testService", service="granite-service",channel="my-graniteamf", scope="session")
           7 public class TestService {
           8    
           9     public void test(){
          10         System.out.println("test it!!!");
          11     }
          12 
          13 }


          Step4:
            Flex Part
           
                          [Bindable]
                          
          private var srv:RemoteObject = null;
                          
          import mx.messaging.ChannelSet;
                          
          import mx.messaging.config.ServerConfig;
                          
          import mx.rpc.remoting.mxml.Operation;
                          
          private function testSend():void{
                              srv 
          = new RemoteObject();
                              srv.endpoint 
          = ServerConfig.getChannel("my-graniteamf").endpoint;
                              srv.destination 
          = "testService"
                              srv.channelSet 
          = new  ChannelSet(); 
                              srv.channelSet.addChannel(ServerConfig.getChannel(
          "my-graniteamf"));
                               var operation:Operation 
          = new Operation();
                               operation.name 
          = "test";
                               operation.addEventListener(FaultEvent.FAULT,handleFault);
                               operation.addEventListener(ResultEvent.RESULT,handleRs);
                               srv.operations 
          = {test: operation};
                               srv.test();
                          }
                          private function handleFault(e:FaultEvent):void{
                              Alert.show(e.toString());
                          }
                          private function handleRs(e:ResultEvent):void{
                              Alert.show(e.toString());
                          }
                          <mx:Button id="Test" label="TestIt" click="
          testSend();"/>

          Screen shot


           
          Conclusion
            
             from this example, you can see it's very easy to add osgi dynamic feathure support in Graniteds.

          Enjoy it!!!


          Next entry Example for GraniteDS v1.2.0 OSGi bundle 

          posted on 2008-12-04 14:51 gembin 閱讀(1717) 評論(0)  編輯  收藏 所屬分類: OSGiFlexActionScript3

          導航

          統計

          常用鏈接

          留言簿(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
          主站蜘蛛池模板: 沂南县| 皮山县| 周宁县| 景泰县| 赣州市| 虹口区| 恩施市| 南郑县| 枣阳市| 全州县| 大荔县| 宝鸡市| 营口市| 西城区| 亳州市| 东港市| 本溪市| 三原县| 安阳县| 红河县| 蓝山县| 崇州市| 长岛县| 固阳县| 西和县| 宾阳县| 宝丰县| 日喀则市| 巴塘县| 益阳市| 西和县| 温州市| 嘉黎县| 漯河市| 沙坪坝区| 陈巴尔虎旗| 尼勒克县| 绍兴县| 海伦市| 固镇县| 万年县|