use of javax.faces.view.EditableValueHolderAttachedObjectTarget in project primefaces by primefaces.
the class CompositeUtils method invokeOnDeepestEditableValueHolder.
/**
* Attention: This only supports cc:editableValueHolder which target a single component!
*
* @param context
* @param composite
* @param callback
*/
public static void invokeOnDeepestEditableValueHolder(FacesContext context, UIComponent composite, final ContextCallback callback) {
if (composite instanceof EditableValueHolder) {
callback.invokeContextCallback(context, composite);
return;
}
BeanInfo info = (BeanInfo) composite.getAttributes().get(UIComponent.BEANINFO_KEY);
List<AttachedObjectTarget> targets = (List<AttachedObjectTarget>) info.getBeanDescriptor().getValue(AttachedObjectTarget.ATTACHED_OBJECT_TARGETS_KEY);
if (targets != null) {
for (int i = 0; i < targets.size(); i++) {
AttachedObjectTarget target = targets.get(i);
if (target instanceof EditableValueHolderAttachedObjectTarget) {
List<UIComponent> childs = target.getTargets(composite);
if (childs == null || childs.isEmpty()) {
throw new FacesException("Cannot not resolve editableValueHolder target in composite component with id: \"" + composite.getClientId() + "\"");
}
if (childs.size() > 1) {
throw new FacesException("Only a single editableValueHolder target is supported in composite component with id: \"" + composite.getClientId() + "\"");
}
final UIComponent child = childs.get(0);
composite.invokeOnComponent(context, composite.getClientId(context), new ContextCallback() {
@Override
public void invokeContextCallback(FacesContext context, UIComponent target) {
if (isComposite(child)) {
invokeOnDeepestEditableValueHolder(context, child, callback);
} else {
callback.invokeContextCallback(context, child);
}
}
});
}
}
}
}
Aggregations