Here's what I've done. I have a finder that takes a Class and path:
public class ClassResourceFinder extends Finder
{
Class baseClass;
String packageName;
/** Creates a new instance of ClassResourceFinder */
public ClassResourceFinder(Context context,Class baseClass,String path)
{
super(context);
this.baseClass = baseClass;
this.packageName = path.charAt(0)=='/' ? path :
"/"+baseClass.getPackage().getName().replace('.','/')+"/"+path;
if (!this.packageName.endsWith("/")) {
this.packageName += "/";
}
}
public Resource findTarget(Request request,Response response)
{
String path = packageName+request.getResourceRef().getRemainingPart();
Resource r = new
ClassResource(getContext(),request,response,baseClass,path);
return r;
}
}
and then I have a simple resource for getting resources from the Class instance:
public class ClassResource extends Resource
{
Class baseClass;
String path;
MediaType type;
/** Creates a new instance of ClassResource */
public ClassResource(Context context, Request request, Response
response,Class baseClass,String path)
{
super(context,request,response);
this.baseClass = baseClass;
this.path = path;
int extPos = path.lastIndexOf('.');
Application app = context.getApplication();
type = app.getMetadataService().getDefaultMediaType();
if (extPos>=0) {
String ext = path.substring(extPos+1);
Metadata mdata =
getContext().getApplication().getMetadataService().getMetadata(ext);
if (mdata!=null) {
type = MediaType.valueOf(mdata.getName());
}
}
getVariants().add(new Variant(type));
}
public Representation getRepresentation(Variant v)
{
if (getLogger().isLoggable(Level.FINE)) {
getLogger().info("Class resource: "+path);
}
InputStream is = baseClass.getResourceAsStream(path);
if (is==null) {
return null;
} else {
return new InputRepresentation(is,type);
}
}
}
--Alex Milowski