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);
}
}