Attached object pointing to the same component twice add one of them twice
--------------------------------------------------------------------------

                 Key: MYFACES-3096
                 URL: https://issues.apache.org/jira/browse/MYFACES-3096
             Project: MyFaces Core
          Issue Type: Bug
          Components: JSR-314
    Affects Versions: 2.0.4
            Reporter: Leonardo Uribe
            Assignee: Leonardo Uribe


In this example:

                <testComposite:compositeActionTargetAttributeName id="cc1">
                    <f:actionListener for="submitButton" 
binding="#{bean.submitActionListener}"/>
                    <f:actionListener for="cancelButton" 
binding="#{bean.cancelActionListener}"/>
                </testComposite:compositeActionTargetAttributeName>

compositeActionTargetAttributeName

<cc:interface>
  <cc:actionSource name="submitButton" targets="submitCancelButton"/>
  <cc:actionSource name="cancelButton" targets="submitCancelButton"/>
</cc:interface>
<cc:implementation>
  <testComposite:actionTargetAttributeName id="submitCancelButton"/>
</cc:implementation>

actionTargetAttributeName

<cc:interface>
  <cc:actionSource name="submitButton"/>
  <cc:actionSource name="cancelButton" targets="cancelAction"/>
</cc:interface>
<cc:implementation>
  <h:commandButton id="submitButton" value="Submit Button"/>
  <h:commandButton id="cancelAction" value="Cancel Button"/>
</cc:implementation>

for one of the buttons a f:actionListener is added twice. The problem resides 
in this code:

                        if (UIComponent.isCompositeComponent(component))
                        {
                            // How we obtain the list of AttachedObjectHandler 
for
                            // the current composite component? It should be a 
component
                            // attribute or retrieved by a key inside 
component.getAttributes
                            // map. Since api does not specify any attribute, 
we suppose
                            // this is an implementation detail and it should 
be retrieved
                            // from component attribute map.
                            // But this is only the point of the iceberg, 
because we should
                            // define how we register attached object handlers 
in this list.
                            // ANS: see CompositeComponentResourceTagHandler.
                            // The current handler should be added to the list, 
to be chained.
                            // Note that the inner component should have a 
target with the same name
                            // as "for" attribute
                            mctx.addAttachedObjectHandler(component, 
currentHandler);
                            
                            List<AttachedObjectHandler> handlers = 
mctx.getAttachedObjectHandlers(component);
                            
                            retargetAttachedObjects(context, component, 
handlers);
                        }

The next time it is called call again retargetAttachedObjects, but for the 
other attached object, the previous one is still on the list. In 
CompositeComponentResourceTagHandler all handlers are removed to prevent apply 
them twice, but in this special case, it is necessary to remove it manually 
adding some code like this:
                            
                            handlers.remove(currentHandler);



--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to