ok, thank you, so I will not open a MyFaces issue on this but comment the spec 
issue instead.

Best regards,
Ganesh

Am 13.10.2010 11:15, schrieb Jakob Korherr:
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<[email protected]>:
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<[email protected]<mailto:[email protected]>>

    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<[email protected]
<mailto:[email protected]>>

        But anyhow, please open an issue for this. Thanks!

        Regards,
        Jakob

        2010/10/12 Jakob Korherr<[email protected]
<mailto:[email protected]>>:
         >  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<[email protected]<mailto:[email protected]>>:
         >>  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





--
"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

Reply via email to