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");
        }
 }


Reply via email to