[ 
http://issues.apache.org/jira/browse/VELTOOLS-59?page=comments#action_12417295 
] 

Stu Belden commented on VELTOOLS-59:
------------------------------------

The fix above resolves the issue for me.

This issue:  VELOCITY-383 seems like a good place to discuss the Template 
thread safety issue.

> WebappLoader's isSourceModified() and getLastModified() sometimes fail
> ----------------------------------------------------------------------
>
>          Key: VELTOOLS-59
>          URL: http://issues.apache.org/jira/browse/VELTOOLS-59
>      Project: VelocityTools
>         Type: Bug

>   Components: VelocityView
>     Versions: 1.1, 1.2, 1.3, 2.0
>  Environment: WebSphere v5.1.x on Linux and Win32, possibly other appservers 
> or versions of WebSphere as well.
>     Reporter: Stu Belden
>     Assignee: Nathan Bubna
>     Priority: Minor
>      Fix For: 1.3, 2.0

>
> The org.apache.velocity.tools.view.servlet.WebappLoader class ensures that 
> all the paths it can load from end with the '/' character.  When loading a 
> template from disk in getResourceStream(), WebappLoader ensures that the file 
> to be loaded does not start with a '/' character, so the file always loads 
> properly.
> However, in isSourceModified(Resource resource) and getLastModified(Resource 
> resource), the same sanity check is _not_ made on the path of the resource, 
> so you can have a path like /myApp//some/file.vm.  The result of this, in my 
> environment(s) at least, is that the isSourceModified() check always returns 
> true because the file cannot be found.  With caching turned on, this leaves 
> you with with the Least Efficient Cache Ever, since it always re-reads any 
> template requested after the modificationCheckInterval.
> I haven't looked at it carefully, but I think FileResourceLoader may have the 
> same behavior.
> An interesting side effect of this unruly behavior is, I think, a 
> race-condition bug in the Template class.  In the process() method, the first 
> thing it does is set its "data" member, the AST of the template, to null.  
> However, another thread can get that same data member while it's 
> uninitialized.   This leads to the "java.lang.Exception: Template.merge() 
> failure. The document is null, most likely due to parsing error." error.  A 
> google search for "Template.merge() failure" turns up a couple web 
> applications that, I think, are falling prey to this problem as well.  This 
> problem is easy to duplicate:
> 1. Enable resource loader caching
> 2. Set the modificationCheckInterval to something small, like 10 seconds.
> 3. Hammer your application with requests.
> I'm not intimately familiar with the internals of velocity, so I'm not sure 
> what the fix should be, or even where it should go.  FWIW, I ended up writing 
> my own ResourceLoader that expects a leading '/' on all template names. 
> Thoughts?

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


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

Reply via email to