From: <tc...@us...> - 2010-10-29 02:27:19
|
Revision: 11646 http://wonder.svn.sourceforge.net/wonder/?rev=11646&view=rev Author: tcripps Date: 2010-10-29 02:27:12 +0000 (Fri, 29 Oct 2010) Log Message: ----------- Capture information about the page's D2WContext as exceptions are caught (before stuff gets cleared in sleep) for later use in exception reporting. Modified Paths: -------------- branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Sources/er/directtoweb/ERDirectToWeb.java branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Sources/er/directtoweb/pages/ERD2WPage.java Modified: branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Sources/er/directtoweb/ERDirectToWeb.java =================================================================== --- branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Sources/er/directtoweb/ERDirectToWeb.java 2010-10-28 15:19:05 UTC (rev 11645) +++ branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Sources/er/directtoweb/ERDirectToWeb.java 2010-10-29 02:27:12 UTC (rev 11646) @@ -9,6 +9,7 @@ import java.net.URL; import java.util.Enumeration; +import er.extensions.foundation.ERXThreadStorage; import org.apache.log4j.Logger; import com.webobjects.appserver.WOComponent; @@ -440,28 +441,19 @@ component = context.page(); } - try { - d2wContext = (D2WContext)component.valueForKey("d2wContext"); - } catch (NSKeyValueCoding.UnknownKeyException uke) { - if (log.isInfoEnabled()) { - log.info("Could not retrieve D2WContext from component context; it is probably not a D2W component."); - } - } - - if (d2wContext != null) { - NSMutableDictionary d2wInfo = informationForD2WContext(d2wContext); - if (component instanceof ERD2WPage) { - ERD2WPage currentPage = (ERD2WPage)component; - String subTask = (String)d2wContext.valueForKey("subTask"); - if ("tab".equals(subTask) || "wizard".equals("subTask")) { - NSArray sections = currentPage.sectionsForCurrentTab(); - d2wInfo.setObjectForKey(sections != null ? sections : "null", "D2W-SectionsContentsForCurrentTab"); - d2wInfo.removeObjectForKey("D2W-TabSectionsContents"); + NSMutableDictionary d2wInfo = (NSMutableDictionary)ERXThreadStorage.valueForKey(ERD2WPage.Keys.exceptionD2WContextInfo); + if (null == d2wInfo) { // Not a ERD2WPage subclass; get info directly from the D2WContext. + try { + d2wContext = (D2WContext)component.valueForKey("d2wContext"); + d2wInfo = informationForD2WContext(d2wContext); + } catch (NSKeyValueCoding.UnknownKeyException uke) { + if (log.isInfoEnabled()) { + log.info("Could not retrieve D2WContext from component context; it is probably not a D2W component."); } } - info.addEntriesFromDictionary(d2wInfo); } - + + info.takeValueForKey(d2wInfo != null ? d2wInfo : "Not available", "D2W Context Info"); return info; } Modified: branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Sources/er/directtoweb/pages/ERD2WPage.java =================================================================== --- branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Sources/er/directtoweb/pages/ERD2WPage.java 2010-10-28 15:19:05 UTC (rev 11645) +++ branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Sources/er/directtoweb/pages/ERD2WPage.java 2010-10-29 02:27:12 UTC (rev 11646) @@ -9,6 +9,7 @@ import java.util.Enumeration; import java.util.NoSuchElementException; +import er.extensions.foundation.ERXThreadStorage; import org.apache.log4j.Logger; import org.apache.log4j.NDC; @@ -163,6 +164,8 @@ // The propertyKey whose form widget gets the focus upon loading an edit page. public static final String firstResponderKey = "firstResponderKey"; + public static final String exceptionD2WContextInfo = "exceptionD2WContextInfo"; + } /** logging support */ @@ -610,6 +613,9 @@ NDC.push("Page: " + getClass().getName() + (d2wContext() != null ? (" - Configuration: " + d2wContext().valueForKey(Keys.pageConfiguration)) : "")); try { super.takeValuesFromRequest(r, c); + } catch (RuntimeException e) { + _recordExceptionContextInfo(); + throw e; } finally { NDC.pop(); } @@ -621,6 +627,9 @@ NDC.push("Page: " + getClass().getName() + (d2wContext() != null ? (" - Configuration: " + d2wContext().valueForKey(Keys.pageConfiguration)) : "")); try { result = super.invokeAction(r, c); + } catch (RuntimeException e) { + _recordExceptionContextInfo(); + throw e; } finally { NDC.pop(); } @@ -656,15 +665,48 @@ // log.info("" + NSPropertyListSerialization.stringFromPropertyList(_allConfigurations)); } } - - boolean clickToOpenEnabled = clickToOpenEnabled(response, context); - ERXClickToOpenSupport.preProcessResponse(response, context, clickToOpenEnabled); - super.appendToResponse(response, context); - ERXClickToOpenSupport.postProcessResponse(getClass(), response, context, clickToOpenEnabled); - NDC.pop(); + try { + boolean clickToOpenEnabled = clickToOpenEnabled(response, context); + ERXClickToOpenSupport.preProcessResponse(response, context, clickToOpenEnabled); + super.appendToResponse(response, context); + ERXClickToOpenSupport.postProcessResponse(getClass(), response, context, clickToOpenEnabled); + } catch (RuntimeException e) { + _recordExceptionContextInfo(); + throw e; + } finally { + NDC.pop(); + } } + /** + * Records information about the page's D2WContext. + */ + private void _recordExceptionContextInfo() { + NSMutableArray d2wPageStack; + NSMutableDictionary contextInfoDict = (NSMutableDictionary)ERXThreadStorage.valueForKey(Keys.exceptionD2WContextInfo); + if (null == contextInfoDict) { + contextInfoDict = new NSMutableDictionary(); + d2wPageStack = new NSMutableArray(); + contextInfoDict.takeValueForKey(d2wPageStack, "D2W Page Stack"); + ERXThreadStorage.takeValueForKey(contextInfoDict, Keys.exceptionD2WContextInfo); + } else { + d2wPageStack = (NSMutableArray)contextInfoDict.valueForKey("D2W Page Stack"); + } + + // Gather the details of the D2WContext from the current page and stash them on the thread. + NSMutableDictionary d2wInfo = ERDirectToWeb.informationForD2WContext(d2wContext()); + d2wInfo.takeValueForKey(name(), "D2W Page Component"); + String subTask = (String)d2wContext().valueForKey("subTask"); + if ("tab".equals(subTask) || "wizard".equals("subTask")) { + // If the page has tab sections, focus on the current tab or it's just too much information which is mostly not relevant. + NSArray sections = sectionsForCurrentTab(); + d2wInfo.setObjectForKey(sections != null ? sections : "null", "D2W-SectionsContentsForCurrentTab"); + d2wInfo.removeObjectForKey("D2W-TabSectionsContents"); + } + d2wPageStack.insertObjectAtIndex(d2wInfo, 0); + } + // ************************************************************************** // Workflow extensions (Branches) // ************************************************************************** @@ -673,9 +715,9 @@ protected NSDictionary _branch; /** - * Cover method for getting the choosen branch. + * Cover method for getting the chosen branch. * - * @return user choosen branch. + * @return user chosen branch. */ public NSDictionary branch() { return _branch; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |