Marcus,
This parameters object you are referring is read-only by semantics, but
not by syntax. It is used as an optimization, instead of writing:
> if (isSelected("userstatus", "permitted", listOfMaps,
> new Parameters(), objectModel)) {
sitemap uses static instance. The solution is to have unmodifiable
wrapper parameters class available, as it is done in java collections
library. Then, sitemap could be modified to use it:
> /** An empty <code>Parameter</code> used to pass to the sitemap
components
> */
> private Parameters emptyParam =
> Parameters.unmodifiableParameters(new Parameters());
Hope this is clear enough,
Regards,
Vadim
> -----Original Message-----
> From: Marcus Crafter [mailto:[EMAIL PROTECTED]]
> Sent: Thursday, December 20, 2001 12:42 PM
> To: Cocoon Developers Mailing List
> Subject: Sitemap parameters object & Threads
>
> 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]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]