[prev in list] [next in list] [prev in thread] [next in thread] 

List:       tapestry-user
Subject:    Re: T4: bug in expression cache?
From:       Marc van Kempen <marc () bowtie ! nl>
Date:       2009-10-26 8:39:08
Message-ID: FBA571E9-5A84-43A4-8FC2-93C95D053106 () bowtie ! nl
[Download RAW message or body]

Hi Andreas,

I've tried Tapestry 4.1.6, same result :( And my ognl version is 2.7.3.

Are you able to reproduce it with the code I sent?

Cheers,
Marc.

On Oct 24, 2009, at 21:03 , Andreas Andreou wrote:

> Hmm - don't see anything wrong... Are you using the latest ognl ...
> afaik it's 2.7.3
>
> Also, even though i dont remember (and kind find) any such bug report,
> how hard is
> it to try this with 4.1.6 ?
>
> On Sat, Oct 24, 2009 at 9:08 PM, Marc van Kempen <marc@bowtie.nl>  
> wrote:
>> Hi Andreas,
>>
>> When the application starts, first a page is displayed that  
>> contains the
>> HelpBalloonDialog component, hence it's script expression is  
>> compiled into
>> the expression cache. Then I open a page that uses the Dialog  
>> component, now
>> it seems to retrieve the compiled expression for the other script  
>> and poof!
>>
>> Here is the exception:
>>
>> [ +/- ] Exception: Unable to read OGNL expression '<parsed OGNL  
>> expression>'
>> of {component=$Dialog_142@b03d85e5[AssetsManagement/fileManager. 
>> $Dialog],
>> widget=dialog,
>> props={"bgColor":"black","bgOpacity": 
>> 0.4000000059604645 
>> ,"followScroll":true,"closeOnBackgroundClick":false,"blockDuration": 
>> 0,"lifeTime":0,"toggle":"fade","toggleDuration":150}}:
>> $Dialog_142 cannot be cast to  
>> nl.relate4u.pcc.contexthelp.HelpBalloonDialog
>> org.apache.hivemind.ApplicationRuntimeException
>> location:       classpath:/org/apache/tapestry/dojo/html/ 
>> Dialog.script, line
>> 36, column 43
>> 31               </unique>
>> 32           </body>
>> 33
>> 34           <initialization>
>> 35
>> tapestry.widget.synchronizeWidgetState("${component.clientId}",  
>> "Dialog",
>> ${props}, ${component.destroy});
>> 36               <if expression="component.hidden">
>> 37                   dojo.widget.byId("${component.clientId}").hide 
>> ();
>> 38               </if>
>> 39               <if-not expression="component.hidden">
>> 40                   dojo.widget.byId("${component.clientId}").show 
>> ();
>> 41               </if-not>
>>
>> [ +/- ] Exception: Unable to read OGNL expression '<parsed OGNL  
>> expression>'
>> of {component=$Dialog_142@b03d85e5[AssetsManagement/fileManager. 
>> $Dialog],
>> widget=dialog,
>> props={"bgColor":"black","bgOpacity": 
>> 0.4000000059604645 
>> ,"followScroll":true,"closeOnBackgroundClick":false,"blockDuration": 
>> 0,"lifeTime":0,"toggle":"fade","toggleDuration":150}}:
>> $Dialog_142 cannot be cast to  
>> nl.relate4u.pcc.contexthelp.HelpBalloonDialog
>>  [ +/- ] Exception: $Dialog_142 cannot be cast to
>> nl.relate4u.pcc.contexthelp.HelpBalloonDialog
>> java.lang.ClassCastException
>> Stack Trace:
>> $ASTChain_12487ac4bf9.get($ASTChain_12487ac4bf9.java)
>> org.apache.tapestry.services.impl.ExpressionEvaluatorImpl.read 
>> (ExpressionEvaluatorImpl.java:141)
>> org.apache.tapestry.services.impl.ExpressionEvaluatorImpl.read 
>> (ExpressionEvaluatorImpl.java:110)
>> $ExpressionEvaluator_12487ac4a68.read 
>> ($ExpressionEvaluator_12487ac4a68.java)
>> org.apache.tapestry.script.ScriptSessionImpl.evaluate 
>> (ScriptSessionImpl.java:86)
>> org.apache.tapestry.script.ScriptSessionImpl.evaluate 
>> (ScriptSessionImpl.java:91)
>> org.apache.tapestry.script.AbstractToken.evaluateBoolean 
>> (AbstractToken.java:102)
>> org.apache.tapestry.script.IfToken.evaluate(IfToken.java:43)
>> org.apache.tapestry.script.IfToken.write(IfToken.java:48)
>> org.apache.tapestry.script.AbstractToken.writeChildren 
>> (AbstractToken.java:71)
>> org.apache.tapestry.script.InitToken.write(InitToken.java:43)
>> org.apache.tapestry.script.AbstractToken.writeChildren 
>> (AbstractToken.java:71)
>> org.apache.tapestry.script.ParsedScript.execute(ParsedScript.java:82)
>> org.apache.tapestry.dojo.html.Dialog.renderWidget(Dialog.java:106)
>> (rest of stack trace omitted)
>> Here is the code for HelpBalloonDialog (the dialog component is the  
>> standard
>> Tapestry component included in the distribution):
>>
>> HelpBalloonDialog.java:
>>
>> package nl.relate4u.pcc.contexthelp;
>>
>> import java.util.HashMap;
>> import java.util.Map;
>>
>> import org.apache.tapestry.IMarkupWriter;
>> import org.apache.tapestry.IRequestCycle;
>> import org.apache.tapestry.IScript;
>> import org.apache.tapestry.TapestryUtils;
>> import org.apache.tapestry.dojo.AbstractWidget;
>> import org.apache.tapestry.services.ResponseBuilder;
>>
>> /**
>>  * Implementation of HelpBalloons, by calling custom javascript code.
>>  */
>> public abstract class HelpBalloonDialog extends AbstractWidget {
>>    public abstract boolean isHidden();
>>
>>    public abstract void setHidden(boolean hidden);
>>
>>    public abstract String getIconElementId();
>>
>>    public abstract void setIconElementId(String v);
>>
>>    public abstract void setTitle(String title);
>>
>>    public abstract String getTitle();
>>
>>    public void show() {
>>        setHidden(false);
>>    }
>>
>>    public void hide() {
>>        setHidden(true);
>>    }
>>
>>    /**
>>     * {@inheritDoc}
>>     */
>>    public void renderWidget(IMarkupWriter writer, IRequestCycle  
>> cycle) {
>>        if (!cycle.isRewinding()) {
>>            writer.begin(getTemplateTagName()); // use element  
>> specified
>>            renderIdAttribute(writer, cycle); // render id="" client  
>> id
>>            renderInformalParameters(writer, cycle);
>>        }
>>
>>        renderBody(writer, cycle);
>>
>>        if (!cycle.isRewinding()) writer.end();
>>
>>        if (!cycle.isRewinding()) {
>>            Map<String, Object> parms = new HashMap<String, Object>();
>>            parms.put("component", this);
>>
>>            getScript().execute(this, cycle,
>> TapestryUtils.getPageRenderSupport(cycle, this), parms);
>>
>>            if (isResizing()) {
>>                if
>> (!getResponseBuilder().isInitializationScriptAllowed(this)) {
>>                    getResponseBuilder().updateComponent(getId());
>>                }
>>
>>                getResponseBuilder().addScriptAfterInitialization 
>> (this,
>>                        "dojo.widget.byId('" + getClientId() +
>> "').checkSize();");
>>            }
>>        }
>>    }
>>
>>    public abstract ResponseBuilder getResponseBuilder();
>>
>>    // TODO left over from Dialog code, do we need the resize stuff??
>>    public abstract boolean isResizing();
>>
>>    public abstract void setResizing(boolean value);
>>
>>    /** injected. */
>>    public abstract IScript getScript();
>> }
>>
>> HelpBalloonDialog.jwc:
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <!DOCTYPE component-specification PUBLIC
>>        "-//Apache Software Foundation//Tapestry Specification 4.0// 
>> EN"
>>        "http://tapestry.apache.org/dtd/Tapestry_4_0.dtd">
>>
>> <component-specification
>> class="nl.relate4u.pcc.contexthelp.HelpBalloonDialog"
>>                         allow-body="yes" allow-informal- 
>> parameters="yes">
>>
>>    <description>
>>        Creates a HelpBalloon Dialog.
>>    </description>
>>
>>    <parameter name="hidden" default-value="ognl:true" />
>>        <parameter name="title" default-value="Help Title" />
>>        <parameter name="iconElementId" default-value="unknown" />
>>
>>    <inject property="script" type="script"
>> object="HelpBalloonDialog.script"/>
>>
>> </component-specification>
>>
>> HelpBalloonDialog.script:
>>
>> <?xml version="1.0"?>
>> <!DOCTYPE script PUBLIC
>>        "-//Apache Software Foundation//Tapestry Script Specification
>> 3.0//EN"
>>        "http://tapestry.apache.org/dtd/Script_3_0.dtd">
>> <script>
>>    <input-symbol key="component" required="yes" />
>>
>>    <initialization>
>>        <if expression="component.hidden">
>>            if (helpBalloonPlaceHolder) {
>>                helpBalloonPlaceHolder.hide();
>>                /*
>>                 * remove the help balloon dialog from the balloon  
>> and put it
>> back
>>                 * under the helpBalloonUpdateArea (which is not  
>> visible)
>>                 */
>>                var helpBalloonDialog =
>> document.getElementById('${component.clientId}');
>>                helpBalloonDialog.parentNode.removeChild 
>> (helpBalloonDialog);
>>
>>  document.getElementById('helpBalloonUpdateArea').appendChild 
>> (helpBalloonDialog);
>>                helpBalloonPlaceHolder = null;
>>            }
>>        </if>
>>        <if-not expression="component.hidden">
>>            /*
>>             * The help balloon object will move the component from  
>> the
>>             * helpBalloonUpdateArea to under its own element  
>> hierarchy,
>>             * when we hide the balloon we move it back again, see  
>> above.
>>             */
>>                    helpBalloonPlaceHolder = new HelpBalloon({
>>                        title: "${component.title}",
>>                        content: '${component.clientId}',
>>                        icon:
>> document.getElementById('${component.iconElementId}'),
>>                        returnElement: true,
>>                        anchorPosition: 'top right'
>>                });
>>                        helpBalloonPlaceHolder.show();
>>        </if-not>
>>    </initialization>
>> </script>
>>
>>
>> On Oct 24, 2009, at 16:21 , Andreas Andreou wrote:
>>
>>> I can't really see what's going on.. is it possible to include the
>>> exception and/or
>>> some related code?
>>>
>>> On Sat, Oct 24, 2009 at 2:44 PM, Marc van Kempen <marc@bowtie.nl>  
>>> wrote:
>>>>
>>>> Hi,
>>>>
>>>> I have copied and changed the Dialog component in my project  
>>>> (Tapestry
>>>> 4.1.5) in order to create a HelpBalloon popup. This gives me the
>>>> following
>>>> files that I've added to my project:
>>>>
>>>> HelpBalloonDialog.java
>>>> HelpBalloonDialog.jwc
>>>> HelpBalloonDialog.script
>>>>
>>>>  I kept the condition checking the same as in Dialog.script, i.e.:
>>>>
>>>> <script>
>>>>   <input-symbol key="component" required="yes" />
>>>>
>>>>   <initialization>
>>>>       <if expression="component.hidden">
>>>>               do_stuff();
>>>>       </if>
>>>>       <if-not expression="component.hidden">
>>>>               do_different_stuff();
>>>>       </if-not>
>>>>   </initialization>
>>>> </script>
>>>>
>>>> This is essentially the same construction as Dialog.script uses,  
>>>> and most
>>>> importantly the expression string "component.hidden" is exactly  
>>>> the same.
>>>> Requesting a page however where Dialog is used gives me a cast  
>>>> exception
>>>> when it tries to use the cached compiled expression that it finds.
>>>> Changing
>>>> the name "component" to something else makes the problem go away.
>>>>
>>>> Now, looking at the code I'm seeing the following:
>>>>
>>>> The ExpressionCache uses the symbol map in ScriptSessionImpl as  
>>>> its key,
>>>> so
>>>> therefore the cache should be local to a script and I should be  
>>>> allowed
>>>> to
>>>> use the same expression in different scripts.
>>>>
>>>> Is this the intended behaviour, am I missing something or am I  
>>>> looking at
>>>> a
>>>> bug?
>>>>
>>>> Kind regards,
>>>> Marc van Kempen.
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Andreas Andreou - andyhot@apache.org - http://blog.andyhot.gr
>>> Tapestry / Tacos developer
>>> Open Source / JEE Consulting
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>
>>
>>
>
>
>
> -- 
> Andreas Andreou - andyhot@apache.org - http://blog.andyhot.gr
> Tapestry / Tacos developer
> Open Source / JEE Consulting
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic