package er.extensions.components.conditionals;
import java.util.Enumeration;
import com.webobjects.appserver.WOActionResults;
import com.webobjects.appserver.WOAssociation;
import com.webobjects.appserver.WOContext;
import com.webobjects.appserver.WODynamicElement;
import com.webobjects.appserver.WOElement;
import com.webobjects.appserver.WORequest;
import com.webobjects.appserver.WOResponse;
import com.webobjects.appserver._private.WODynamicGroup;
import com.webobjects.appserver._private.WOHTMLBareString;
import com.webobjects.foundation.NSDictionary;
import com.webobjects.foundation.NSMutableDictionary;
/**
* Adds a "multiple if" element to the WO templates. You'd use them to wrap "ERXWOCase" elements with
* their case bound to a value.
<pre><code>
==========================
Example.wo/Example.html (modern syntax)
==========================
<wo:ERXWOSwitch case="$case">
<wo:ERXWOCase case="caseOne">
Case One!
</wo:ERXWOCase>
<wo:ERXWOCase case="caseTwo">
Case Two!
</wo:ERXWOCase>
<wo:ERXWOCase case="default">
OTHER
</wo:ERXWOCase>
</wo:ERXWOSwitch>
==========================
Example.wo/Example.html (traditional syntax, with wod below)
==========================
<webobject name=Switch>
<webobject name=CaseOne>
<h2>One: <webobject name=ChosenCaseString></webobject></h2>
</webobject>
<webobject name=CaseTwo>
<h2>Two: <webobject name=ChosenCaseString></webobject></h2>
</webobject>
<webobject name=CaseThree>
<h2>Three: <webobject name=ChosenCaseString></webobject></h2>
</webobject>
<webobject name=CaseFour>
<h2>Four: <webobject name=ChosenCaseString></webobject></h2>
</webobject>
<webobject name=DefaultCase>
<h2>Default: <webobject name=ChosenCaseString></webobject></h2>
</webobject>
</webobject>
==========================
Example.wo/Example.wod
==========================
Switch: ERXWOSwitch {
case = chosenCase;
}
CaseFour: ERXWOCase {
case = "Fourth";
}
CaseOne: ERXWOCase {
case = "First";
}
CaseThree: ERXWOCase {
case = "Third";
}
CaseTwo: ERXWOCase {
case = 2;
}
DefaultCase: ERXWOCase {
case = "default";
}
ChosenCaseString: WOString {
value = chosenCase;
}
==========================
Example.java
==========================
public Object chosenCase() {
Object objects = new Object[] {"Fourth", "Third", "First", Integer.valueOf(2), "dummy"};
return objects[(new Random()).nextInt(objects.length)];
}
</code></pre>
* @author ak (Java port)
* @author Charles Lloyd
* @binding case the ivar that holds the value to be switched on
*/
public class ERXWOSwitch extends WODynamicElement {
private NSDictionary<Object, WOElement> _childCases;
private WOAssociation _case;
public ERXWOSwitch(String name, NSDictionary<String, WOAssociation> associations, WOElement template) {
super(name, associations, template);
NSMutableDictionary<Object, WOElement> dict = new NSMutableDictionary<>();
_case = associations.objectForKey("case");
for(Enumeration e = ((WODynamicGroup)template).childrenElements().objectEnumerator(); e.hasMoreElements(); ) {
WOElement child = (WOElement)e.nextElement();
if(child instanceof ERXWOCase) {
Object value = ((ERXWOCase)child).caseValue();
dict.setObjectForKey(child, value);
} else if(!(child instanceof WOHTMLBareString)) {
throw new IllegalStateException("Direct children must be ERXWOCase");
}
}
_childCases = dict.immutableClone();
}
protected WOElement childCaseInContext(WOContext context) {
Object value = _case.valueInComponent(context.component());
value = (value == null ? "default" : value);
WOElement result = _childCases.objectForKey(value);
if(result == null) {
result = _childCases.objectForKey("default");
}
if(result == null) {
result = new WOHTMLBareString("");
}
return result;
}
@Override
public void appendToResponse(WOResponse woresponse, WOContext wocontext) {
childCaseInContext(wocontext).appendToResponse(woresponse, wocontext);
}
@Override
public WOActionResults invokeAction(WORequest worequest, WOContext wocontext) {
return childCaseInContext(wocontext).invokeAction(worequest, wocontext);
}
@Override
public void takeValuesFromRequest(WORequest worequest, WOContext wocontext) {
childCaseInContext(wocontext).takeValuesFromRequest(worequest, wocontext);
}
}