You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2005/10/15 16:46:20 UTC

svn commit: r321341 - in /jakarta/tapestry/trunk: examples/Vlib/src/context/ examples/Vlib/src/context/WEB-INF/ examples/Vlib/src/java/org/apache/tapestry/vlib/ examples/Vlib/src/java/org/apache/tapestry/vlib/components/ examples/Vlib/src/java/org/apac...

Author: hlship
Date: Sat Oct 15 07:45:57 2005
New Revision: 321341

URL: http://svn.apache.org/viewcvs?rev=321341&view=rev
Log:
Continue revving Virtual Library for Tapestry 4.0: Remove VirtualLibraryEngine, splitting its responsibilities into a number of small services.

Added:
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/Global.java
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ApplicationLifecycle.java
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ApplicationLifecycleImpl.java
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/DiscardSessionFilter.java
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/VlibStaleSessionPresenter.java
    jakarta/tapestry/trunk/examples/Vlib/src/test/org/apache/tapestry/vlib/services/DiscardSessionFilterTest.java
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/error/StaleSessionExceptionPresenterTest.java
      - copied, changed from r321214, jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/error/TestStaleSessionExceptionPresenter.java
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/ServletWebSessionTest.java
      - copied, changed from r321214, jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/TestServletWebSession.java
    jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/PortletWebSessionTest.java
      - copied, changed from r321214, jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/TestPortletWebSession.java
Removed:
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/VirtualLibraryEngine.java
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/error/TestStaleSessionExceptionPresenter.java
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/TestServletWebSession.java
    jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/TestPortletWebSession.java
Modified:
    jakarta/tapestry/trunk/examples/Vlib/src/context/ApplicationUnavailable.html
    jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/Border.html
    jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/hivemodule.xml
    jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/vlib.application
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/components/Border.java
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/components/Browser.java
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/ApplicationUnavailable.java
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/BookMatches.java
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/ConfirmBookDelete.java
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/NewBook.java
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/admin/EditPublishers.java
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ModelSource.java
    jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ModelSourceImpl.java
    jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.error.xml
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/engine/AbstractEngine.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleLinkExceptionPresenter.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleLinkExceptionPresenterImpl.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleSessionExceptionPresenter.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleSessionExceptionPresenterImpl.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/ServletWebSession.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/WebSession.java
    jakarta/tapestry/trunk/portlet/src/descriptor/META-INF/hivemodule.xml
    jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletStaleLinkExceptionPresenter.java
    jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletStaleSessionExceptionPresenter.java
    jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletWebSession.java

Modified: jakarta/tapestry/trunk/examples/Vlib/src/context/ApplicationUnavailable.html
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/context/ApplicationUnavailable.html?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/context/ApplicationUnavailable.html (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/context/ApplicationUnavailable.html Sat Oct 15 07:45:57 2005
@@ -34,7 +34,7 @@
 <a jwcid="@ServiceLink" service="restart" href="#">restart the application</a>.
 </p>
 
-<span jwcid="@If" condition="ognl:engine.debugEnabled">
+<span jwcid="@If" condition="ognl:global.debugEnabled">
 
 <span jwcid="@ExceptionDisplay" exceptions="ognl:exceptions"/>
 <span jwcid="@RequestDisplay"/>

Modified: jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/Border.html
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/Border.html?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/Border.html (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/Border.html Sat Oct 15 07:45:57 2005
@@ -113,7 +113,7 @@
 </span></td>
   </tr>
 </table>
-<span jwcid="ib@contrib:InspectorButton" disabled="ognl:! page.engine.debugEnabled"/>
+<span jwcid="ib@contrib:InspectorButton" disabled="ognl:global.debugEnabled"/>
 </body>
 </html>
 </span>

Modified: jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/hivemodule.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/hivemodule.xml?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/hivemodule.xml (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/hivemodule.xml Sat Oct 15 07:45:57 2005
@@ -84,11 +84,52 @@
         
     </service-point>
     
+    <service-point id="ApplicationLifecycle">
+        
+        Controls lifecycle operations; specifically logging out.
+        
+        <invoke-factory model="threaded">
+            <construct class="ApplicationLifecycleImpl">
+                <set-object property="stateManager" value="infrastructure:applicationStateManager"/>
+            </construct>
+        </invoke-factory>        
+    </service-point>
+    
+    <service-point id="DiscardSessionFilter" interface="org.apache.tapestry.services.WebRequestServicerFilter">
+        
+        Filter used to optionally discard the session at the end of a request (typically after a logout).
+        
+        <invoke-factory>
+            <construct class="DiscardSessionFilter">
+                <set-object property="applicationLifecycle" value="service:ApplicationLifecycle"/>
+            </construct>
+        </invoke-factory>
+        
+    </service-point>
+    
+    <contribution configuration-id="tapestry.request.WebRequestServicerPipeline">
+        <filter name="discard-session" object="service:DiscardSessionFilter"/>
+    </contribution>
+    
     <contribution configuration-id="hivemind.ApplicationDefaults">
         <!-- Talk to the local JBoss JNDI -->
         <default symbol="java.naming.factory.initial" value="org.jnp.interfaces.NamingContextFactory"/>
         <default symbol="java.naming.factory.url.pkgs" value="org.jboss.naming:org.jnp.interfaces"/>
         <default symbol="java.naming.provider.url" value="localhost:1099"/>
     </contribution>
+    
+    <contribution configuration-id="tapestry.InfrastructureOverrides"> 
+        <property name="exceptionPageName" value="ApplicationUnavailable" />        
+    </contribution>
+    
+    <!-- Override the default implementation with one specific to the Virtual Library -->
+    
+    <implementation service-id="tapestry.error.StaleSessionExceptionPresenter">       
+        <invoke-factory>            
+            <construct class="VlibStaleSessionPresenter" >
+                <set-object property="responseRenderer" value="infrastructure:responseRenderer" />
+            </construct>            
+        </invoke-factory>
+    </implementation>
      
 </module>

Modified: jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/vlib.application
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/vlib.application?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/vlib.application (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/context/WEB-INF/vlib.application Sat Oct 15 07:45:57 2005
@@ -19,11 +19,11 @@
   "-//Apache Software Foundation//Tapestry Specification 4.0//EN" 
   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
 
-<application
-	name="Virtual Library" 
-	engine-class="org.apache.tapestry.vlib.VirtualLibraryEngine">
+<application name="Virtual Library">
    
   <meta key="org.apache.tapestry.visit-class" value="org.apache.tapestry.vlib.Visit"/>
+  <meta key="org.apache.tapestry.global-class" value="org.apache.tapestry.vlib.Global"/>
+  
   <meta key="org.apache.tapestry.page-class-packages" value="org.apache.tapestry.vlib.pages"/>
   <meta key="org.apache.tapestry.component-class-packages" value="org.apache.tapestry.vlib.components"/>
   

Added: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/Global.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/Global.java?rev=321341&view=auto
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/Global.java (added)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/Global.java Sat Oct 15 07:45:57 2005
@@ -0,0 +1,31 @@
+// Copyright 2005 The Apache Software Foundation
+//
+// Licensed 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.tapestry.vlib;
+
+/**
+ * Allows the application to access the debug flag.
+ * 
+ * @author Howard M. Lewis Ship
+ */
+public class Global
+{
+    private static final boolean DEBUG_ENABLED = Boolean
+            .getBoolean("org.apache.tapestry.vlib.debug-enabled");
+
+    public boolean isDebugEnabled()
+    {
+        return DEBUG_ENABLED;
+    }
+}

Modified: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/components/Border.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/components/Border.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/components/Border.java (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/components/Border.java Sat Oct 15 07:45:57 2005
@@ -20,26 +20,25 @@
 import org.apache.tapestry.IPage;
 import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.annotations.InjectObject;
 import org.apache.tapestry.annotations.InjectPage;
 import org.apache.tapestry.annotations.InjectState;
+import org.apache.tapestry.annotations.InjectStateFlag;
 import org.apache.tapestry.annotations.Message;
 import org.apache.tapestry.annotations.Parameter;
 import org.apache.tapestry.callback.ICallback;
 import org.apache.tapestry.callback.PageCallback;
+import org.apache.tapestry.vlib.Global;
 import org.apache.tapestry.vlib.IActivate;
-import org.apache.tapestry.vlib.VirtualLibraryEngine;
 import org.apache.tapestry.vlib.Visit;
 import org.apache.tapestry.vlib.pages.Home;
 import org.apache.tapestry.vlib.pages.Login;
+import org.apache.tapestry.vlib.services.ApplicationLifecycle;
 
 /**
  * The standard Border component, which provides the title of the page, the link to
  * {@link org.apache.tapestry.vlib.pages.MyLibrary}, the
  * {@link org.apache.tapestry.vlib.pages.Login} page and the Logout page.
- * <p>
- * TODO: Part of the transition up to Tapestry 4.0 has "broken" the deferrment of state; the Border
- * component on the Home page now forces a session immediately. This needs to be fixed (with a new
- * injection type to identify if the visit state object has yet been created).
  * 
  * @author Howard Lewis Ship
  */
@@ -103,12 +102,21 @@
     @InjectState("visit")
     public abstract Visit getVisit();
 
+    @InjectStateFlag("visit")
+    public abstract boolean getVisitExists();
+
     @InjectPage("Login")
     public abstract Login getLogin();
 
     @InjectPage("Home")
     public abstract Home getHome();
 
+    @InjectState("global")
+    public abstract Global getGlobal();
+
+    @InjectObject("service:vlib.ApplicationLifecycle")
+    public abstract ApplicationLifecycle getApplicationLifecycle();
+
     @Message
     public abstract String goodbye();
 
@@ -185,21 +193,12 @@
 
     public boolean isLoggedIn()
     {
-        Visit visit = getVisit();
-
-        if (visit == null)
-            return false;
-
-        return visit.isUserLoggedIn();
+        return getVisitExists() && getVisit().isUserLoggedIn();
     }
 
     public boolean isAdmin()
     {
-        Visit visit = getVisit();
-
-        IRequestCycle cycle = getPage().getRequestCycle();
-
-        return visit.isUserLoggedIn() && visit.getUser().isAdmin();
+        return isLoggedIn() && getVisit().getUser().isAdmin();
     }
 
     public void editProfile()
@@ -230,9 +229,7 @@
 
     public IPage login()
     {
-        Visit visit = getVisit();
-
-        if (visit.isUserLoggedIn())
+        if (isLoggedIn())
             return null;
 
         ICallback callback = new PageCallback(getPage().getPageName());
@@ -246,9 +243,7 @@
 
     public IPage logout()
     {
-        VirtualLibraryEngine vengine = (VirtualLibraryEngine) getPage().getEngine();
-
-        vengine.logout();
+        getApplicationLifecycle().logout();
 
         Home home = getHome();
         home.setMessage(goodbye());

Modified: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/components/Browser.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/components/Browser.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/components/Browser.java (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/components/Browser.java Sat Oct 15 07:45:57 2005
@@ -19,7 +19,6 @@
 import org.apache.tapestry.AbstractComponent;
 import org.apache.tapestry.IActionListener;
 import org.apache.tapestry.IMarkupWriter;
-import org.apache.tapestry.IPage;
 import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.Tapestry;
 import org.apache.tapestry.annotations.ComponentClass;
@@ -28,7 +27,6 @@
 import org.apache.tapestry.event.PageBeginRenderListener;
 import org.apache.tapestry.event.PageEvent;
 import org.apache.tapestry.vlib.OperationsUser;
-import org.apache.tapestry.vlib.VirtualLibraryEngine;
 import org.apache.tapestry.vlib.ejb.Book;
 import org.apache.tapestry.vlib.ejb.IBookQuery;
 import org.apache.tapestry.vlib.services.RemoteCallback;

Modified: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/ApplicationUnavailable.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/ApplicationUnavailable.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/ApplicationUnavailable.java (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/ApplicationUnavailable.java Sat Oct 15 07:45:57 2005
@@ -18,8 +18,7 @@
 import org.apache.tapestry.vlib.IErrorProperty;
 
 /**
- * A page only displayed when the application is unavailable (typically because of repeated
- * {@link java.rmi.RemoteException}s or {@link javax.naming.NamingException}s accessing EJBs.
+ * A customized exception page; in non-debug mode, it omits displays the main exception display.
  * 
  * @author Howard Lewis Ship
  * @since 2.2
@@ -27,11 +26,16 @@
 
 public abstract class ApplicationUnavailable extends Exception implements IErrorProperty
 {
-
-    public void activate(String message, Throwable ex)
+    @Override
+    public void setException(Throwable value)
     {
-        setError(message);
+        super.setException(value);
+
+        String message = value.getMessage();
 
-        setException(ex);
+        if (message == null)
+            message = value.getClass().getName();
+
+        setError(message);
     }
 }

Modified: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/BookMatches.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/BookMatches.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/BookMatches.java (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/BookMatches.java Sat Oct 15 07:45:57 2005
@@ -24,7 +24,6 @@
 import org.apache.tapestry.annotations.Persist;
 import org.apache.tapestry.html.BasePage;
 import org.apache.tapestry.vlib.OperationsUser;
-import org.apache.tapestry.vlib.VirtualLibraryEngine;
 import org.apache.tapestry.vlib.components.Browser;
 import org.apache.tapestry.vlib.ejb.IBookQuery;
 import org.apache.tapestry.vlib.ejb.MasterQueryParameters;

Modified: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/ConfirmBookDelete.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/ConfirmBookDelete.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/ConfirmBookDelete.java (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/ConfirmBookDelete.java Sat Oct 15 07:45:57 2005
@@ -16,7 +16,6 @@
 
 import java.rmi.RemoteException;
 
-import javax.ejb.FinderException;
 import javax.ejb.RemoveException;
 
 import org.apache.hivemind.ApplicationRuntimeException;
@@ -27,9 +26,7 @@
 import org.apache.tapestry.annotations.Meta;
 import org.apache.tapestry.html.BasePage;
 import org.apache.tapestry.vlib.OperationsUser;
-import org.apache.tapestry.vlib.VirtualLibraryEngine;
 import org.apache.tapestry.vlib.ejb.Book;
-import org.apache.tapestry.vlib.ejb.IOperations;
 import org.apache.tapestry.vlib.services.RemoteCallback;
 
 /**

Modified: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/NewBook.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/NewBook.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/NewBook.java (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/NewBook.java Sat Oct 15 07:45:57 2005
@@ -29,7 +29,6 @@
 import org.apache.tapestry.event.PageEvent;
 import org.apache.tapestry.form.IFormComponent;
 import org.apache.tapestry.valid.IValidationDelegate;
-import org.apache.tapestry.vlib.VirtualLibraryEngine;
 import org.apache.tapestry.vlib.Visit;
 import org.apache.tapestry.vlib.VlibPage;
 import org.apache.tapestry.vlib.ejb.IOperations;

Modified: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/admin/EditPublishers.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/admin/EditPublishers.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/admin/EditPublishers.java (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/pages/admin/EditPublishers.java Sat Oct 15 07:45:57 2005
@@ -33,7 +33,6 @@
 import org.apache.tapestry.event.PageDetachListener;
 import org.apache.tapestry.event.PageEvent;
 import org.apache.tapestry.util.DefaultPrimaryKeyConverter;
-import org.apache.tapestry.vlib.VirtualLibraryEngine;
 import org.apache.tapestry.vlib.VlibPage;
 import org.apache.tapestry.vlib.ejb.Publisher;
 import org.apache.tapestry.vlib.pages.MyLibrary;

Added: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ApplicationLifecycle.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ApplicationLifecycle.java?rev=321341&view=auto
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ApplicationLifecycle.java (added)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ApplicationLifecycle.java Sat Oct 15 07:45:57 2005
@@ -0,0 +1,36 @@
+// Copyright 2005 The Apache Software Foundation
+//
+// Licensed 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.tapestry.vlib.services;
+
+/**
+ * Threaded (i.e. per-request) service that stores lifecycle operations and actions; used to control
+ * logout behavior.
+ * 
+ * @author Howard M. Lewis Ship
+ * @since 4.0
+ */
+public interface ApplicationLifecycle
+{
+    /**
+     * Logs the user out of the systems; sets a flag that causes the session to be discarded at the
+     * end of the request.
+     */
+    void logout();
+
+    /**
+     * If true, then the session (if it exists) should be discarded at the end of the request.
+     */
+    boolean getDiscardSession();
+}

Added: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ApplicationLifecycleImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ApplicationLifecycleImpl.java?rev=321341&view=auto
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ApplicationLifecycleImpl.java (added)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ApplicationLifecycleImpl.java Sat Oct 15 07:45:57 2005
@@ -0,0 +1,53 @@
+// Copyright 2005 The Apache Software Foundation
+//
+// Licensed 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.tapestry.vlib.services;
+
+import org.apache.tapestry.engine.state.ApplicationStateManager;
+import org.apache.tapestry.vlib.Visit;
+
+/**
+ * Implementation of service vlib.ApplicationLifecycle. Uses the threaded model.
+ * 
+ * @author Howard M. Lewis Ship
+ * @since 4.0
+ */
+public class ApplicationLifecycleImpl implements ApplicationLifecycle
+{
+    private boolean _discardSession;
+
+    private ApplicationStateManager _stateManager;
+
+    public void setStateManager(ApplicationStateManager stateManager)
+    {
+        _stateManager = stateManager;
+    }
+
+    public void logout()
+    {
+        _discardSession = true;
+
+        if (_stateManager.exists("visit"))
+        {
+            Visit visit = (Visit) _stateManager.get("visit");
+            visit.setUser(null);
+        }
+    }
+
+    public boolean getDiscardSession()
+    {
+        return _discardSession;
+    }
+
+}

Added: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/DiscardSessionFilter.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/DiscardSessionFilter.java?rev=321341&view=auto
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/DiscardSessionFilter.java (added)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/DiscardSessionFilter.java Sat Oct 15 07:45:57 2005
@@ -0,0 +1,70 @@
+// Copyright 2005 The Apache Software Foundation
+//
+// Licensed 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.tapestry.vlib.services;
+
+import java.io.IOException;
+
+import org.apache.tapestry.services.WebRequestServicer;
+import org.apache.tapestry.services.WebRequestServicerFilter;
+import org.apache.tapestry.web.WebRequest;
+import org.apache.tapestry.web.WebResponse;
+import org.apache.tapestry.web.WebSession;
+
+/**
+ * Filter, injected into the tapestry.request.WebRequestServicerPipeline configuration, that
+ * optionally discards the session at the end of the request (after a logout, typically).
+ * 
+ * @author Howard M. Lewis Ship
+ * @see org.apache.tapestry.vlib.services.ApplicationLifecycle#getDiscardSession()
+ * @since 4.0
+ */
+public class DiscardSessionFilter implements WebRequestServicerFilter
+{
+    private ApplicationLifecycle _applicationLifecycle;
+
+    public void service(WebRequest request, WebResponse response, WebRequestServicer servicer)
+            throws IOException
+    {
+        try
+        {
+            servicer.service(request, response);
+        }
+        finally
+        {
+            if (_applicationLifecycle.getDiscardSession())
+                discardSession(request);
+        }
+    }
+
+    private void discardSession(WebRequest request)
+    {
+        WebSession session = request.getSession(false);
+
+        if (session != null)
+            try
+            {
+                session.invalidate();
+            }
+            catch (IllegalStateException ex)
+            {
+                // Ignore.
+            }
+    }
+
+    public void setApplicationLifecycle(ApplicationLifecycle applicationLifecycle)
+    {
+        _applicationLifecycle = applicationLifecycle;
+    }
+}

Modified: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ModelSource.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ModelSource.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ModelSource.java (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ModelSource.java Sat Oct 15 07:45:57 2005
@@ -1,3 +1,17 @@
+// Copyright 2005 The Apache Software Foundation
+//
+// Licensed 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.tapestry.vlib.services;
 
 import org.apache.tapestry.form.IPropertySelectionModel;

Modified: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ModelSourceImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ModelSourceImpl.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ModelSourceImpl.java (original)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/ModelSourceImpl.java Sat Oct 15 07:45:57 2005
@@ -1,3 +1,17 @@
+// Copyright 2005 The Apache Software Foundation
+//
+// Licensed 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.tapestry.vlib.services;
 
 import java.rmi.RemoteException;

Added: jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/VlibStaleSessionPresenter.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/VlibStaleSessionPresenter.java?rev=321341&view=auto
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/VlibStaleSessionPresenter.java (added)
+++ jakarta/tapestry/trunk/examples/Vlib/src/java/org/apache/tapestry/vlib/services/VlibStaleSessionPresenter.java Sat Oct 15 07:45:57 2005
@@ -0,0 +1,53 @@
+// Copyright 2005 The Apache Software Foundation
+//
+// Licensed 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.tapestry.vlib.services;
+
+import java.io.IOException;
+
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.StaleSessionException;
+import org.apache.tapestry.error.StaleSessionExceptionPresenter;
+import org.apache.tapestry.services.ResponseRenderer;
+import org.apache.tapestry.vlib.IMessageProperty;
+
+/**
+ * Implementation of {@link org.apache.tapestry.error.StaleSessionExceptionPresenter} that returns
+ * the user to the home page and displays an error message there.
+ * 
+ * @author Howard M. Lewis Ship
+ * @since 4.0
+ */
+public class VlibStaleSessionPresenter implements StaleSessionExceptionPresenter
+{
+    private ResponseRenderer _responseRenderer;
+
+    public void presentStaleSessionException(IRequestCycle cycle, StaleSessionException cause)
+            throws IOException
+    {
+        IMessageProperty home = (IMessageProperty) cycle.getPage("Home");
+
+        home.setMessage("You have been logged out due to inactivity.");
+
+        cycle.activate(home);
+
+        _responseRenderer.renderResponse(cycle);
+    }
+
+    public void setResponseRenderer(ResponseRenderer responseRenderer)
+    {
+        _responseRenderer = responseRenderer;
+    }
+
+}

Added: jakarta/tapestry/trunk/examples/Vlib/src/test/org/apache/tapestry/vlib/services/DiscardSessionFilterTest.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Vlib/src/test/org/apache/tapestry/vlib/services/DiscardSessionFilterTest.java?rev=321341&view=auto
==============================================================================
--- jakarta/tapestry/trunk/examples/Vlib/src/test/org/apache/tapestry/vlib/services/DiscardSessionFilterTest.java (added)
+++ jakarta/tapestry/trunk/examples/Vlib/src/test/org/apache/tapestry/vlib/services/DiscardSessionFilterTest.java Sat Oct 15 07:45:57 2005
@@ -0,0 +1,201 @@
+// Copyright 2005 The Apache Software Foundation
+//
+// Licensed 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.tapestry.vlib.services;
+
+import java.io.IOException;
+
+import org.apache.hivemind.test.HiveMindTestCase;
+import org.apache.tapestry.services.WebRequestServicer;
+import org.apache.tapestry.web.WebRequest;
+import org.apache.tapestry.web.WebResponse;
+import org.apache.tapestry.web.WebSession;
+
+/**
+ * Tests for {@link org.apache.tapestry.vlib.services.DiscardSessionFilter}.
+ * 
+ * @author Howard M. Lewis Ship
+ * @since 4.0
+ */
+public class DiscardSessionFilterTest extends HiveMindTestCase
+{
+    public void testNormal() throws Exception
+    {
+        WebRequest request = newRequest();
+        WebResponse response = newResponse();
+        WebRequestServicer servicer = newServicer();
+        ApplicationLifecycle lifecycle = newLifecycle();
+
+        servicer.service(request, response);
+
+        trainGetDiscardSession(lifecycle, false);
+
+        replayControls();
+
+        DiscardSessionFilter filter = new DiscardSessionFilter();
+
+        filter.setApplicationLifecycle(lifecycle);
+
+        filter.service(request, response, servicer);
+
+        verifyControls();
+    }
+
+    public void testDiscard() throws Exception
+    {
+        WebRequest request = newRequest();
+        WebResponse response = newResponse();
+        WebRequestServicer servicer = newServicer();
+        ApplicationLifecycle lifecycle = newLifecycle();
+        WebSession session = newSession();
+
+        servicer.service(request, response);
+
+        trainGetDiscardSession(lifecycle, true);
+
+        trainGetSession(request, session);
+
+        session.invalidate();
+
+        replayControls();
+
+        DiscardSessionFilter filter = new DiscardSessionFilter();
+
+        filter.setApplicationLifecycle(lifecycle);
+
+        filter.service(request, response, servicer);
+
+        verifyControls();
+    }
+
+    public void testDiscardNoSession() throws Exception
+    {
+        WebRequest request = newRequest();
+        WebResponse response = newResponse();
+        WebRequestServicer servicer = newServicer();
+        ApplicationLifecycle lifecycle = newLifecycle();
+
+        servicer.service(request, response);
+
+        trainGetDiscardSession(lifecycle, true);
+
+        trainGetSession(request, null);
+
+        replayControls();
+
+        DiscardSessionFilter filter = new DiscardSessionFilter();
+
+        filter.setApplicationLifecycle(lifecycle);
+
+        filter.service(request, response, servicer);
+
+        verifyControls();
+    }
+
+    public void testDiscardSessionIllegalState() throws Exception
+    {
+        WebRequest request = newRequest();
+        WebResponse response = newResponse();
+        WebRequestServicer servicer = newServicer();
+        ApplicationLifecycle lifecycle = newLifecycle();
+        WebSession session = newSession();
+
+        servicer.service(request, response);
+
+        trainGetDiscardSession(lifecycle, true);
+
+        trainGetSession(request, session);
+
+        session.invalidate();
+        setThrowable(session, new IllegalStateException());
+
+        replayControls();
+
+        DiscardSessionFilter filter = new DiscardSessionFilter();
+
+        filter.setApplicationLifecycle(lifecycle);
+
+        filter.service(request, response, servicer);
+
+        verifyControls();
+    }
+
+    public void testDiscardCheckAfterException() throws Exception
+    {
+        WebRequest request = newRequest();
+        WebResponse response = newResponse();
+        WebRequestServicer servicer = newServicer();
+        ApplicationLifecycle lifecycle = newLifecycle();
+
+        servicer.service(request, response);
+        setThrowable(servicer, new IOException());
+
+        trainGetDiscardSession(lifecycle, false);
+
+        replayControls();
+
+        DiscardSessionFilter filter = new DiscardSessionFilter();
+
+        filter.setApplicationLifecycle(lifecycle);
+
+        try
+        {
+            filter.service(request, response, servicer);
+            unreachable();
+        }
+        catch (IOException ex)
+        {
+            // Expected.
+        }
+
+        verifyControls();
+    }
+
+    private ApplicationLifecycle newLifecycle()
+    {
+        return (ApplicationLifecycle) newMock(ApplicationLifecycle.class);
+    }
+
+    private WebRequestServicer newServicer()
+    {
+        return (WebRequestServicer) newMock(WebRequestServicer.class);
+    }
+
+    private WebResponse newResponse()
+    {
+        return (WebResponse) newMock(WebResponse.class);
+    }
+
+    private WebRequest newRequest()
+    {
+        return (WebRequest) newMock(WebRequest.class);
+    }
+
+    private WebSession newSession()
+    {
+        return (WebSession) newMock(WebSession.class);
+    }
+
+    private void trainGetSession(WebRequest request, WebSession session)
+    {
+        request.getSession(false);
+        setReturnValue(request, session);
+    }
+
+    private void trainGetDiscardSession(ApplicationLifecycle lifecycle, boolean discard)
+    {
+        lifecycle.getDiscardSession();
+        setReturnValue(lifecycle, discard);
+    }
+}

Modified: jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.error.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.error.xml?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.error.xml (original)
+++ jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.error.xml Sat Oct 15 07:45:57 2005
@@ -70,8 +70,6 @@
       <construct class="StaleSessionExceptionPresenterImpl">
         <set-object property="pageName" 
                        value="infrastructure:staleSessionPageName"/>
-        <set-object property="requestExceptionReporter"
-                       value="infrastructure:requestExceptionReporter"/>
         <set-object property="responseRenderer"
                       value="infrastructure:responseRenderer"/>
       </construct>
@@ -88,8 +86,6 @@
       <construct class="StaleLinkExceptionPresenterImpl">
         <set-object property="pageName" 
                        value="infrastructure:staleLinkPageName"/>
-        <set-object property="requestExceptionReporter"
-                       value="infrastructure:requestExceptionReporter"/>
         <set-object property="responseRenderer"
                       value="infrastructure:responseRenderer"/>
       </construct>

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/engine/AbstractEngine.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/engine/AbstractEngine.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/engine/AbstractEngine.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/engine/AbstractEngine.java Sat Oct 15 07:45:57 2005
@@ -365,6 +365,7 @@
      */
 
     protected void handleStaleLinkException(IRequestCycle cycle, StaleLinkException exception)
+            throws IOException
     {
         _infrastructure.getStaleLinkExceptionPresenter()
                 .presentStaleLinkException(cycle, exception);
@@ -384,6 +385,7 @@
      */
 
     protected void handleStaleSessionException(IRequestCycle cycle, StaleSessionException exception)
+            throws IOException
     {
         _infrastructure.getStaleSessionExceptionPresenter().presentStaleSessionException(
                 cycle,

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleLinkExceptionPresenter.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleLinkExceptionPresenter.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleLinkExceptionPresenter.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleLinkExceptionPresenter.java Sat Oct 15 07:45:57 2005
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.error;
 
+import java.io.IOException;
+
 import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.StaleLinkException;
 
@@ -33,5 +35,6 @@
      * @param cause
      *            the exception that was caught
      */
-    public void presentStaleLinkException(IRequestCycle cycle, StaleLinkException cause);
+    public void presentStaleLinkException(IRequestCycle cycle, StaleLinkException cause)
+            throws IOException;
 }

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleLinkExceptionPresenterImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleLinkExceptionPresenterImpl.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleLinkExceptionPresenterImpl.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleLinkExceptionPresenterImpl.java Sat Oct 15 07:45:57 2005
@@ -14,7 +14,9 @@
 
 package org.apache.tapestry.error;
 
-import org.apache.hivemind.ApplicationRuntimeException;
+import java.io.IOException;
+
+import org.apache.hivemind.util.PropertyUtils;
 import org.apache.tapestry.IPage;
 import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.StaleLinkException;
@@ -30,53 +32,25 @@
  */
 public class StaleLinkExceptionPresenterImpl implements StaleLinkExceptionPresenter
 {
-    private RequestExceptionReporter _requestExceptionReporter;
-
     private ResponseRenderer _responseRenderer;
 
     private String _pageName;
 
     public void presentStaleLinkException(IRequestCycle cycle, StaleLinkException cause)
+            throws IOException
     {
-        try
-        {
-            IPage exceptionPage = cycle.getPage(_pageName);
-
-            exceptionPage.setProperty("message", cause.getMessage());
-
-            cycle.activate(exceptionPage);
-
-            _responseRenderer.renderResponse(cycle);
-        }
-        catch (Throwable ex)
-        {
-            // Worst case scenario. The exception page itself is broken, leaving
-            // us with no option but to write the cause to the output.
-
-            _requestExceptionReporter.reportRequestException(ErrorMessages
-                    .unableToProcessClientRequest(cause), cause);
+        IPage exceptionPage = cycle.getPage(_pageName);
 
-            // Also, write the exception thrown when redendering the exception
-            // page, so that can get fixed as well.
+        PropertyUtils.write(exceptionPage, "message", cause.getMessage());
 
-            _requestExceptionReporter.reportRequestException(ErrorMessages
-                    .unableToPresentExceptionPage(ex), ex);
-
-            // And throw the exception.
-
-            throw new ApplicationRuntimeException(ex.getMessage(), ex);
-        }
+        cycle.activate(exceptionPage);
 
+        _responseRenderer.renderResponse(cycle);
     }
 
     public void setPageName(String pageName)
     {
         _pageName = pageName;
-    }
-
-    public void setRequestExceptionReporter(RequestExceptionReporter requestExceptionReporter)
-    {
-        _requestExceptionReporter = requestExceptionReporter;
     }
 
     public void setResponseRenderer(ResponseRenderer responseRenderer)

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleSessionExceptionPresenter.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleSessionExceptionPresenter.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleSessionExceptionPresenter.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleSessionExceptionPresenter.java Sat Oct 15 07:45:57 2005
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.error;
 
+import java.io.IOException;
+
 import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.StaleSessionException;
 
@@ -33,5 +35,6 @@
      * @param cause
      *            the exception that was caught
      */
-    public void presentStaleSessionException(IRequestCycle cycle, StaleSessionException cause);
+    public void presentStaleSessionException(IRequestCycle cycle, StaleSessionException cause)
+            throws IOException;
 }

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleSessionExceptionPresenterImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleSessionExceptionPresenterImpl.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleSessionExceptionPresenterImpl.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/error/StaleSessionExceptionPresenterImpl.java Sat Oct 15 07:45:57 2005
@@ -14,7 +14,8 @@
 
 package org.apache.tapestry.error;
 
-import org.apache.hivemind.ApplicationRuntimeException;
+import java.io.IOException;
+
 import org.apache.tapestry.IPage;
 import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.StaleSessionException;
@@ -29,51 +30,23 @@
  */
 public class StaleSessionExceptionPresenterImpl implements StaleSessionExceptionPresenter
 {
-    private RequestExceptionReporter _requestExceptionReporter;
-
     private ResponseRenderer _responseRenderer;
 
     private String _pageName;
 
     public void presentStaleSessionException(IRequestCycle cycle, StaleSessionException cause)
+            throws IOException
     {
-        try
-        {
-            IPage exceptionPage = cycle.getPage(_pageName);
-
-            cycle.activate(exceptionPage);
-
-            _responseRenderer.renderResponse(cycle);
-        }
-        catch (Exception ex)
-        {
-            // Worst case scenario. The exception page itself is broken, leaving
-            // us with no option but to write the cause to the output.
-
-            _requestExceptionReporter.reportRequestException(ErrorMessages
-                    .unableToProcessClientRequest(cause), cause);
-
-            // Also, write the exception thrown when redendering the exception
-            // page, so that can get fixed as well.
+        IPage exceptionPage = cycle.getPage(_pageName);
 
-            _requestExceptionReporter.reportRequestException(ErrorMessages
-                    .unableToPresentExceptionPage(ex), ex);
-
-            // And throw the exception.
-
-            throw new ApplicationRuntimeException(ex.getMessage(), ex);
-        }
+        cycle.activate(exceptionPage);
 
+        _responseRenderer.renderResponse(cycle);
     }
 
     public void setPageName(String pageName)
     {
         _pageName = pageName;
-    }
-
-    public void setRequestExceptionReporter(RequestExceptionReporter requestExceptionReporter)
-    {
-        _requestExceptionReporter = requestExceptionReporter;
     }
 
     public void setResponseRenderer(ResponseRenderer responseRenderer)

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/ServletWebSession.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/ServletWebSession.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/ServletWebSession.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/ServletWebSession.java Sat Oct 15 07:45:57 2005
@@ -43,7 +43,7 @@
     {
         receiver.describeAlternate(_httpSession);
     }
-    
+
     public List getAttributeNames()
     {
         return WebUtils.toSortedList(_httpSession.getAttributeNames());
@@ -70,5 +70,10 @@
     public boolean isNew()
     {
         return _httpSession.isNew();
+    }
+
+    public void invalidate()
+    {
+        _httpSession.invalidate();
     }
 }

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/WebSession.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/WebSession.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/WebSession.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/web/WebSession.java Sat Oct 15 07:45:57 2005
@@ -37,4 +37,13 @@
      * to join the session.
      */
     public boolean isNew();
+
+    /**
+     * Invalidates this session then unbinds any objects bound to it.
+     * 
+     * @throws IllegalStateException
+     *             if the session is already invalidated.
+     */
+
+    public void invalidate();
 }

Copied: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/error/StaleSessionExceptionPresenterTest.java (from r321214, jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/error/TestStaleSessionExceptionPresenter.java)
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/error/StaleSessionExceptionPresenterTest.java?p2=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/error/StaleSessionExceptionPresenterTest.java&p1=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/error/TestStaleSessionExceptionPresenter.java&r1=321214&r2=321341&rev=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/error/TestStaleSessionExceptionPresenter.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/error/StaleSessionExceptionPresenterTest.java Sat Oct 15 07:45:57 2005
@@ -14,7 +14,6 @@
 
 package org.apache.tapestry.error;
 
-import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.tapestry.IPage;
 import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.StaleSessionException;
@@ -26,7 +25,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class TestStaleSessionExceptionPresenter extends BaseErrorTestCase
+public class StaleSessionExceptionPresenterTest extends BaseErrorTestCase
 {
     public void testSuccess() throws Exception
     {
@@ -48,41 +47,4 @@
         verifyControls();
     }
 
-    public void testFailure() throws Exception
-    {
-        StaleSessionException cause = new StaleSessionException();
-        Throwable renderCause = new ApplicationRuntimeException("Some failure.");
-
-        IPage page = newPage();
-
-        IRequestCycle cycle = newCycle("StaleSession", page);
-        ResponseRenderer renderer = newRenderer(cycle, renderCause);
-        RequestExceptionReporter reporter = newReporter();
-
-        cycle.activate(page);
-
-        reporter.reportRequestException(ErrorMessages.unableToProcessClientRequest(cause), cause);
-        reporter.reportRequestException(
-                ErrorMessages.unableToPresentExceptionPage(renderCause),
-                renderCause);
-
-        replayControls();
-
-        StaleSessionExceptionPresenterImpl presenter = new StaleSessionExceptionPresenterImpl();
-        presenter.setPageName("StaleSession");
-        presenter.setResponseRenderer(renderer);
-        presenter.setRequestExceptionReporter(reporter);
-
-        try
-        {
-            presenter.presentStaleSessionException(cycle, cause);
-            unreachable();
-        }
-        catch (ApplicationRuntimeException ex)
-        {
-            assertSame(renderCause, ex.getRootCause());
-        }
-
-        verifyControls();
-    }
 }

Copied: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/ServletWebSessionTest.java (from r321214, jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/TestServletWebSession.java)
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/ServletWebSessionTest.java?p2=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/ServletWebSessionTest.java&p1=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/TestServletWebSession.java&r1=321214&r2=321341&rev=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/TestServletWebSession.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/web/ServletWebSessionTest.java Sat Oct 15 07:45:57 2005
@@ -28,15 +28,14 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class TestServletWebSession extends BaseWebTestCase
+public class ServletWebSessionTest extends BaseWebTestCase
 {
     public void testGetAttributeNames()
     {
-        MockControl control = newControl(HttpSession.class);
-        HttpSession session = (HttpSession) control.getMock();
+        HttpSession session = newSession();
 
         session.getAttributeNames();
-        control.setReturnValue(newEnumeration());
+        setReturnValue(session, newEnumeration());
 
         replayControls();
 
@@ -49,15 +48,19 @@
         verifyControls();
     }
 
+    private HttpSession newSession()
+    {
+        return (HttpSession) newMock(HttpSession.class);
+    }
+
     public void testGetAttribute()
     {
         Object attribute = new Object();
 
-        MockControl control = newControl(HttpSession.class);
-        HttpSession session = (HttpSession) control.getMock();
+        HttpSession session = newSession();
 
         session.getAttribute("attr");
-        control.setReturnValue(attribute);
+        setReturnValue(session, attribute);
 
         replayControls();
 
@@ -72,8 +75,7 @@
     {
         Object attribute = new Object();
 
-        MockControl control = newControl(HttpSession.class);
-        HttpSession session = (HttpSession) control.getMock();
+        HttpSession session = newSession();
 
         session.setAttribute("name", attribute);
 
@@ -88,8 +90,7 @@
 
     public void testSetAttributeToNull()
     {
-        MockControl control = newControl(HttpSession.class);
-        HttpSession session = (HttpSession) control.getMock();
+        HttpSession session = newSession();
 
         session.removeAttribute("tonull");
 
@@ -104,17 +105,31 @@
 
     public void testGetId()
     {
-        MockControl control = newControl(HttpSession.class);
-        HttpSession session = (HttpSession) control.getMock();
+        HttpSession session = newSession();
 
         session.getId();
-        control.setReturnValue("abc");
+        setReturnValue(session, "abc");
 
         replayControls();
 
         WebSession ws = new ServletWebSession(session);
 
         assertEquals("abc", ws.getId());
+
+        verifyControls();
+    }
+
+    public void testInvalidate()
+    {
+        HttpSession session = newSession();
+
+        session.invalidate();
+
+        replayControls();
+
+        WebSession ws = new ServletWebSession(session);
+
+        ws.invalidate();
 
         verifyControls();
     }

Modified: jakarta/tapestry/trunk/portlet/src/descriptor/META-INF/hivemodule.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/portlet/src/descriptor/META-INF/hivemodule.xml?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/portlet/src/descriptor/META-INF/hivemodule.xml (original)
+++ jakarta/tapestry/trunk/portlet/src/descriptor/META-INF/hivemodule.xml Sat Oct 15 07:45:57 2005
@@ -272,8 +272,6 @@
     <invoke-factory>
       <construct class="PortletStaleSessionExceptionPresenter">
         <set-service property="globals" service-id="PortletRequestGlobals"/>
-        <set-object property="requestExceptionReporter"
-                       value="infrastructure:requestExceptionReporter"/>   
       </construct>
     </invoke-factory>
     
@@ -286,8 +284,6 @@
     <invoke-factory>
       <construct class="PortletStaleLinkExceptionPresenter">
         <set-service property="globals" service-id="PortletRequestGlobals"/>
-        <set-object property="requestExceptionReporter"
-                       value="infrastructure:requestExceptionReporter"/>   
       </construct>
     </invoke-factory>
     

Modified: jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletStaleLinkExceptionPresenter.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletStaleLinkExceptionPresenter.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletStaleLinkExceptionPresenter.java (original)
+++ jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletStaleLinkExceptionPresenter.java Sat Oct 15 07:45:57 2005
@@ -14,13 +14,13 @@
 
 package org.apache.tapestry.portlet;
 
+import java.io.IOException;
+
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 
-import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.StaleLinkException;
-import org.apache.tapestry.error.RequestExceptionReporter;
 import org.apache.tapestry.error.StaleLinkExceptionPresenter;
 import org.apache.tapestry.services.ServiceConstants;
 
@@ -34,49 +34,22 @@
 {
     private PortletRequestGlobals _globals;
 
-    private RequestExceptionReporter _requestExceptionReporter;
-
     public void presentStaleLinkException(IRequestCycle cycle, StaleLinkException cause)
+            throws IOException
     {
-        try
-        {
-            ActionRequest request = _globals.getActionRequest();
-
-            request.getPortletSession(true).setAttribute(
-                    PortletConstants.PORTLET_EXCEPTION_MARKUP_ATTRIBUTE,
-                    cause.getMessage());
-
-            ActionResponse response = _globals.getActionResponse();
-
-            response.setRenderParameter(
-                    ServiceConstants.SERVICE,
-                    PortletConstants.EXCEPTION_SERVICE);
-        }
-        catch (Exception ex)
-        {
-            // Worst case scenario. The exception page itself is broken, leaving
-            // us with no option but to write the cause to the output.
-
-            // Also, write the exception thrown when redendering the exception
-            // page, so that can get fixed as well.
+        ActionRequest request = _globals.getActionRequest();
 
-            _requestExceptionReporter.reportRequestException(PortletMessages
-                    .errorReportingException(ex), ex);
+        request.getPortletSession(true).setAttribute(
+                PortletConstants.PORTLET_EXCEPTION_MARKUP_ATTRIBUTE,
+                cause.getMessage());
 
-            // And throw the exception.
+        ActionResponse response = _globals.getActionResponse();
 
-            throw new ApplicationRuntimeException(ex.getMessage(), ex);
-        }
+        response.setRenderParameter(ServiceConstants.SERVICE, PortletConstants.EXCEPTION_SERVICE);
     }
 
     public void setGlobals(PortletRequestGlobals globals)
     {
         _globals = globals;
     }
-
-    public void setRequestExceptionReporter(RequestExceptionReporter requestExceptionReporter)
-    {
-        _requestExceptionReporter = requestExceptionReporter;
-    }
-
 }

Modified: jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletStaleSessionExceptionPresenter.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletStaleSessionExceptionPresenter.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletStaleSessionExceptionPresenter.java (original)
+++ jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletStaleSessionExceptionPresenter.java Sat Oct 15 07:45:57 2005
@@ -32,50 +32,23 @@
 {
     private PortletRequestGlobals _globals;
 
-    private RequestExceptionReporter _requestExceptionReporter;
-
     public void presentStaleSessionException(IRequestCycle cycle, StaleSessionException cause)
     {
-        try
-        {
-            String markup = PortletMessages.staleSession();
-
-            ActionRequest request = _globals.getActionRequest();
-
-            request.getPortletSession(true).setAttribute(
-                    PortletConstants.PORTLET_EXCEPTION_MARKUP_ATTRIBUTE,
-                    markup);
-
-            ActionResponse response = _globals.getActionResponse();
+        String markup = PortletMessages.staleSession();
 
-            response.setRenderParameter(
-                    ServiceConstants.SERVICE,
-                    PortletConstants.EXCEPTION_SERVICE);
-        }
-        catch (Exception ex)
-        {
-            // Worst case scenario. The exception page itself is broken, leaving
-            // us with no option but to write the cause to the output.
+        ActionRequest request = _globals.getActionRequest();
 
-            // Also, write the exception thrown when redendering the exception
-            // page, so that can get fixed as well.
+        request.getPortletSession(true).setAttribute(
+                PortletConstants.PORTLET_EXCEPTION_MARKUP_ATTRIBUTE,
+                markup);
 
-            _requestExceptionReporter.reportRequestException(PortletMessages
-                    .errorReportingException(ex), ex);
+        ActionResponse response = _globals.getActionResponse();
 
-            // And throw the exception.
-
-            throw new ApplicationRuntimeException(ex.getMessage(), ex);
-        }
+        response.setRenderParameter(ServiceConstants.SERVICE, PortletConstants.EXCEPTION_SERVICE);
     }
 
     public void setGlobals(PortletRequestGlobals globals)
     {
         _globals = globals;
-    }
-
-    public void setRequestExceptionReporter(RequestExceptionReporter requestExceptionReporter)
-    {
-        _requestExceptionReporter = requestExceptionReporter;
     }
 }

Modified: jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletWebSession.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletWebSession.java?rev=321341&r1=321340&r2=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletWebSession.java (original)
+++ jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletWebSession.java Sat Oct 15 07:45:57 2005
@@ -70,4 +70,9 @@
         _portletSession.setAttribute(name, attribute);
     }
 
+    public void invalidate()
+    {
+        _portletSession.invalidate();
+    }
+
 }

Copied: jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/PortletWebSessionTest.java (from r321214, jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/TestPortletWebSession.java)
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/PortletWebSessionTest.java?p2=jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/PortletWebSessionTest.java&p1=jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/TestPortletWebSession.java&r1=321214&r2=321341&rev=321341&view=diff
==============================================================================
--- jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/TestPortletWebSession.java (original)
+++ jakarta/tapestry/trunk/portlet/src/test/org/apache/tapestry/portlet/PortletWebSessionTest.java Sat Oct 15 07:45:57 2005
@@ -28,16 +28,15 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class TestPortletWebSession extends BasePortletWebTestCase
+public class PortletWebSessionTest extends BasePortletWebTestCase
 {
 
     public void testGetAttributeNames()
     {
-        MockControl control = newControl(PortletSession.class);
-        PortletSession session = (PortletSession) control.getMock();
+        PortletSession session = newSession();
 
         session.getAttributeNames();
-        control.setReturnValue(newEnumeration());
+        setReturnValue(session, newEnumeration());
 
         replayControls();
 
@@ -50,15 +49,19 @@
         verifyControls();
     }
 
+    private PortletSession newSession()
+    {
+        return (PortletSession) newMock(PortletSession.class);
+    }
+
     public void testGetAttribute()
     {
         Object attribute = new Object();
 
-        MockControl control = newControl(PortletSession.class);
-        PortletSession session = (PortletSession) control.getMock();
+        PortletSession session = newSession();
 
         session.getAttribute("attr");
-        control.setReturnValue(attribute);
+        setReturnValue(session, attribute);
 
         replayControls();
 
@@ -73,8 +76,7 @@
     {
         Object attribute = new Object();
 
-        MockControl control = newControl(PortletSession.class);
-        PortletSession session = (PortletSession) control.getMock();
+        PortletSession session = newSession();
 
         session.setAttribute("name", attribute);
 
@@ -87,20 +89,33 @@
         verifyControls();
     }
 
-
     public void testGetId()
     {
-        MockControl control = newControl(PortletSession.class);
-        PortletSession session = (PortletSession) control.getMock();
+        PortletSession session = newSession();
 
         session.getId();
-        control.setReturnValue("abc");
+        setReturnValue(session, "abc");
 
         replayControls();
 
         WebSession ws = new PortletWebSession(session);
 
         assertEquals("abc", ws.getId());
+
+        verifyControls();
+    }
+
+    public void testInvalidate()
+    {
+        PortletSession session = newSession();
+
+        session.invalidate();
+
+        replayControls();
+
+        WebSession ws = new PortletWebSession(session);
+
+        ws.invalidate();
 
         verifyControls();
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org