From: <nul...@us...> - 2010-09-19 16:51:38
|
Revision: 11304 http://wonder.svn.sourceforge.net/wonder/?rev=11304&view=rev Author: nullterminated Date: 2010-09-19 16:51:31 +0000 (Sun, 19 Sep 2010) Log Message: ----------- http://issues.objectstyle.org/jira/browse/WONDER-564 Modified Paths: -------------- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/appserver/ERXResponseRewriter.java Modified: trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/appserver/ERXResponseRewriter.java =================================================================== --- trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/appserver/ERXResponseRewriter.java 2010-09-19 15:46:44 UTC (rev 11303) +++ trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/appserver/ERXResponseRewriter.java 2010-09-19 16:51:31 UTC (rev 11304) @@ -10,15 +10,19 @@ import com.webobjects.appserver.WOApplication; import com.webobjects.appserver.WOComponent; import com.webobjects.appserver.WOContext; +import com.webobjects.appserver.WORequestHandler; import com.webobjects.appserver.WOResourceManager; import com.webobjects.appserver.WOResponse; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSMutableDictionary; import com.webobjects.foundation.NSMutableSet; +import com.webobjects.foundation.NSNotification; +import com.webobjects.foundation.NSNotificationCenter; import er.extensions.appserver.ajax.ERXAjaxApplication; import er.extensions.components.ERXStyleSheet; import er.extensions.foundation.ERXProperties; +import er.extensions.foundation.ERXSelectorUtilities; import er.extensions.foundation.ERXStringUtilities; /** @@ -44,12 +48,14 @@ private static final String TOP_INDEX_KEY = "ERXResponseRewriter.topIndex"; + private static final String CONTEXT_OBSERVER_KEY = "ERXResponseRewriter.contextObserver"; + private static Map<WOComponent, NSMutableDictionary<String, Object>> _ajaxPageUserInfos; private static Map<WOComponent, NSMutableDictionary<String, Object>> _pageUserInfos; private static Delegate _delagate; - + /** * Represents a resource in a framework, or a fully-qualified URL if * fileName starts with a / or contains :// . @@ -83,6 +89,20 @@ return "[Resource: framework = " + _framework + "; name = " + _fileName + "]"; } } + + /** + * ERXResponseRewriter uses the ContextObserver to reset the topIndex value at the end + * of the request. You should not need to invoke this class directly. + */ + public static class ContextObserver { + public void didHandleRequest(NSNotification n) { + WOContext context = (WOContext)n.object(); + NSMutableDictionary<String, Object> pageInfo = ERXResponseRewriter.ajaxPageUserInfo(context); + pageInfo.removeObjectForKey(TOP_INDEX_KEY); + pageInfo.removeObjectForKey(CONTEXT_OBSERVER_KEY); + NSNotificationCenter.defaultCenter().removeObserver(this, WORequestHandler.DidHandleRequestNotification, context); + } + } /** * The delegate that is called prior to adding resources into the page, @@ -336,6 +356,15 @@ Integer topIndex = (Integer) pageInfo.objectForKey(ERXResponseRewriter.TOP_INDEX_KEY); if (topIndex == null) { topIndex = Integer.valueOf(0); + //Create an observer to reset the topIndex at the end of the request + ContextObserver contextObserver = new ContextObserver(); + NSNotificationCenter.defaultCenter().addObserver( + contextObserver, + ERXSelectorUtilities.notificationSelector("didHandleRequest"), + WORequestHandler.DidHandleRequestNotification, + context); + //Stick the observer in the pageInfo dictionary so it isn't garbage collected + pageInfo.setObjectForKey(contextObserver, CONTEXT_OBSERVER_KEY); } response.setContent(ERXStringUtilities.insertString(responseContent, content, topIndex)); pageInfo.setObjectForKey(Integer.valueOf(topIndex.intValue() + content.length()), ERXResponseRewriter.TOP_INDEX_KEY); @@ -352,7 +381,7 @@ } return inserted; } - + /** * Adds a script tag with a correct resource url into the html head tag if * it isn't already present in the response, or inserts an Ajax OnDemand tag This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |