Created a simple BundleResourceClientHelper for use in an OSGI environment.
It's probably ugly, but wanted to share it anyway.
======== Start code============
public class BundleResourceClientHelper extends LocalClientHelper
{
public static final Protocol BUNDLERESOURCE = new
Protocol("bundleresource","BUNDLERESOURCE",
"OSGI Bundle Resource", Protocol.UNKNOWN_PORT);
public BundleResourceClientHelper(Client client)
{
super(client);
getProtocols().add(BUNDLERESOURCE);
}
@Override
protected void handleLocal(Request request, Response response,
String decodedPath)
{
String scheme = request.getResourceRef().getScheme();
if(BUNDLERESOURCE.getSchemeName().equalsIgnoreCase(scheme))
{
handleFile(request,response);
}
else
{
throw new IllegalArgumentException("Protocol " + scheme
+ " not supported, only BUNDLERESOURCE is supported");
}
}
private void handleFile(Request request, Response response)
{
if(Method.GET.equals(request.getMethod()) ||
Method.HEAD.equals(request.getMethod()))
{
handleGet(request,response);
}
else {
response.setStatus(Status.CLIENT_ERROR_METHOD_NOT_ALLOWED);
response.getAllowedMethods().add(Method.GET);
response.getAllowedMethods().add(Method.HEAD);
}
}
private void handleGet(Request request, Response response)
{
try
{
String path = request.getResourceRef().getPath();
URL url = new URL(request.getResourceRef().toString());
Representation output = new InputRepresentation(url
.openStream(), getMetadataService()
.getDefaultMediaType());
output.setLocationRef(request.getResourceRef());
output.setModificationDate(new Date());
// Update the expiration date
long timeToLive = getTimeToLive();
if (timeToLive == 0) {
output.setExpirationDate(null);
} else if (timeToLive > 0) {
output.setExpirationDate(new Date(System
.currentTimeMillis()
+ (1000L * timeToLive)));
}
// Update the metadata based on file extensions
String name = path.substring(path.lastIndexOf('/') + 1);
Entity.updateMetadata(name, output, true,
getMetadataService());
// Update the response
response.setEntity(output);
response.setStatus(Status.SUCCESS_OK);
}
catch(Exception e)
{
response.setStatus(Status.CLIENT_ERROR_NOT_FOUND);
}
}
}
===== End code =====
Usage:
Step 1: enable the client helper in the restlet engine:
Engine.getInstance().getRegisteredClients().add(new
BundleResourceClientHelper(null));
Step 2: enable the protocol on your component:
component.getClients().add(BundleResourceClientHelper.BUNDLERESOURCE);
Step 3: call a resource from your (running) bundle:
new Directory(getContext(), new
Reference(getClass().getClassLoader().getResource("/www")));
It's probably already done, but I could not find it anyware.
Note: some kind of OSGI scheme notation could be used with some small
modifications
------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2642292