org.ajax4jsf.component.AjaxRegionBrige.java Source code

Java tutorial

Introduction

Here is the source code for org.ajax4jsf.component.AjaxRegionBrige.java

Source

/**
 * License Agreement.
 *
 * Rich Faces - Natural Ajax for Java Server Faces (JSF)
 *
 * Copyright (C) 2007 Exadel, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License version 2.1 as published by the Free Software Foundation.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 */

package org.ajax4jsf.component;

import javax.el.ELContext;
import javax.el.MethodExpression;
import javax.el.ValueExpression;
import javax.faces.application.Application;
import javax.faces.component.StateHolder;
import javax.faces.component.UIComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.FacesEvent;

import org.ajax4jsf.Messages;
import org.ajax4jsf.event.AjaxEvent;
import org.ajax4jsf.event.AjaxListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author shura
 * 
 * Brige design pattern for any UIComponent append support ajax partial rendering. For AJAX request, apply
 * ActionListeniers, construct list of components for render - by direct setting
 * from Listenier or Components bean methods. 
 * For use in concrete component, in constructor must be instantiated to class field as :
 * private AjaxRegionBrige brige;
 * ....
 * Constructor(){ 
 * brige = new AjaxRegionBrige(this);
 * }.
 * And delegate all brige public methods. 
 * @See <code>AJAXConatiner</code> interface , or from configuration - by
 *      <ajax:forupdate>jsp tag's of this or nested components, or from all
 *      <code>UIForm</code> components instances with <code>isSubmitted</code>
 *      set to <code>true</code>
 *  
 */
public class AjaxRegionBrige implements AjaxContainerBase, StateHolder {

    // Private Fields
    private static final Log log = LogFactory.getLog(AjaxRegionBrige.class);

    /**
     * Listener for call on Ajax Requests
     */
    private MethodExpression ajaxListener = null;

    /**
     * Flag for immediate call listeners 
     */
    private boolean immediate = false;
    private boolean immediateSet = false;

    private boolean selfRendered = false;
    private boolean selfRenderedSet = false;

    private boolean transientFlag = false;

    private UIComponent component;

    private boolean submitted = false;

    // Interface implementation

    /**
    * @param component
    */
    public AjaxRegionBrige(UIComponent component) {
        this.component = component;
    }

    /*
      * (non-Javadoc)
      * 
      * @see org.ajax4jsf.components.custom.ajax.AjaxContainer#getAjaxListener()
      */
    public MethodExpression getAjaxListener() {
        return this.ajaxListener;
    }

    /*
     * (non-Javadoc)
     * 
     * @see ogr.apache.myfaces.custom.ajax.AjaxContainer#setAjaxListener(javax.faces.el.MethodBinding)
     */
    public void setAjaxListener(MethodExpression ajaxListener) {
        // 
        if (log.isDebugEnabled()) {
            log.debug(Messages.getMessage(Messages.SET_AJAX_LISTENER, ajaxListener.getExpressionString()));
        }
        this.ajaxListener = ajaxListener;
    }

    /*
     * (non-Javadoc)
     * 
     * @see ogr.apache.myfaces.custom.ajax.AjaxContainer#isImmediate()
     */
    public boolean isImmediate() {
        if (this.immediateSet) {
            return (this.immediate);
        }
        ValueExpression vb = component.getValueExpression("immediate");
        if (vb != null) {
            return (Boolean.TRUE.equals(vb.getValue(FacesContext.getCurrentInstance().getELContext())));
        } else {
            return (this.immediate);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see ogr.apache.myfaces.custom.ajax.AjaxContainer#setImmediate(boolean)
     */
    public void setImmediate(boolean immediate) {
        if (immediate != this.immediate) {
            this.immediate = immediate;
        }
        this.immediateSet = true;

    }

    /* (non-Javadoc)
    * @see org.ajax4jsf.framework.ajax.AjaxContainer#isSelfRendered()
    */
    public boolean isSelfRendered() {
        if (this.selfRenderedSet) {
            return (this.selfRendered);
        }
        ValueExpression vb = component.getValueExpression("selfRendered");
        if (vb != null) {
            return (Boolean.TRUE.equals(vb.getValue(FacesContext.getCurrentInstance().getELContext())));
        } else {
            return (this.selfRendered);
        }
    }

    /* (non-Javadoc)
     * @see org.ajax4jsf.framework.ajax.AjaxContainer#setSelfRendered(boolean)
     */
    public void setSelfRendered(boolean selfRendered) {
        this.selfRendered = selfRendered;
        this.selfRenderedSet = true;
    }

    /**
      * @return Returns the submitted.
      */
    public boolean isSubmitted() {
        return this.submitted;
    }

    /**
    * @param submitted The submitted to set.
    */
    public void setSubmitted(boolean submitted) {
        // Important - decoder must set submitted AFTER setAjaxRequest !!!
        if (log.isDebugEnabled() && submitted && (!isSubmitted())) {
            log.debug(Messages.getMessage(Messages.SUBMITTED_AJAX_REQUEST));
        }
        this.submitted = submitted;
    }

    /**
     * <p>
     * In addition to to the default {@link UIComponent#broadcast}processing,
     * pass the {@link AjaxEvent}being broadcast to the method referenced by
     * <code>AjaxListener</code> (if any), and to the default
     * {@link AjaxListener}registered on the {@link Application}.
     * </p>
     * 
     * @param event
     *            {@link FacesEvent}to be broadcast
     * 
     * @exception AbortProcessingException
     *                Signal the JavaServer Faces implementation that no further
     *                processing on the current event should be performed
     * @exception IllegalArgumentException
     *                if the implementation class of this {@link FacesEvent}is
     *                not supported by this component
     * @exception NullPointerException
     *                if <code>event</code> is <code>null</code>
     */
    public void broadcast(FacesEvent event) throws AbortProcessingException {

        // Perform standard superclass processing
        // component.broadcast(event);

        if (event instanceof AjaxEvent) {
            if (log.isDebugEnabled()) {
                log.debug(Messages.getMessage(Messages.SEND_EVENT_TO_AJAX_LISTENER, component.getId()));
            }

            // Notify the specified action listener method (if any)
            MethodExpression mb = getAjaxListener();
            if (mb != null) {
                FacesContext context = FacesContext.getCurrentInstance();
                ELContext elContext = context.getELContext();
                mb.invoke(elContext, new Object[] { event });
            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see javax.faces.component.StateHolder#restoreState(javax.faces.context.FacesContext,
     *      java.lang.Object)
     */
    public void restoreState(FacesContext context, Object state) {
        if (log.isDebugEnabled()) {
            log.debug(Messages.getMessage(Messages.RESTORE_AJAX_COMPONENT_STATE, component.getId()));
        }
        Object values[] = (Object[]) state;
        //       super.restoreState(context, values[0]);
        this.immediate = ((Boolean) values[0]).booleanValue();
        this.immediateSet = ((Boolean) values[1]).booleanValue();
        this.ajaxListener = (MethodExpression) UIComponentBase.restoreAttachedState(context, values[2]);
        this.selfRendered = ((Boolean) values[3]).booleanValue();
        this.selfRenderedSet = ((Boolean) values[4]).booleanValue();
    }

    /*
     * (non-Javadoc)
     * 
     * @see javax.faces.component.StateHolder#saveState(javax.faces.context.FacesContext)
     */
    public Object saveState(FacesContext context) {
        // 
        if (log.isDebugEnabled()) {
            log.debug(Messages.getMessage(Messages.SAVE_AJAX_COMPONENT_STATE, component.getId()));
        }
        Object[] values = new Object[5];
        //       values[0] = super.saveState(context);
        values[0] = Boolean.valueOf(immediate);
        values[1] = Boolean.valueOf(immediateSet);
        values[2] = UIComponentBase.saveAttachedState(context, ajaxListener);
        values[3] = Boolean.valueOf(selfRendered);
        values[4] = Boolean.valueOf(selfRenderedSet);
        return values;
    }

    public boolean isTransient() {
        return transientFlag;
    }

    public void setTransient(boolean transientFlag) {
        this.transientFlag = transientFlag;
    }

}