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 阅读(1653) 评论(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