Package er.extensions.components.conditionals

Source Code of er.extensions.components.conditionals.ERXWOConditional

package er.extensions.components.conditionals;

import com.webobjects.appserver.WOActionResults;
import com.webobjects.appserver.WOAssociation;
import com.webobjects.appserver.WOComponent;
import com.webobjects.appserver.WOContext;
import com.webobjects.appserver.WOElement;
import com.webobjects.appserver.WORequest;
import com.webobjects.appserver.WOResponse;
import com.webobjects.appserver._private.WODynamicElementCreationException;
import com.webobjects.appserver._private.WODynamicGroup;
import com.webobjects.foundation.NSDictionary;

import er.extensions.appserver.ERXWOContext;

/**
* ERXWOConditional behaves just like WOConditional except that it tracks its condition state for use with ERXElse.
* Also makes it easier to override by implementing {@link #meetsConditionInComponent(WOComponent)} and {@link #pullAssociations(NSDictionary)}.
* @author mschrag
* @author ak
* @binding condition
* @binding negate
*/
public class ERXWOConditional extends WODynamicGroup {
  public static final String LAST_CONDITION_KEY = "er.extensions.ERXWOConditional.lastCondition";

  protected WOAssociation _condition;
  private WOAssociation _negate;

  public static void setLastCondition(Boolean lastCondition) {
    if (lastCondition == null) {
      ERXWOContext.contextDictionary().removeObjectForKey(ERXWOConditional.LAST_CONDITION_KEY);
    }
    else {
      ERXWOContext.contextDictionary().setObjectForKey(lastCondition, ERXWOConditional.LAST_CONDITION_KEY);
    }
  }

  public static Boolean lastCondition() {
    return (Boolean) ERXWOContext.contextDictionary().objectForKey(ERXWOConditional.LAST_CONDITION_KEY);
  }

  /**
   * Override this to return true when your condition is met.
   */
  protected boolean conditionInComponent(WOComponent wocomponent) {  
    boolean condition = _condition.booleanValueInComponent(wocomponent);
    return condition;
  }

  protected final boolean meetsConditionInComponent(WOComponent wocomponent) {  
    boolean condition = conditionInComponent(wocomponent);

    boolean negate = false;
    if (_negate != null) {
      negate = _negate.booleanValueInComponent(wocomponent);
    }

    return condition && !negate || !condition && negate;
  }

  /**
   * Override to pull the associations for your condition. The
   * <code>negate</code> has already been pulled, so don't call super, as you
   * will get an IllegalStateException because <code>condition</code> isn't
   * bound.
   */
  protected void pullAssociations(NSDictionary<String, ? extends WOAssociation> nsdictionary) {

    _condition =nsdictionary.objectForKey("condition");

    if (_condition == null && getClass() == ERXWOConditional.class) {
      throw new WODynamicElementCreationException("<" + getClass().getName() + "> Missing 'condition' attribute in initialization.");
    }

  }

  public ERXWOConditional(String name, NSDictionary dict, WOElement element) {
    super(null, null, element);
    _negate = (WOAssociation) dict.objectForKey("negate");
    pullAssociations(dict);
  }

  @Override
  public String toString() {
    return "<WOConditional :  condition: " + (_condition == null ? "null" : _condition.toString()) + " negate: " + (_negate == null ? "null" : _negate.toString()) + ">";
  }

  @Override
  public void takeValuesFromRequest(WORequest worequest, WOContext wocontext) {
    ERXWOConditional.setLastCondition(Boolean.FALSE);
    if (meetsConditionInComponent(wocontext.component())) {
      super.takeValuesFromRequest(worequest, wocontext);
    }
  }

  @Override
  public void takeChildrenValuesFromRequest(WORequest worequest, WOContext wocontext) {
    ERXWOConditional.setLastCondition(null);
    super.takeChildrenValuesFromRequest(worequest, wocontext);
    ERXWOConditional.setLastCondition(Boolean.TRUE);
  }

  @Override
  public WOActionResults invokeAction(WORequest worequest, WOContext wocontext) {
    ERXWOConditional.setLastCondition(Boolean.FALSE);
    if (meetsConditionInComponent(wocontext.component())) {
      return super.invokeAction(worequest, wocontext);
    }
    return null;
  }

  @Override
  public WOActionResults invokeChildrenAction(WORequest worequest, WOContext wocontext) {
    ERXWOConditional.setLastCondition(null);
    WOActionResults results = super.invokeChildrenAction(worequest, wocontext);
    ERXWOConditional.setLastCondition(Boolean.TRUE);
    return results;
  }

  @Override
  public void appendToResponse(WOResponse woresponse, WOContext wocontext) {
    ERXWOConditional.setLastCondition(Boolean.FALSE);
    if (meetsConditionInComponent(wocontext.component())) {
      appendChildrenToResponse(woresponse, wocontext);
    }
  }

  @Override
  public void appendChildrenToResponse(WOResponse woresponse, WOContext wocontext) {
    ERXWOConditional.setLastCondition(null);
    super.appendChildrenToResponse(woresponse, wocontext);
    ERXWOConditional.setLastCondition(Boolean.TRUE);
  }
}
TOP

Related Classes of er.extensions.components.conditionals.ERXWOConditional

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.