Hi Ganesh,

Sorry, I was too fast in writing the answer. It works if you're using
f:actionListener, but it does not work correctly, if you're using a
parameter like action or actionListener (this is the related spec
issue).

Regards,
Jakob

2010/10/13 Ganesh <gan...@j4fry.org>:
> This is cool, thank you for sending the fixed example! How comes this works,
> though
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=755
> is retargeted to 2.2? Do you have one more in your magic box for actions or
> does the spec issue remain valid here? If I do this:
>
>        <!-- INTERFACE -->
>        <composite:interface>
>                <composite:attribute name="value"/>
>                <composite:attribute name="action"
> method-signature="java.lang.String action()" targets="button1"/>
>        </composite:interface>
>
>        <!-- IMPLEMENTATION -->
>        <composite:implementation>
>                <level2:button id="button1" value="#{cc.attrs.value}"/>
>        </composite:implementation>
>
> then calling the page gives me:
>
> java.lang.ClassCastException: javax.faces.component.UINamingContainer cannot
> be cast to javax.faces.component.ActionSource2
>
> though level2:button is an ActionSource:
>
>        <!-- INTERFACE -->
>        <composite:interface>
>                <composite:attribute name="value"/>
>                <composite:attribute name="action"
> method-signature="java.lang.String action()" targets="button2"/>
>        </composite:interface>
>
>        <!-- IMPLEMENTATION -->
>        <composite:implementation>
>                <h:commandButton id="button2" value="#{cc.attrs.value}"/>
>        </composite:implementation>
>
> but probably not an ActionSource2 :-(
>
> Best regards,
> Ganesh
>
> Am 12.10.2010 19:24, schrieb Leonardo Uribe:
>>
>> Hi
>>
>> I tried your example and work in this way:
>>
>> test page calls a composite component in level 1:
>>
>>        xmlns:level1="http://java.sun.com/jsf/composite/level1";
>>
>> <level1:button value="test1">
>> <f:actionListener for="button1" binding="#{myBean.action1}" />
>> </level1:button>
>>
>> level1 button passes the action listener on to level 2:
>>
>>        xmlns:level2="http://java.sun.com/jsf/composite/level2";
>>
>> <!-- INTERFACE -->
>> <composite:interface>
>> <composite:attribute name="value"/>
>> <composite:actionSource name="button1" targets="button1" /> <!-- "targets"
>> here is optional -->
>> </composite:interface>
>>
>> <!-- IMPLEMENTATION -->
>> <composite:implementation>
>> <level2:button id="button1" value="#{cc.attrs.value}"/>
>> </composite:implementation>
>>
>>   level 2 finally consumes the action:
>>
>> <!-- INTERFACE -->
>> <composite:interface>
>> <composite:attribute name="value"/>
>> <composite:actionSource name="button1" targets="button2" />
>> </composite:interface>
>>
>> <!-- IMPLEMENTATION -->
>> <composite:implementation>
>> <h:commandButton id="button2" value="#{cc.attrs.value}" />
>> </composite:implementation>
>>
>> regards,
>>
>> Leonardo
>>
>> 2010/10/12 Leonardo Uribe <lu4...@gmail.com <mailto:lu4...@gmail.com>>
>>
>>    Hi
>>
>>    I remember this one. Fortunately, MyFaces has many, many tests for
>> composite
>>    components. It also has a test for this specific issue and it works
>> well:
>>
>>    testCompositeActionSource.xhtml
>>
>>    <h:form id="testForm1">
>>    <testComposite:compositeActionSource>
>>    <f:actionListener for="button2"
>> binding="#{helloWorldBean.actionListener}"/>
>>    </testComposite:compositeActionSource>
>>    </h:form>
>>
>>    compositeActionSource.xhtml
>>
>>    <composite:interface>
>>    <composite:actionSource name="button2" targets="button3"/>
>>    </composite:interface>
>>    <composite:implementation>
>>    <testComposite:simpleActionSource id="button3" >
>>    <f:actionListener for="button"
>> binding="#{helloWorldBean.actionListener}"/>
>>    </testComposite:simpleActionSource>
>>    </composite:implementation>
>>
>>    simpleActionSource.xhtml
>>
>>    <composite:interface>
>>    <composite:actionSource name="button"/>
>>    <composite:actionSource name="button2" targets="button"/>
>>    </composite:interface>
>>    <composite:implementation>
>>    <h:commandButton id="button" value="Press me!" />
>>    </composite:implementation>
>>
>>    The button finally should have two actionListener. Look the attribute
>> "targets".
>>    Try set it on your example. It should work without problem.
>>
>>    regards,
>>
>>    Leonardo Uribe
>>
>>
>>    2010/10/12 Jakob Korherr <jakob.korh...@gmail.com
>> <mailto:jakob.korh...@gmail.com>>
>>
>>        But anyhow, please open an issue for this. Thanks!
>>
>>        Regards,
>>        Jakob
>>
>>        2010/10/12 Jakob Korherr <jakob.korh...@gmail.com
>> <mailto:jakob.korh...@gmail.com>>:
>>         > Hi Ganesh,
>>         >
>>         > This is a known problem of the JSF 2.0 spec, see [1]. Sadly it
>> was
>>         > (re-)targeted for 2.2.
>>         >
>>         > The problem is that when the ation listener is retargeted (from
>> the
>>         > composite component to the inner (implementation) component), it
>>         > cannot be retargeted to another composite component, because
>> this one
>>         > does not implement ActionSource2. IMO we could try to implement
>> a
>>         > working solution already in MyFaces 2.0.x, but I don't know if
>> this
>>         > stuff is tested by the TCK..
>>         >
>>         > Regards,
>>         > Jakob
>>         >
>>         > [1]
>> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=755
>>         >
>>         > 2010/10/12 Ganesh <gan...@j4fry.org <mailto:gan...@j4fry.org>>:
>>         >> Hi,
>>         >>
>>         >> If my test page calls a composite component in level 1:
>>         >>
>>         >>        xmlns:level1="http://java.sun.com/jsf/composite/level1";
>>         >>
>>         >> <level1:button value="test1">
>>         >> <f:actionListener for="button1" binding="#{myBean.action1}"
>>         >> />
>>         >> </level1:button>
>>         >>
>>         >> where level1 button passes the action listener on to level 2:
>>         >>
>>         >>        xmlns:level2="http://java.sun.com/jsf/composite/level2";
>>         >>
>>         >> <!-- INTERFACE -->
>>         >> <composite:interface>
>>         >> <composite:attribute name="value"/>
>>         >> <composite:actionSource name="button1" />
>>         >> </composite:interface>
>>         >>
>>         >> <!-- IMPLEMENTATION -->
>>         >> <composite:implementation>
>>         >> <level2:button id="button1" value="#{cc.attrs.value}"/>
>>         >> </composite:implementation>
>>         >>
>>         >> and level 2 finally consumes the action:
>>         >>
>>         >> <!-- INTERFACE -->
>>         >> <composite:interface>
>>         >> <composite:attribute name="value"/>
>>         >> <composite:actionSource name="button2" />
>>         >> </composite:interface>
>>         >>
>>         >> <!-- IMPLEMENTATION -->
>>         >> <composite:implementation>
>>         >> <h:commandButton id="button2" value="#{cc.attrs.value}" />
>>         >> </composite:implementation>
>>         >>
>>         >> Shouldn't this call the ActionListener returned by
>> getAction1()? In fact it
>>         >> doesn't, if you agree that it should I will open an issue.
>>         >>
>>         >> Best regards,
>>         >> Ganesh
>>         >>
>>         >
>>         >
>>         >
>>         > --
>>         > Jakob Korherr
>>         >
>>         > blog: http://www.jakobk.com
>>         > twitter: http://twitter.com/jakobkorherr
>>         > work: http://www.irian.at
>>         >
>>
>>
>>
>>        --
>>        Jakob Korherr
>>
>>        blog: http://www.jakobk.com
>>        twitter: http://twitter.com/jakobkorherr
>>        work: http://www.irian.at
>>
>>
>>
>
> --
> "There are two kinds of people in the world, those who believe there are two
> kinds of people and those who don't."
> — Robert Benchley
>



-- 
Jakob Korherr

blog: http://www.jakobk.com
twitter: http://twitter.com/jakobkorherr
work: http://www.irian.at

Reply via email to