What are the possibilites for application-level control of resources
like JSP-resources? 

This would open up for e.g. creating a wiki-like application, where each
wiki-page is a valid JSP-page, which is created dynamically and stored
elsewhere than within the deployed WAR-file.

If anyone fancy this type of functionality - or have tried to implement
it by whatever means possible - please make a statement!

     -----

I consider creating my own custom-modification of Tomcat including
functionality for application-level control of resources - see the below
sketch. I kind of think upon a modified 'JspServlet' hidden behind a
nice interface so as to avoid fiddling directly with JSP-compilation and
so on.

Is this possible? 
How hard is it to implement?
Are there alternatives?

If you care to comment, I would like to here some opinions from people
with insight into the internals of Tomcat.

Morten Sabroe Mortensen


     ----- BEGIN: Idea for application-level control of resources: -----

My idea is this:

A web-resource like e.g. a JSP-page is to be obtained by the
servlet-engine from the web-application through an interface like this:


/**
 * Description of a resource within the context of a servlet-engine.
 */
public interface Resource
{
  /**
   * 
   */
  long getTimeModification()
    throws
      IOException;

  /**
   * 
   */
  long getSize()  //optional, possibly nice-to-have
    throws
      IOException;

  /**
   * 
   */
  InputStream getInputStream(String path)
    throws
      IOException;
}


When a user-agent addresses e.g. a JSP-page, a 'ResourceManager' set by
the application is requested by the servlet-engine with the purpose of
delivering the resource:


ServletContext (modified - Tomcat-specific):
    void setResourceManager(ResourceManager resourceManager) ...
    ResourceManager getResourceManager() ...

    Resource getResourceAsResource(String path)
    {
      Resource res=null;

      {
        ResourceManager resourceManager=getResourceManager();
        if (resourceManager!=null)
        {
          res=resourceManager.getResource(path);
        }
      }

      return res;
    }

    void addResourceListener(ResourceListener l)
    void removeResourceListener(ResourceListener l)
    void fireResourceUpdate(ResourceEvent ev)

interface ResourceManager:
    Resource getResource(String path) ...

interface ResourceListener:
    void onResourceUpdate(ResourceEvent ev)  ... //event-object must
contain path-information


There could be two strategies for accessing a resource:

1) Each time a resource like e.g. a JSP-page is requested, the
servlet-engine performs a lookup for the 'Resource' object and uses
'getTimeModification()' to determine, if the JSP-page has changed and
therefore should be re-compiled and re-loaded. The resource could also
have been removed completely, which would result in no 'Resource' object
being found and 'null' returned - in which case the page no longer
exists.

2) The application always notifies the servlet-engine about changes to
resources. If a resource like e.g. a JSP-page is changed or removed, the
application calls 'fireResourceUpdate()' which again trickers all
'ResourceListener' instances, where the servlet-engine itself per
default has a specific listener added and this listener makes the
servlet-engine perform a lookup for the 'Resource' as in 1). 

The 'ResourceManager' could implement a chain-of-responsibility, but
this can be left to the specific application and does not need to be
part of the interface between the servlet-engine and the
web-application.

Interesting types of resources include JSP-pages/-fragments and
tag-libraries.

As I see it, the 'Resource'-type of interface could also be in play,
when Tomcat differs between obtaining resources from an unpacked
WAR-file to when the WAR-file is actually unpacked within the
file-system and JSP-pages are added or changed directly within the
file-system. Tomcat must have something like my 'Resource'-functionality
already, but possibly not expressed as an interface between Tomcat and
web-applications. When moving to a "live" repository like a file-system,
the 'Resource.getTimeModification()' comes into play. There is a
possibility for a unification here.

     ----- END: Idea for application-level control of resources. -----



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to