[原创] 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
public static final String SERVICE_CLASS = " serviceClass " ;
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!! " );
}
}
}
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();
}
}
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));
}
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 }
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 ();"/>
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