Yup, we've got a problem. Most things in the WikiContext are such that they do not survive serialization - WikiEngine, HttpServletRequest, even WikiPage (due to interactions with the CachingManager).

It's a good question whether they even do survive leaving the WikiSession and being executed in somebody else's context (the HttpServletRequest comes to mind). Now, since SavePageTask.execute() invokes the parser, that means that user plugins are also invoked, and if you've got someone relying on HttpServletRequest parameters at the time of save parsing - well, boom for them. (Not that I would see that anyone would do that.)

Oy.

Thinking out loud: Might I recommend that we encourage plugin developers NOT to assume the presence of an HTTP request in 3.0? It's going to be much cleaner simply to grab whatever parameters Stripes binds to the ActionBean via their accessors (they will correctly typed, among other things). E.g., if Stripes binds the "page" request parameter to an ActionBean's property of type WikiPage, why not just use getPage() to get it, rather than go through trouble of getting the request from the context, calling getParameter(), looking for nulls and misspellings etc...? So much could go wrong, and Stripes takes care of this for you. So, in 3.0 a developer commandment might be:

Thy plugins shalt not assume that HttpServletRequests are available, and shalt not parse its parameters.

In 2.8, clearly we **can't** make a "don't depend on the request" recommendation...

Aside: one of the things that pleases me the most about Stripes is that its parameter-binding glue allows us to decouple the request from the WikiContext. Likewise, the Resolution and related UrlBuilder classes decouple it from the response.

The reason we call textToHTML() is to make sure the access rules and metadata are correct after save. This is needed because of the CachingProvider, and is one of the reasons why our metadata system is so crappy and kludgy and I can't wait to start fixing it in 3.0...

Hah! I knew it was something like that. It's never good to call a method just because it has magic "side effects"; ideally we'd have a non-kluge-y way to do thus... But there is no point in extracting the magic bits from the renderer code that (in essence) do the metadata refreshing. I completely agree that we can't solve this until 3.0.

Looking at the issues involved, I think it probably makes more sense to stuff this to 3.0 and see if we can clarify the role of the WikiContext a bit more. If WikiContext is going to be a Stripes ActionBeanContext in the future, we've got to make sure that is serializable too, of which I am not too sure about.

I do not completely understand what you mean here, but I do not think that WikiContext should be serializable. Today, it contains references to too several things that have time-dependent states (HttpServletRequests go out of scope; HttpSessions expire, etc.). In the future, it would be extremely difficult to make WikiContexts/ ActionBeans serializable because that would mean all of their properties would have to be serializable too. Not too hard with a concrete class, but probably impossible with an interface, which is what ActionBean is... would impede flexibility way too much.

Reply via email to