Author: marrink
Date: Sun Apr 13 04:28:39 2008
New Revision: 647561

URL: http://svn.apache.org/viewvc?rev=647561&view=rev
Log:
RESOLVED - issue WICKET-1418: org.apache.wicket.MarkupContainer swallows 
AbortException 
https://issues.apache.org/jira/browse/WICKET-1418
Tests Submitted by: Peter Ertl

Added:
    
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/
    
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.html
   (with props)
    
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.java
   (with props)
    
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionTest.java
   (with props)
    wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.html
   (with props)
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.java
   (with props)
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionTest.java
   (with props)
Modified:
    
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestCycle.java

Modified: 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java?rev=647561&r1=647560&r2=647561&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
 (original)
+++ 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
 Sun Apr 13 04:28:39 2008
@@ -1262,6 +1262,19 @@
                }
                catch (RuntimeException e)
                {
+                       /*
+                        * check if the raised exception wraps an abort 
exception. if so, it is probably wise to
+                        * unwrap and rethrow the abort exception
+                        */
+                       Throwable cause = e.getCause();
+                       while (cause != null)
+                       {
+                               if (cause instanceof AbortException)
+                               {
+                                       throw ((AbortException)cause);
+                               }
+                               cause = cause.getCause();
+                       }
                        if (!handlingException)
                        {
                                // set step manually to handle exception

Added: 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.html
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.html?rev=647561&view=auto
==============================================================================
--- 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.html
 (added)
+++ 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.html
 Sun Apr 13 04:28:39 2008
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+<html xmlns:wicket="http://wicket.apache.org";>
+<head>
+  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
+  <title>Page</title>
+</head>
+<body>
+
+  <span wicket:id="test">test</span>
+
+</body>
+</html>
\ No newline at end of file

Propchange: 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.html
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.java?rev=647561&view=auto
==============================================================================
--- 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.java
 (added)
+++ 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.java
 Sun Apr 13 04:28:39 2008
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.redirect.abort;
+
+import java.util.Collections;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.protocol.http.servlet.AbortWithWebErrorCodeException;
+
+/**
+ * Page that optionally throws an abortexception during render phase.
+ * 
+ * @author Peter Ertl
+ */
+public class AbortExceptionPage extends WebPage
+{
+       private static final long serialVersionUID = -5906071716129043859L;
+
+       public AbortExceptionPage(PageParameters parameters)
+       {
+               final boolean triggerError = parameters.getBoolean("trigger");
+
+               if (!triggerError)
+                       throw new AbortWithWebErrorCodeException(1234, "this 
error will be rendered");
+
+               IModel model = new LoadableDetachableModel()
+               {
+                       private static final long serialVersionUID = 
-1285116295157071919L;
+
+                       protected Object load()
+                       {
+                               if (triggerError)
+                                       throw new 
AbortWithWebErrorCodeException(1234,
+                                               "this error will NOT be 
rendered");
+                               else
+                                       return Collections.EMPTY_LIST;
+                       }
+               };
+
+               add(new ListView("test", model)
+               {
+                       private static final long serialVersionUID = 
-4176346513350288174L;
+
+                       protected void populateItem(final ListItem item)
+                       {
+                               // not used
+                       }
+               });
+       }
+}

Propchange: 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionTest.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionTest.java?rev=647561&view=auto
==============================================================================
--- 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionTest.java
 (added)
+++ 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionTest.java
 Sun Apr 13 04:28:39 2008
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.redirect.abort;
+
+import junit.framework.Assert;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.protocol.http.servlet.AbortWithWebErrorCodeException;
+
+/**
+ * Testcase for WICKET-1418, throwing an abortexception during rendering.
+ * 
+ * @author Peter Ertl
+ * @author marrink
+ * 
+ * @see <a 
href="https://issues.apache.org/jira/browse/WICKET-1418";>WICKET-1418</a>
+ */
+public class AbortExceptionTest extends WicketTestCase
+{
+       /**
+        * Test page without throwing abort.
+        */
+       public void testNoAbort()
+       {
+               System.out.println("testing good usecase");
+               tester.processRequestCycle(AbortExceptionPage.class, new 
PageParameters("trigger=false"));
+               Assert.assertEquals(1234, 
tester.getServletResponse().getCode());
+       }
+
+       /**
+        * Test page with throwing abort.
+        */
+       public void testAbort()
+       {
+               try
+               {
+
+                       System.out.println("testing bad usecase");
+                       tester.processRequestCycle(AbortExceptionPage.class, 
new PageParameters("trigger=true"));
+                       Assert.assertEquals(1234, 
tester.getServletResponse().getCode()); // this will fail
+               }
+               catch (WicketRuntimeException x)
+               {
+                       final Throwable reason = x.getCause();
+
+                       Assert.assertEquals(reason.getClass(), 
AbortWithWebErrorCodeException.class);
+                       Assert.fail("this must not happen (we expect a redirect 
happen here and handled by wicket request processor)");
+               }
+       }
+
+}

Propchange: 
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestCycle.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestCycle.java?rev=647561&r1=647560&r2=647561&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestCycle.java 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestCycle.java Sun 
Apr 13 04:28:39 2008
@@ -1267,6 +1267,19 @@
                }
                catch (RuntimeException e)
                {
+                       /*
+                        * check if the raised exception wraps an abort 
exception. if so, it is probably wise to
+                        * unwrap and rethrow the abort exception
+                        */
+                       Throwable cause = e.getCause();
+                       while (cause != null)
+                       {
+                               if (cause instanceof AbortException)
+                               {
+                                       throw ((AbortException)cause);
+                               }
+                               cause = cause.getCause();
+                       }
                        if (!handlingException)
                        {
                                // set step manually to handle exception

Added: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.html
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.html?rev=647561&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.html
 (added)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.html
 Sun Apr 13 04:28:39 2008
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+<html xmlns:wicket="http://wicket.apache.org";>
+<head>
+  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
+  <title>Page</title>
+</head>
+<body>
+
+  <span wicket:id="test">test</span>
+
+</body>
+</html>
\ No newline at end of file

Propchange: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.html
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.java?rev=647561&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.java
 (added)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.java
 Sun Apr 13 04:28:39 2008
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.redirect.abort;
+
+import java.util.Collections;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.protocol.http.servlet.AbortWithWebErrorCodeException;
+
+/**
+ * Page that optionally throws an abortexception during render phase.
+ * 
+ * @author Peter Ertl
+ */
+public class AbortExceptionPage extends WebPage
+{
+       private static final long serialVersionUID = -5906071716129043859L;
+
+       public AbortExceptionPage(PageParameters parameters)
+       {
+               final boolean triggerError = parameters.getBoolean("trigger");
+
+               if (!triggerError)
+                       throw new AbortWithWebErrorCodeException(1234, "this 
error will be rendered");
+
+               IModel model = new LoadableDetachableModel()
+               {
+                       private static final long serialVersionUID = 
-1285116295157071919L;
+
+                       protected Object load()
+                       {
+                               if (triggerError)
+                                       throw new 
AbortWithWebErrorCodeException(1234,
+                                               "this error will NOT be 
rendered");
+                               else
+                                       return Collections.EMPTY_LIST;
+                       }
+               };
+
+               add(new ListView("test", model)
+               {
+                       private static final long serialVersionUID = 
-4176346513350288174L;
+
+                       protected void populateItem(final ListItem item)
+                       {
+                               // not used
+                       }
+               });
+       }
+}

Propchange: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionPage.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionTest.java?rev=647561&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionTest.java
 (added)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionTest.java
 Sun Apr 13 04:28:39 2008
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.redirect.abort;
+
+import junit.framework.Assert;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.protocol.http.servlet.AbortWithWebErrorCodeException;
+
+/**
+ * Testcase for WICKET-1418, throwing an abortexception during rendering.
+ * 
+ * @author Peter Ertl
+ * @author marrink
+ * 
+ * @see <a 
href="https://issues.apache.org/jira/browse/WICKET-1418";>WICKET-1418</a>
+ */
+public class AbortExceptionTest extends WicketTestCase
+{
+       /**
+        * Test page without throwing abort.
+        */
+       public void testNoAbort()
+       {
+               System.out.println("testing good usecase");
+               tester.processRequestCycle(AbortExceptionPage.class, new 
PageParameters("trigger=false"));
+               Assert.assertEquals(1234, 
tester.getServletResponse().getCode());
+       }
+
+       /**
+        * Test page with throwing abort.
+        */
+       public void testAbort()
+       {
+               try
+               {
+
+                       System.out.println("testing bad usecase");
+                       tester.processRequestCycle(AbortExceptionPage.class, 
new PageParameters("trigger=true"));
+                       Assert.assertEquals(1234, 
tester.getServletResponse().getCode()); // this will fail
+               }
+               catch (WicketRuntimeException x)
+               {
+                       final Throwable reason = x.getCause();
+
+                       Assert.assertEquals(reason.getClass(), 
AbortWithWebErrorCodeException.class);
+                       Assert.fail("this must not happen (we expect a redirect 
happen here and handled by wicket request processor)");
+               }
+       }
+
+}

Propchange: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/redirect/abort/AbortExceptionTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to