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

Reply via email to