Export JSONRPC
Goal
Expose an OSGi service instance as a JSONRPC service that can be accessed remotely through a URL.
Requirements
-
service instance that will be exporter
-
declaration containing the metadata below:
-
fuchsia.export.jsonrpc.class - full name of the interface in which your instance implements. e.g. /org.ow2.chameleon.fuchsia.jsonrpc.exporter.experiment.DummyIface/
-
fuchsia.export.jsonrpc.instance - instance.name (in OSGi terms) of your service, which will be used to grab the proper instance to be exported. e.g. DummyPojoInstance
-
fuchsia.export.jsonrpc.url.context (optional) - indicated the context that will be added in URL, by default "JSONRPC", which will be used as a prefix in the URL for the instance as in the example: http://localhost:8080/JSONRPC/DummyPojoInstance
-
Example
Exporter instantiation
Instance jsonRPCExporter = instance()
.of("org.ow2.chameleon.fuchsia.exporter.jsonrpc.JSONRPCExporter")
.with("target").setto("(fuchsia.export.jsonrpc.instance=*)");
Linker instantiation
Instance jsonRPCExporterLinker = instance()
.of(FuchsiaConstants.DEFAULT_EXPORTATION_LINKER_FACTORY_NAME)
.with(ExportationLinker.FILTER_EXPORTDECLARATION_PROPERTY).setto("(fuchsia.export.jsonrpc.instance=*)")
.with(ExportationLinker.FILTER_EXPORTERSERVICE_PROPERTY).setto("(instance.name=jsonRPCExporter)");
Export Declaration instantiation
Map<String, Object> metadata=new HashMap<String, Object>();
metadata.put("id","exporter-1");
metadata.put("fuchsia.export.jsonrpc.class","org.ow2.chameleon.fuchsia.jsonrpc.exporter.experiment.DummyIface");
metadata.put("fuchsia.export.jsonrpc.instance","DummyPojoInstance");
ExportDeclaration declaration = ExportDeclarationBuilder.fromMetadata(metadata).build();
Dictionary<String, Object> props = new Hashtable<String, Object>();
String clazzes[] = new String[]{org.ow2.chameleon.fuchsia.core.declaration.ExportDeclaration.class.getName()};
ServiceRegistration registration = context.registerService(clazzes, declaration, props);
Verification
Service was properly exported
You can use cURL to test if your instance was properly exported.
linux-shell# curl -i -X POST -d '{"jsonrpc": "2.0", "method": "helloworld", "params": ["earth"], "id": 1}' http://localhost:8080/JSONRPC/DummyPojoInstance
helloworld should be replaced by the method name declared on your interface to be exported
earth will be replaced by the parameters requested by your interface
http://localhost:8080/JSONRPC/DummyPojoInstance, consider this example an instance of the pattern "http://A:B/C/D", A and B depend on your framework configuration; C is constant and will never change; D is in fact the same "instance.name" of your OSGi service instance;