cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Christofer Dutz <>
Subject Re: SuggestionLists and JavaFlow
Date Fri, 11 May 2007 07:04:20 GMT

after another day of debuging, I was able to track down the main problem:
the JavaInterpreter fetches the WebContinuation and uses this to create 
a new cocoon-flow-context each time it is executed.
The FormInstance is bound to this object and is used for executing the 
display pipeline. After this the temporary Context is destroyed.

In order to make my "SaveTheData" Pipeline work I had to change:
            // Save the modified userdata.
            // Manually attach the form to the request.
            VarMap bizData = new VarMap();
            bizData.add(FormsPipelineConfig.CFORMSKEY, form.getModel());
            Locale locale = java.util.Locale.getDefault();;
            bizData.add("locale", locale);

            // Save the modified userdata.
            sendPage("save/user_db", bizData);
Since the JavaFlow implementation wouldn't make the FormInstance 
available automatically.

Unfortunately this doesn't solve my SuggestionListProblem. My guess and 
my next try would be, to manually attach the FormInstance to the 
WebContinuation object, since this is not destroyed.

Any suggestions or objections?


Christofer Dutz schrieb:
> Hi Thorsten,
> Well I think the suggestion-list content must be served by a different 
> thread. Here is my scenario in a little more detail:
> I created a patch to make suggestion-lists support on-value-changed 
> events and they seem to work nicely. When debuging the FormInstance 
> class I can see how the "cocoon-ajax-continue" loop is executed every 
> time the fields value changes. Usually the client side suggestion-list 
> javascript should load the result of a cocoon pipeline with the exact 
> name "_cocoon/forms/suggest" into an iframe. This Iframe contains the 
> suggestion-list content. Since my suggestions-lists are 
> context-sensitive (they contain different input for different 
> form-states, I need to get my hands on the FormInstance object of the 
> parent frames pipeline. This was no problem using the code of the 
> SuggestionListGenerator, but when using JavaFlow this doen't work 
> anymore :(
> Here the code that puts everything into the continuation (from 
> AbstractContunable sendPageAndWait)
> FlowHelper.setContextObject(ContextHelper.getObjectModel(context.getAvalonContext()),

> bizdata);
> If I add the following watch expression in the Debugger directly after 
> this, I can see that the FormInstance is there
> FlowHelper.getContextObject(ContextHelper.getObjectModel(context.getAvalonContext()))

> One of my counterparts is (A second JavaFlow ... didn't expect this to 
> work, because of the way getContext is implemented):
>        VarMap bizData = (VarMap) 
> FlowHelper.getContextObject(ContextHelper.getObjectModel(context.getAvalonContext()));

> The other one is (A Generator using the ContinuationsManager to lookup 
> a WebContinuation based upon the continuation-id)
>    public void setup(SourceResolver resolver, Map objectModel, String 
> src, Parameters par) throws ProcessingException, SAXException, 
> IOException {
>        super.setup(resolver, objectModel, src, par);
>        Request req = ObjectModelHelper.getRequest(objectModel);
>        String continuationId = par.getParameter("continuation-id", 
> req.getParameter("continuation-id"));
>        // The interpreter id is the sitemap's URI
>        String interpreterId = 
> SitemapParameters.getLocation(parameters).getURI();
>          wk = this.contManager.lookupWebContinuation(continuationId, 
> interpreterId);
>        if (wk == null || wk.disposed()) {
>            throw new InvalidContinuationException("Cannot get 
> continuation for suggestion list");
>        }
>        Continuation continuation = (Continuation) wk.getContinuation();
>        ContinuationContext context = (ContinuationContext) 
> continuation.getContext();
>        VarMap bizData = (VarMap) 
> FlowHelper.getContextObject(ContextHelper.getObjectModel(context.getAvalonContext()));

>        Form form = (Form) bizData.getMap().get("CocoonFormsInstance");
>        if (form == null) {
>            throw new ProcessingException("No form is attached to the 
> continuation");
>        }
>    }
> unfortunately bizData is null in both cases since there is no 
> "cocoon.flow.context" inside the object-model.
> Do I really have to store the form instances in the Session as a 
> workaround? Would really like to avoid this, since I have to do all 
> the housekeeping :(
> Am I looking up something different? Is the thing the 
> ContinuationManager is returning really the Continuation I want?
> Chris
> Torsten Curdt schrieb:
>> On 09.05.2007, at 15:56, Christofer Dutz wrote:
>>> I am currently having some problems with JavaFlow and SuggestionLists.
>>> My application used to generate dynamic suggestion lists in the 
>>> "_cocoon/forms/suggest" pipeline.
>>> Unfortunately the FormsGenerator, SuggestionListGenerator, 
>>> JXGenerator and Transformer and my custom Generator seem to be 
>>> unable to get the form instance.
>>> I think this might be a result of the way JavaFlow deals with 
>>> Continuations (GetContext beeing implemented using 
>>> Thread.currentThread()) as the SuggestionList pipeline is served by 
>>> a different Thread.
>> It's been a while and I would have to dig into the code ....but are 
>> you sure the other pipeline is served by a different thread?
>> A known limitation is when you use a continuation in one pipeline and 
>> use the cocoon protocol to a pipeline that also provides creates 
>> continuations. That aint work as you (atm) only can have one 
>> continuation per thread. (Not that complicated to change though)

View raw message