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

           

          [原創(chuàng)] 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 閱讀(1685) 評(píng)論(0)  編輯  收藏 所屬分類: OSGiFlexActionScript3

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊(cè)

          收藏夾(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

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          free counters
          主站蜘蛛池模板: 当阳市| 湖口县| 霍城县| 建始县| 清水县| 上林县| 丹阳市| 彰化县| 浏阳市| 方正县| 浦北县| 吴桥县| 苍山县| 鄂托克旗| 永仁县| 南木林县| 铁力市| 洛扎县| 蒙自县| 和平区| 海盐县| 临城县| 九江市| 重庆市| 彰化市| 达日县| 新丰县| 织金县| 兴宁市| 沽源县| 和政县| 洪湖市| 通化县| 新宾| 封丘县| 咸阳市| 怀远县| 延安市| 大城县| 浦城县| 贵港市|