All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.larmic.butterfaces.resolver.AjaxRequest Maven / Gradle / Ivy

package de.larmic.butterfaces.resolver;

import de.larmic.butterfaces.component.partrenderer.StringUtils;

import javax.faces.component.UIComponentBase;
import javax.faces.component.behavior.AjaxBehavior;
import javax.faces.component.behavior.ClientBehavior;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * First try to create a jsf.ajax.request factory. I think there is a nicer way to implement this but up to now it works.
 */
public class AjaxRequest {

    private final List renderIds;
    private final UIComponentBase component;
    private final String onevent;
    private final String eventName;

    public AjaxRequest(final UIComponentBase component, final String event) {
        this(component, event, null);
    }

    public AjaxRequest(final UIComponentBase component, final String event, final String onEvent) {
        this.renderIds = this.createRefreshIds(component, event);
        this.component = component;
        this.onevent = onEvent;
        this.eventName = event;
    }

    public String createJavaScriptCall() {
        return this.createJavaScriptCall(eventName);
    }

    public String createJavaScriptCall(final String customEventName) {
        return this.createJavaScriptCall(customEventName, onevent);
    }

    public String createJavaScriptCall(final String customEventName, final String customOnEvent) {
        final String render = this.createRender(this.renderIds);

        if (StringUtils.isEmpty(customOnEvent)) {
            return "jsf.ajax.request('" + component.getClientId() + "','" + customEventName + "',{" + createRenderPart(render) + "'javax.faces.behavior.event':'" + customEventName + "'});";
        }

        return "jsf.ajax.request('" + component.getClientId() + "','" + customEventName + "',{" + createRenderPart(render) + "onevent: " + customOnEvent + ", 'javax.faces.behavior.event':'" + customEventName + "'});";
    }

    public String createJavaScriptCall(final String customEventName, final boolean disableElements) {
        if (disableElements && !renderIds.isEmpty()) {
            final StringBuilder onEvent = new StringBuilder("(function(data) { butter.ajax.disableElementsOnRequest(data, [");

            final Iterator iterator = renderIds.iterator();

            while (iterator.hasNext()) {
                final String renderId = iterator.next();
                onEvent.append("'");
                onEvent.append(renderId);
                onEvent.append("'");

                if (iterator.hasNext()) {
                    onEvent.append(", ");
                }
            }

            onEvent.append("]) })");

            return this.createJavaScriptCall(customEventName, onEvent.toString());
        }

        return this.createJavaScriptCall(customEventName, null);
    }

    private String createRenderPart(final String render) {
        if (StringUtils.isNotEmpty(render)) {
            return "render: '" + render + "', ";
        }

        return "";
    }

    public List getRenderIds() {
        return renderIds;
    }

    private String createRender(final List additionalRenderIds) {
        final StringBuilder render = new StringBuilder();

        if (!additionalRenderIds.isEmpty()) {
            final Iterator iterator = additionalRenderIds.iterator();

            while (iterator.hasNext()) {
                render.append(iterator.next());

                if (iterator.hasNext()) {
                    render.append(" ");
                }
            }
        }

        return render.toString();
    }

    private List createRefreshIds(final UIComponentBase component, final String eventName) {
        final List idsToRender = new ArrayList<>();
        final Map> behaviors = component.getClientBehaviors();
        final List refreshBehaviors = behaviors.get(eventName);

        if (refreshBehaviors == null) {
            throw new IllegalArgumentException("Ajax event '" + eventName + "' not found on component '" + component.getClientId() + "'.");
        }

        boolean enabledAjaxEventFound = false;

        if (!refreshBehaviors.isEmpty()) {
            for (ClientBehavior refreshBehavior : refreshBehaviors) {
                if (refreshBehavior instanceof AjaxBehavior) {
                    final AjaxBehavior ajaxBehavior = (AjaxBehavior) refreshBehavior;

                    if (!ajaxBehavior.isDisabled()) {
                        if (ajaxBehavior.getRender() != null && !ajaxBehavior.getRender().isEmpty()) {
                            for (String singleRender : ajaxBehavior.getRender()) {
                                idsToRender.add(singleRender);
                            }
                        }

                        enabledAjaxEventFound = true;
                    }
                }
            }
        }

        if (!enabledAjaxEventFound) {
            throw new IllegalStateException("Ajax event '" + eventName + "' on component '" + component.getClientId() + "' is disabled.");
        }

        return idsToRender;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy