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 閱讀(1706) 評論(0)  編輯  收藏 所屬分類: OSGiFlex 、ActionScript3

          導航

          統計

          常用鏈接

          留言簿(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
          主站蜘蛛池模板: 上林县| 南充市| 梧州市| 龙胜| 宁远县| 兴隆县| 固原市| 禹城市| 酉阳| 右玉县| 龙口市| 叙永县| 景洪市| 从化市| 西和县| 门源| 棋牌| 柯坪县| 东兰县| 三门峡市| 新建县| 佳木斯市| 清河县| 离岛区| 汉中市| 惠安县| 顺平县| 县级市| 乐昌市| 双辽市| 高州市| 宣化县| 星子县| 柳江县| 喀什市| 库尔勒市| 郎溪县| 云和县| 龙南县| 界首市| 鹿邑县|