You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "C Quarters (JIRA)" <ji...@apache.org> on 2016/04/16 13:18:25 UTC

[jira] [Commented] (WICKET-6102) StackoverflowError related to enclosures

    [ https://issues.apache.org/jira/browse/WICKET-6102?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15244152#comment-15244152 ] 

C Quarters commented on WICKET-6102:
------------------------------------

My apologies if this is not the correct place to post this but I think it adds context (and maybe another perspective) to this bug.

I have been experiencing this StackOverflowError with <wicket:enclosure> since 7.0.0 (also in 7.1.0 and 7.2.0). I had no problems with M1 - M6. My call stack has the same recursion as in this bug although my line numbers below are different because it's 7.2.0 code.

java.lang.StackOverflowError
	at java.lang.StringBuilder.append(StringBuilder.java:136)
	at org.apache.wicket.markup.DefaultMarkupCacheKeyProvider.getCacheKey(DefaultMarkupCacheKeyProvider.java:55)
	at org.apache.wicket.markup.MarkupCache.getMarkup(MarkupCache.java:276)
	at org.apache.wicket.markup.MarkupFactory.getMarkup(MarkupFactory.java:236)
	at org.apache.wicket.markup.MarkupFactory.getMarkup(MarkupFactory.java:194)
	at org.apache.wicket.MarkupContainer.getAssociatedMarkup(MarkupContainer.java:456)
	at org.apache.wicket.markup.html.panel.AssociatedMarkupSourcingStrategy.getMarkup(AssociatedMarkupSourcingStrategy.java:95)
 	at org.apache.wicket.MarkupContainer.getMarkup(MarkupContainer.java:502)
	at org.apache.wicket.Component.getMarkup(Component.java:755)
	at org.apache.wicket.markup.html.internal.Enclosure.getChild(Enclosure.java:138)
	at org.apache.wicket.markup.html.internal.Enclosure.isVisible(Enclosure.java:173)
	at org.apache.wicket.markup.html.panel.AbstractMarkupSourcingStrategy.searchMarkupInTransparentResolvers(AbstractMarkupSourcingStrategy.java:90)
	at org.apache.wicket.markup.html.panel.AssociatedMarkupSourcingStrategy.getMarkup(AssociatedMarkupSourcingStrategy.java:123)
 	at org.apache.wicket.MarkupContainer.getMarkup(MarkupContainer.java:502)
	at org.apache.wicket.Component.getMarkup(Component.java:755)
	at org.apache.wicket.markup.html.internal.Enclosure.getChild(Enclosure.java:138)
	at org.apache.wicket.markup.html.internal.Enclosure.isVisible(Enclosure.java:173)
	at org.apache.wicket.markup.html.panel.AbstractMarkupSourcingStrategy.searchMarkupInTransparentResolvers(AbstractMarkupSourcingStrategy.java:90)
	at org.apache.wicket.markup.html.panel.AssociatedMarkupSourcingStrategy.getMarkup(AssociatedMarkupSourcingStrategy.java:123)
 	at org.apache.wicket.MarkupContainer.getMarkup(MarkupContainer.java:502)
	at org.apache.wicket.Component.getMarkup(Component.java:755)
etc

I've tried creating a simple example illustrating the problem but have not been able to. It only happens in two large applications I work on.

I've worked around the problem since 7.0.0 by patching
org.apache.wicket.markup.html.internal.Enclosure

In the call stack loop you see Enclosure.isVisible(). In my own code I follow this practice
http://wicketinaction.com/2011/11/implement-wicket-component-visibility-changes-properly/
so I deleted Enclosure.isVisible() (!!!) because setVisible() is called in Enclosure.onConfigure(). However, this led to NPEs so I added null checking in Enclosure.onConfigure() and Enclosure.getChild(). For me these changes work well but I'm probably being naive. Is there a reason why it's important to have code in Enclosure.isVisible() ? Is there any merit in my changes that might be incorporated into Wicket?

Here's a diff showing how I modify Enclosure.java 

diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
index e68f4e0..7616e55 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
@@ -135,7 +135,9 @@
 		if (childComponent == null)
 		{
 			// try to find child when resolved
-			childComponent = getChildComponent(new MarkupStream(getMarkup()), getEnclosureParent());
+		  IMarkupFragment markup = getMarkup();
+		  if( markup != null )
+		    childComponent = getChildComponent(new MarkupStream(markup), getEnclosureParent());
 		}
 		return childComponent;
 	}
@@ -166,23 +168,22 @@
 		
 		return childController;
 	}
-
-	@Override
-	public boolean isVisible()
-	{
-		return getChild().determineVisibility();
-	}
 	
 	@Override
 	protected void onConfigure()
 	{
-		super.onConfigure();
-		final Component child = getChild();
-		
-		child.configure();
-		boolean childVisible = child.determineVisibility();
-		
-		setVisible(childVisible);
+	  super.onConfigure();
+	  boolean childVisible = false;
+
+	  final Component child = getChild();
+
+	  if( child != null )
+	  {
+	    child.configure();
+	    childVisible = child.determineVisibility();
+	  }
+    
+    setVisible(childVisible);
 	}
 
 	@Override



> StackoverflowError related to enclosures
> ----------------------------------------
>
>                 Key: WICKET-6102
>                 URL: https://issues.apache.org/jira/browse/WICKET-6102
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 7.2.0, 8.0.0-M1
>            Reporter: Martin Grigorov
>             Fix For: 7.3.0, 8.0.0-M1
>
>
> I see the following exception when try to start Wicket-Bootstrap's samples with 7.3.0-SNAPSHOT.
> There is no such problem with 7.2.0
> {code}
> java.lang.StackOverflowError
> 	at java.util.ArrayList.iterator(ArrayList.java:834)
> 	at org.apache.wicket.MarkupContainer$1MarkupChildIterator.refreshInternalIteratorIfNeeded(MarkupContainer.java:608)
> 	at org.apache.wicket.MarkupContainer$1MarkupChildIterator.hasNext(MarkupContainer.java:574)
> 	at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:134)
> 	at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:162)
> 	at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:162)
> 	at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:162)
> 	at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:162)
> 	at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:162)
> 	at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:162)
> 	at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:162)
> 	at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:162)
> 	at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:123)
> 	at org.apache.wicket.MarkupContainer.visitChildren(MarkupContainer.java:968)
> 	at org.apache.wicket.markup.html.panel.AbstractMarkupSourcingStrategy.searchMarkupInTransparentResolvers(AbstractMarkupSourcingStrategy.java:77)
> 	at org.apache.wicket.markup.html.panel.AssociatedMarkupSourcingStrategy.getMarkup(AssociatedMarkupSourcingStrategy.java:123)
> 	at org.apache.wicket.MarkupContainer.getMarkup(MarkupContainer.java:504)
> 	at org.apache.wicket.Component.getMarkup(Component.java:755)
> 	at org.apache.wicket.markup.html.internal.Enclosure.getChild(Enclosure.java:136)
> 	at org.apache.wicket.markup.html.internal.Enclosure.isVisible(Enclosure.java:171)
> 	at org.apache.wicket.markup.html.panel.AbstractMarkupSourcingStrategy.searchMarkupInTransparentResolvers(AbstractMarkupSourcingStrategy.java:90)
> 	at org.apache.wicket.markup.html.panel.AssociatedMarkupSourcingStrategy.getMarkup(AssociatedMarkupSourcingStrategy.java:123)
> 	at org.apache.wicket.MarkupContainer.getMarkup(MarkupContainer.java:504)
> 	at org.apache.wicket.Component.getMarkup(Component.java:755)
> 	at org.apache.wicket.markup.html.internal.Enclosure.getChild(Enclosure.java:136)
> 	at org.apache.wicket.markup.html.internal.Enclosure.isVisible(Enclosure.java:171)
> 	at org.apache.wicket.markup.html.panel.AbstractMarkupSourcingStrategy.searchMarkupInTransparentResolvers(AbstractMarkupSourcingStrategy.java:90)
> 	at org.apache.wicket.markup.html.panel.AssociatedMarkupSourcingStrategy.getMarkup(AssociatedMarkupSourcingStrategy.java:123)
> 	at org.apache.wicket.MarkupContainer.getMarkup(MarkupContainer.java:504)
> 	at org.apache.wicket.Component.getMarkup(Component.java:755)
> 	at org.apache.wicket.markup.html.internal.Enclosure.getChild(Enclosure.java:136)
> 	at org.apache.wicket.markup.html.internal.Enclosure.isVisible(Enclosure.java:171)
> 	at org.apache.wicket.markup.html.panel.AbstractMarkupSourcingStrategy.searchMarkupInTransparentResolvers(AbstractMarkupSourcingStrategy.java:90)
> 	at org.apache.wicket.markup.html.panel.AssociatedMarkupSourcingStrategy.getMarkup(AssociatedMarkupSourcingStrategy.java:123)
> 	at org.apache.wicket.MarkupContainer.getMarkup(MarkupContainer.java:504)
> 	at org.apache.wicket.Component.getMarkup(Component.java:755)
> ...
> {code}
> To reproduce:
> * git clone https://github.com/l0rdn1kk0n/wicket-bootstrap/
> * edit pom.xml and set Wicket version to 7.3.0-SNAPSHOT
> * git checkout db35564a0c0972da13448545078184ae0e9a009b
> * mvn clean install
> * cd bootstrap-samples
> * mvn jetty:run



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)