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