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
          主站蜘蛛池模板: 嘉兴市| 大新县| 余庆县| 新化县| 衡东县| 常熟市| 灵川县| 施秉县| 潜山县| 阳新县| 宁远县| 长汀县| 崇阳县| 吉木萨尔县| 崇信县| 岢岚县| 银川市| 吉林省| 德令哈市| 祁连县| 商洛市| 桑日县| 弥勒县| 怀远县| 乐平市| 郧西县| 巴林右旗| 克拉玛依市| 小金县| 古田县| 大理市| 太仆寺旗| 仁寿县| 巴青县| 平谷区| 云龙县| 汉中市| 沙雅县| 根河市| 嘉禾县| 屯留县|