// // ERXOncePerRequestConditional.java: Class file for WO Component 'ERXOncePerRequestConditional' // Project simple // // Created by ak on Tue Mar 19 2002 // package er.extensions.components.conditionals; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.webobjects.appserver.WOActionResults; import com.webobjects.appserver.WOContext; import com.webobjects.appserver.WORequest; import com.webobjects.appserver.WOResponse; import com.webobjects.foundation.NSMutableDictionary; import er.extensions.appserver.ERXWOContext; import er.extensions.components.ERXStatelessComponent; import er.extensions.eof.ERXConstant; /** * Will render its embedded content only once during the RR loop. * Useful for JavaScript code that should be included only once. * @binding keyName * @binding ERXOncePerRequestDisplayCountDict */ public class ERXOncePerRequestConditional extends ERXStatelessComponent { /** * Do I need to update serialVersionUID? * See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the * <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a> */ private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory.getLogger(ERXOncePerRequestConditional.class); String keyName = null; int currentStage = -1; /** * Public constructor * @param context context of request */ public ERXOncePerRequestConditional(WOContext context) { super(context); } public NSMutableDictionary displayCountDict() { NSMutableDictionary displayCountDict = (NSMutableDictionary)ERXWOContext.contextDictionary().objectForKey("ERXOncePerRequestDisplayCountDict"); if(displayCountDict == null) { displayCountDict = new NSMutableDictionary(); ERXWOContext.contextDictionary().setObjectForKey(displayCountDict, "ERXOncePerRequestDisplayCountDict"); } return displayCountDict; } public int displayCountForKey(String key) { return ((Integer)displayCountDict().objectForKey(key)).intValue(); } String keyName() { if(!hasBinding("keyName")) { throw new IllegalStateException("'keyName' is a required binding"); } if(keyName == null) { keyName = (String)valueForBinding("keyName"); } return keyName; } @Override public void reset() { super.reset(); keyName = null; } @Override public void awake() { super.awake(); } public void resetDict() { String key = keyName() + "--" + currentStage; if(displayCountDict().objectForKey(key) == null) { displayCountDict().setObjectForKey(ERXConstant.integerForInt(-1), key); } int count = ((Integer)displayCountDict().objectForKey(key)).intValue() + 1; displayCountDict().setObjectForKey(ERXConstant.integerForInt(count), key); } @Override public void takeValuesFromRequest(WORequest aRequest, WOContext aContext) { currentStage = 0; resetDict(); super.takeValuesFromRequest(aRequest,aContext); } @Override public WOActionResults invokeAction(WORequest aRequest, WOContext aContext) { currentStage = 1; resetDict(); return super.invokeAction(aRequest,aContext); } @Override public void appendToResponse(WOResponse aResponse, WOContext aContext) { currentStage = 2; resetDict(); super.appendToResponse(aResponse,aContext); } public boolean displayContent() { int showCount = displayCountForKey(keyName() + "--" + currentStage); log.debug("displayContent - showCount: {} stage: {}", showCount, currentStage); return showCount == 0; } }