Author: dashorst
Date: Wed May 9 04:27:04 2007
New Revision: 536489
URL: http://svn.apache.org/viewvc?view=rev&rev=536489
Log:
WICKET-547 Line precise error reporting with component addition
Modified:
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Page.java
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/string/Strings.java
incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/debug/WicketComponentTreeTest.java
Modified:
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java?view=diff&rev=536489&r1=536488&r2=536489
==============================================================================
---
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java
(original)
+++
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java
Wed May 9 04:27:04 2007
@@ -41,6 +41,7 @@
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.IModelComparator;
import org.apache.wicket.model.IWrapModel;
+import org.apache.wicket.settings.IDebugSettings;
import org.apache.wicket.util.convert.IConverter;
import org.apache.wicket.util.lang.Classes;
import org.apache.wicket.util.lang.Objects;
@@ -613,6 +614,24 @@
private static final long serialVersionUID = 1L;
};
+ /**
+ * meta data key for line precise error logging for the moment of
construction.
+ * Made package private for access in [EMAIL PROTECTED] Page}
+ */
+ static final MetaDataKey CONSTRUCTED_AT_KEY = new
MetaDataKey(String.class)
+ {
+ private static final long serialVersionUID = 1L;
+ };
+
+ /**
+ * Meta data key for line precise error logging for the moment of
addition.
+ * Made package private for access in [EMAIL PROTECTED]
MarkupContainer} and [EMAIL PROTECTED] Page}
+ */
+ static final MetaDataKey ADDED_AT_KEY = new MetaDataKey(String.class)
+ {
+ private static final long serialVersionUID = 1L;
+ };
+
/** Basic model IModelComparator implementation for normal object
models */
private static final IModelComparator defaultModelComparator = new
IModelComparator()
{
@@ -685,6 +704,12 @@
{
setId(id);
getApplication().notifyComponentInstantiationListeners(this);
+
+ final IDebugSettings debugSettings =
Application.get().getDebugSettings();
+ if (debugSettings.getComponentUseCheck())
+ {
+ setMetaData(CONSTRUCTED_AT_KEY, Strings.toString(this,
new MarkupException("constructed")));
+ }
}
/**
@@ -704,6 +729,12 @@
setId(id);
getApplication().notifyComponentInstantiationListeners(this);
this.model = wrap(model);
+
+ final IDebugSettings debugSettings =
Application.get().getDebugSettings();
+ if (debugSettings.getComponentUseCheck())
+ {
+ setMetaData(CONSTRUCTED_AT_KEY, Strings.toString(this,
new MarkupException("constructed")));
+ }
}
/**
Modified:
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/MarkupContainer.java?view=diff&rev=536489&r1=536488&r2=536489
==============================================================================
---
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
(original)
+++
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
Wed May 9 04:27:04 2007
@@ -34,6 +34,7 @@
import org.apache.wicket.model.IComponentInheritedModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.IWrapModel;
+import org.apache.wicket.settings.IDebugSettings;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.string.Strings;
import org.apache.wicket.version.undo.Change;
@@ -853,6 +854,12 @@
// Set child's parent
component.setParent(this);
+
+ final IDebugSettings debugSettings =
Application.get().getDebugSettings();
+ if (debugSettings.getComponentUseCheck())
+ {
+ component.setMetaData(ADDED_AT_KEY,
Strings.toString(component, new MarkupException("added")));
+ }
// Tell the page a component was added
final Page page = findPage();
Modified:
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Page.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Page.java?view=diff&rev=536489&r1=536488&r2=536489
==============================================================================
---
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Page.java
(original)
+++
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Page.java
Wed May 9 04:27:04 2007
@@ -1005,6 +1005,16 @@
// Add to explanatory
string to buffer
buffer.append(Integer.toString(unrenderedComponents.getCount()) + ". "
+
component + "\n");
+ String metadata =
(String)component.getMetaData(Component.CONSTRUCTED_AT_KEY);
+ if(metadata != null)
+ {
+
buffer.append(metadata);
+ }
+ metadata =
(String)component.getMetaData(Component.ADDED_AT_KEY);
+ if(metadata != null)
+ {
+
buffer.append(metadata);
+ }
}
else
{
Modified:
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/string/Strings.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/string/Strings.java?view=diff&rev=536489&r1=536488&r2=536489
==============================================================================
---
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/string/Strings.java
(original)
+++
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/string/Strings.java
Wed May 9 04:27:04 2007
@@ -23,6 +23,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.apache.wicket.Component;
import org.apache.wicket.WicketRuntimeException;
@@ -1125,6 +1126,94 @@
}
/**
+ * Creates a location stacktrace string representation for the
component for
+ * reference when the render check fails. This method filters out most
of
+ * the unnecessary parts of the stack trace. The message of the
+ * <code>location</code> is used as a verb in the rendered string. Use
+ * "added", "constructed" or similar verbs as values.
+ *
+ * @param component
+ * the component that was constructed or added and failed to
+ * render
+ * @param location
+ * the location where the component was created or added in
the
+ * java code.
+ * @return a string giving the line precise location where the
component was
+ * added or created.
+ */
+ public static String toString(final Component component, final
Throwable location)
+ {
+ Class componentClass = component.getClass();
+
+ // try to find the component type, if it is an inner element,
then get
+ // the parent component.
+ String componentType = componentClass.getName();
+ if (componentType.indexOf('$') >= 0)
+ {
+ componentType =
componentClass.getSuperclass().getName();
+ }
+
+ componentType =
componentType.substring(componentType.lastIndexOf('.') + 1);
+
+ // create a user friendly message, using the location's message
as a
+ // differentiator for the message (e.g. "component foo was
***added***"
+ // or "component foo was ***created***")
+ AppendingStringBuffer sb = new AppendingStringBuffer("The " +
componentType.toLowerCase()
+ + " with id '" + component.getId() + "' that
failed to render was "
+ + location.getMessage() + "\n");
+
+ // a list of stacktrace elements that need to be skipped in the
location
+ // stack trace
+ String[] skippedElements = new String[] {
"org.apache.wicket.MarkupContainer",
+ "org.apache.wicket.Component",
"org.apache.wicket.markup" };
+
+ // a list of stack trace elements that stop the traversal of
the stack
+ // trace
+ String[] breakingElements = new String[] {
"org.apache.wicket.protocol.http.WicketServlet",
+ "org.apache.wicket.protocol.http.WicketFilter",
"java.lang.reflect" };
+
+ StackTraceElement[] trace = location.getStackTrace();
+ for (int i = 0; i < trace.length; i++)
+ {
+ String traceString = trace[i].toString();
+ if (shouldSkip(traceString, skippedElements))
+ {
+ // don't print this line, is wicket internal
+ continue;
+ }
+
+ if (!(traceString.startsWith("sun.reflect.") && i > 1))
+ {
+ // filter out reflection API calls from the
stack trace
+ if (traceString.indexOf("java.lang.reflect") >=
0)
+ {
+ sb.append(" at ");
+ sb.append(traceString);
+ sb.append("\n");
+ }
+ if (shouldSkip(traceString, breakingElements))
+ {
+ break;
+ }
+ }
+ }
+ sb.append("\n");
+ return sb.toString();
+ }
+
+ private static boolean shouldSkip(String text, String[] filters)
+ {
+ for (int i = 0; i < filters.length; i++)
+ {
+ if (text.indexOf(filters[i]) >= 0)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* Converts a Throwable to a string.
*
* @param throwable
@@ -1216,7 +1305,8 @@
sb.append(traceString);
sb.append("\n");
if (stopAtWicketServlet
- &&
traceString.startsWith("org.apache.wicket.protocol.http.WicketServlet"))
+ &&
(traceString.startsWith("org.apache.wicket.protocol.http.WicketServlet") ||
traceString
+
.startsWith("org.apache.wicket.protocol.http.WicketFilter")))
{
return;
}
Modified:
incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/debug/WicketComponentTreeTest.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/debug/WicketComponentTreeTest.java?view=diff&rev=536489&r1=536488&r2=536489
==============================================================================
---
incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/debug/WicketComponentTreeTest.java
(original)
+++
incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/debug/WicketComponentTreeTest.java
Wed May 9 04:27:04 2007
@@ -42,6 +42,10 @@
*/
public void test1() throws Exception
{
+ // disable the component use check, as this consumes extra
+ // memory (label size doubles to 1.1K)
+
tester.getApplication().getDebugSettings().setComponentUseCheck(false);
+
this.executeTest(WicketComponentTreeTestPage.class,
"WicketComponentTreeTestPage_ExpectedResult.html");
}
}