Hi All,
Hope all is well.
On avalon-dev there's been a short discussion about the
Parameters object that is used in the generated sitemap
class. I thought I'd bring it up here so we can flesh out a
solution.
Have a look at this snippet from a generated sitemap:
----------------------
public class sitemap_xmap extends AbstractSitemap {
static final String LOCATION = "org.apache.cocoon.www.sitemap_xmap";
static {
dateCreated = 1007984808622L;
}
/** An empty <code>Parameter</code> used to pass to the sitemap components */
private Parameters emptyParam = new Parameters();
<snip>...
if (isSelected("userstatus", "permitted", listOfMaps,
emptyParam, objectModel)) {
----------------------
The problem is 2 fold, and has to do with the 'emptyParam'
reference when it's passed into the invocation of selectors and
actions, etc:
1. The Parameters class itself is not thread safe. Concurrent
updates to the one object may corrupt data.
2. There is only one parameter object across the whole sitemap,
accessed by all threads, and potentially many pipelines.
The second point is the killer if a developer decides to set a
parameter in a selector, or action, etc, and read it back elsewhere.
The problem is that the one object is shared among all threads - if 2
threads update the object (regardless of whether it's threadsafe
or not), results can be undefined if they use the same key.
As far as I can see there's no real need to be able to set
parameters in this object in selectors and actions, etc, as the Request
object can handle sharing of data between pipeline components via
set/getAttribute (or is there some other use for it ?).
If this is the case, we could make the parameters object read-only
before it's passed to selectors, etc, which would prevent this problem
from occuring (for example by wrapping it, or toggling its
read-only flag).
Alternatively, we could change the generated sitemap code to
create a new Parameters object per thread. I'm not sure how much
this influences other uses of this object though. Perhaps
someone else a bit closer to that part of the code might be able to
comment better ?
I'm wondering what everyone else's thoughts are on a solution
for this as it seems 'emptyParam' is used almost everywhere in
the generated sitemap class, and could be a touchy thing to
change.
Any comments/thoughts ?
Cheers,
Marcus
--
.....
,,$$$$$$$$$, Marcus Crafter
;$' '$$$$: Computer Systems Engineer
$: $$$$: ManageSoft GmbH
$ o_)$$$: 82-84 Mainzer Landstrasse
;$, _/\ &&:' 60327 Frankfurt Germany
' /( &&&
\_&&&&' Email : [EMAIL PROTECTED]
&&&&. Business Hours : +49 69 9757 200
&&&&&&&:
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]