You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by jk...@apache.org on 2006/12/01 05:50:05 UTC

svn commit: r481150 - in /tapestry/tapestry4/trunk: ./ tapestry-examples/Workbench/src/context/ tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/fields/ tapestry-framework/src/descriptor/META-INF/ tapestry-framework/src/java/org/apach...

Author: jkuhnert
Date: Thu Nov 30 20:50:01 2006
New Revision: 481150

URL: http://svn.apache.org/viewvc?view=rev&rev=481150
Log:
Fixes TAPESTRY-1140 . What a bitch that was. 

Modified:
    tapestry/tapestry4/trunk/pom.xml
    tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Fields.html
    tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/FieldsResults.html
    tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/fields/Fields.java
    tapestry/tapestry4/trunk/tapestry-framework/src/descriptor/META-INF/tapestry.services.xml
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/AbstractEngine.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/ResponseBuilder.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseBuilder.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseContributorImpl.java
    tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/core.js
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/services/impl/DojoAjaxResponseBuilderTest.java

Modified: tapestry/tapestry4/trunk/pom.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/pom.xml?view=diff&rev=481150&r1=481149&r2=481150
==============================================================================
--- tapestry/tapestry4/trunk/pom.xml (original)
+++ tapestry/tapestry4/trunk/pom.xml Thu Nov 30 20:50:01 2006
@@ -277,6 +277,7 @@
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-source-plugin</artifactId>
+                    <version>2.0.2-SNAPSHOT</version>
                     <inherited>true</inherited>
                 </plugin>
                 <plugin>

Modified: tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Fields.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Fields.html?view=diff&rev=481150&r1=481149&r2=481150
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Fields.html (original)
+++ tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Fields.html Thu Nov 30 20:50:01 2006
@@ -76,7 +76,7 @@
       	<td></td>
   		<td>
       	Or, use a LinkSubmit component:   
-      	<a jwcid="continueLink@LinkSubmit" listener="listener:doByLink">Continue</a>
+      	<a jwcid="continueLink@LinkSubmit" listener="listener:doByLink" async="true">Continue</a>
         </td>
   </tr>
   

Modified: tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/FieldsResults.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/FieldsResults.html?view=diff&rev=481150&r1=481149&r2=481150
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/FieldsResults.html (original)
+++ tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/FieldsResults.html Thu Nov 30 20:50:01 2006
@@ -61,5 +61,6 @@
 <p>
 
 <a jwcid="@PageLink" page="Fields"><img jwcid="backRollover" alt="[Back]"/></a>
+</p>
 
 </span>

Modified: tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/fields/Fields.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/fields/Fields.java?view=diff&rev=481150&r1=481149&r2=481150
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/fields/Fields.java (original)
+++ tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/fields/Fields.java Thu Nov 30 20:50:01 2006
@@ -57,11 +57,6 @@
         return getResultsPage();
     }
     
-    public void testSubmit()
-    {
-        System.out.println("\n\n=======================\ntestSubmit() called\n");
-    }
-    
     public void doByLink()
     {
         getResultsPage().setByLink(true);

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/descriptor/META-INF/tapestry.services.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/descriptor/META-INF/tapestry.services.xml?view=diff&rev=481150&r1=481149&r2=481150
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/descriptor/META-INF/tapestry.services.xml (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/descriptor/META-INF/tapestry.services.xml Thu Nov 30 20:50:01 2006
@@ -239,6 +239,7 @@
                 <set-object property="staleSessionPageName" value="infrastructure:staleSessionPageName" />
                 <set-object property="staleLinkPageName" value="infrastructure:staleLinkPageName" />
                 <set-object property="assetFactory" value="infrastructure:assetFactory" />
+                <set-service property="pageService" service-id="tapestry.services.Page" />
             </construct>
         </invoke-factory>
     </service-point>

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/AbstractEngine.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/AbstractEngine.java?view=diff&rev=481150&r1=481149&r2=481150
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/AbstractEngine.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/AbstractEngine.java Thu Nov 30 20:50:01 2006
@@ -19,7 +19,6 @@
 import java.util.List;
 import java.util.Locale;
 
-import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 
@@ -289,7 +288,7 @@
             }
         }
     }
-
+    
     /**
      * Handles {@link PageRedirectException} which involves executing
      * {@link IRequestCycle#activate(IPage)} on the target page (of the exception), until either a

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/ResponseBuilder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/ResponseBuilder.java?view=diff&rev=481150&r1=481149&r2=481150
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/ResponseBuilder.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/ResponseBuilder.java Thu Nov 30 20:50:01 2006
@@ -72,7 +72,12 @@
      * The response exception type.
      */
     String EXCEPTION_TYPE = "exception";
-
+    
+    /**
+     * The response element type denoting a brand new page render.
+     */
+    String PAGE_TYPE = "page";
+    
     String SCRIPT_TYPE = "script";
     
     String BODY_SCRIPT = "bodyscript";

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseBuilder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseBuilder.java?view=diff&rev=481150&r1=481149&r2=481150
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseBuilder.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseBuilder.java Thu Nov 30 20:50:01 2006
@@ -32,6 +32,7 @@
 import org.apache.tapestry.NestedMarkupWriter;
 import org.apache.tapestry.TapestryUtils;
 import org.apache.tapestry.asset.AssetFactory;
+import org.apache.tapestry.engine.IEngineService;
 import org.apache.tapestry.engine.NullWriter;
 import org.apache.tapestry.markup.MarkupWriterSource;
 import org.apache.tapestry.markup.NestedMarkupWriterImpl;
@@ -75,6 +76,14 @@
     
     private IRequestCycle _cycle;
     
+    private IEngineService _pageService;
+    
+    /**
+     * Keeps track of renders involving a whole page response, such 
+     * as exception pages or pages activated via {@link IRequestCycle#activate(IPage)}.
+     */
+    private boolean _pageRender = false;
+    
     /**
      * Creates a builder with a pre-configured {@link IMarkupWriter}. 
      * Currently only used for testing.
@@ -115,7 +124,7 @@
             RequestLocaleManager localeManager, 
             MarkupWriterSource markupWriterSource,
             WebResponse webResponse, List errorPages, 
-            AssetFactory assetFactory, String namespace)
+            AssetFactory assetFactory, String namespace, IEngineService service)
     {
         Defense.notNull(cycle, "cycle");
         Defense.notNull(assetFactory, "assetService");
@@ -125,6 +134,7 @@
         _markupWriterSource = markupWriterSource;
         _webResponse = webResponse;
         _errorPages = errorPages;
+        _pageService = service;
         
         // Used by PageRenderSupport
         _assetFactory = assetFactory;
@@ -200,11 +210,19 @@
         return _writer;
     }
     
+    void setWriter(IMarkupWriter writer)
+    {
+        _writer = writer;
+    }
+    
     /** 
      * {@inheritDoc}
      */
     public boolean isBodyScriptAllowed(IComponent target)
     {
+        if (_pageRender)
+            return true;
+        
         if (target != null 
                 && IPage.class.isInstance(target)
                 || (IForm.class.isInstance(target)
@@ -219,6 +237,9 @@
      */
     public boolean isExternalScriptAllowed(IComponent target)
     {
+        if (_pageRender)
+            return true;
+        
         if (target != null 
                 && IPage.class.isInstance(target)
                 || (IForm.class.isInstance(target)
@@ -233,6 +254,9 @@
      */
     public boolean isInitializationScriptAllowed(IComponent target)
     {
+        if (_pageRender)
+            return true;
+        
         if (target != null 
                 && IPage.class.isInstance(target)
                 || (IForm.class.isInstance(target)
@@ -247,6 +271,9 @@
      */
     public boolean isImageInitializationAllowed(IComponent target)
     {
+        if (_pageRender)
+            return true;
+        
         if (target != null 
                 && IPage.class.isInstance(target)
                 || (IForm.class.isInstance(target)
@@ -441,16 +468,38 @@
         // check for page exception renders and write content to writer so client can display them
         
         if (IPage.class.isInstance(render)) {
-            String errorPage = getErrorPage(((IPage)render).getPageName());
+            
+            IPage page = (IPage)render;
+            String errorPage = getErrorPage(page.getPageName());
+            
             if (errorPage != null) {
+                _pageRender = true;
                 render.render(getWriter(errorPage, EXCEPTION_TYPE), cycle);
                 return;
             }
+            
+            // If a page other than the active page originally requested is rendered
+            // it means someone activated a new page, so we need to tell the client to handle
+            // this appropriately. (usually by replacing the current dom with whatever this renders)
+            
+            if (_cycle.getParameter(ServiceConstants.PAGE) != null
+                    && !page.getPageName().equals(_cycle.getParameter(ServiceConstants.PAGE))) {
+                
+                IMarkupWriter urlwriter = _writer.getNestedWriter();
+                
+                urlwriter.begin("response");
+                urlwriter.attribute("type", PAGE_TYPE);
+                urlwriter.attribute("url", _pageService.getLink(true, page.getPageName()).getAbsoluteURL());
+                
+                _writers.put(PAGE_TYPE, urlwriter);
+                return;
+            }
         }
         
         if (IComponent.class.isInstance(render)
                 && contains((IComponent)render, ((IComponent)render).peekClientId()))
         {
+            _pageRender = true;
             render.render(getComponentWriter( ((IComponent)render).peekClientId() ), cycle);
             return;
         }

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseContributorImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseContributorImpl.java?view=diff&rev=481150&r1=481149&r2=481150
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseContributorImpl.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseContributorImpl.java Thu Nov 30 20:50:01 2006
@@ -19,6 +19,7 @@
 
 import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.asset.AssetFactory;
+import org.apache.tapestry.engine.IEngineService;
 import org.apache.tapestry.markup.MarkupWriterSource;
 import org.apache.tapestry.services.RequestLocaleManager;
 import org.apache.tapestry.services.ResponseBuilder;
@@ -52,6 +53,8 @@
     
     private AssetFactory _assetFactory;
     
+    private IEngineService _pageService;
+    
     /** 
      * {@inheritDoc}
      */
@@ -65,7 +68,8 @@
         
         return new DojoAjaxResponseBuilder(cycle, _localeManager, 
                 _markupWriterSource,
-                _webResponse, errorPages, _assetFactory, _webResponse.getNamespace());
+                _webResponse, errorPages, _assetFactory, 
+                _webResponse.getNamespace(), _pageService);
     }
     
     /** 
@@ -114,5 +118,10 @@
     public void setAssetFactory(AssetFactory factory)
     {
         _assetFactory = factory;
+    }
+    
+    public void setPageService(IEngineService service)
+    {
+        _pageService = service;
     }
 }

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/core.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/core.js?view=diff&rev=481150&r1=481149&r2=481150
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/core.js (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/core.js Thu Nov 30 20:50:01 2006
@@ -117,6 +117,11 @@
 				return;
 			}
 			
+			if (type == "page") {
+				window.location=elms[i].getAttribute("url");
+				return;
+			}
+			
 			// handle javascript evaluations
 			if (type == "script") {
 				

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/services/impl/DojoAjaxResponseBuilderTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/services/impl/DojoAjaxResponseBuilderTest.java?view=diff&rev=481150&r1=481149&r2=481150
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/services/impl/DojoAjaxResponseBuilderTest.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/services/impl/DojoAjaxResponseBuilderTest.java Thu Nov 30 20:50:01 2006
@@ -13,7 +13,7 @@
 // limitations under the License.
 package org.apache.tapestry.services.impl;
 
-import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.*;
 
 import java.io.CharArrayWriter;
 import java.io.PrintWriter;
@@ -24,14 +24,22 @@
 import org.apache.tapestry.BaseComponentTestCase;
 import org.apache.tapestry.IComponent;
 import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IPage;
 import org.apache.tapestry.IRender;
 import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.NestedMarkupWriter;
+import org.apache.tapestry.asset.AssetFactory;
+import org.apache.tapestry.engine.IEngineService;
+import org.apache.tapestry.engine.ILink;
 import org.apache.tapestry.engine.NullWriter;
 import org.apache.tapestry.markup.MarkupFilter;
 import org.apache.tapestry.markup.MarkupWriterImpl;
+import org.apache.tapestry.markup.MarkupWriterSource;
 import org.apache.tapestry.markup.UTFMarkupFilter;
+import org.apache.tapestry.services.RequestLocaleManager;
 import org.apache.tapestry.services.ResponseBuilder;
+import org.apache.tapestry.services.ServiceConstants;
+import org.apache.tapestry.web.WebResponse;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.Test;
 
@@ -163,6 +171,93 @@
         verify();
         
         assertSame(builder.getWriter(), writer);
+    }
+    
+    public void test_Page_Render()
+    {
+        IPage page = newMock(IPage.class);
+        checkOrder(page, false);
+        
+        IRequestCycle cycle = newMock(IRequestCycle.class);
+        // IMarkupWriter writer = newMock(IMarkupWriter.class);
+        RequestLocaleManager rlm = newMock(RequestLocaleManager.class);
+        MarkupWriterSource mrs = newMock(MarkupWriterSource.class);
+        WebResponse resp = newMock(WebResponse.class);
+        AssetFactory assetFactory = newMock(AssetFactory.class);
+        IEngineService pageService = newEngineService();
+        
+        List errorPages = new ArrayList();
+        
+        List parts = new ArrayList();
+        parts.add("id1");
+        
+        DojoAjaxResponseBuilder builder = 
+            new DojoAjaxResponseBuilder(cycle, rlm, mrs, resp, 
+                    errorPages, assetFactory, "", pageService);
+        
+        expect(page.getPageName()).andReturn("RequestPage").anyTimes();
+        
+        expect(cycle.getParameter(ServiceConstants.PAGE)).andReturn("RequestPage").anyTimes();
+        
+        expect(page.peekClientId()).andReturn("pageId");
+        
+        expect(cycle.renderStackIterator()).andReturn(Collections.EMPTY_LIST.iterator());
+        
+        page.render(NullWriter.getSharedInstance(), cycle);
+        
+        replay();
+        
+        builder.render(null, page, cycle);
+        
+        verify();
+    }
+    
+    public void test_New_Page_Render()
+    {
+        IPage page = newMock(IPage.class);
+        checkOrder(page, false);
+        
+        IRequestCycle cycle = newMock(IRequestCycle.class);
+        IMarkupWriter writer = newMock(IMarkupWriter.class);
+        NestedMarkupWriter nwriter = newNestedWriter();
+        
+        ILink link = newMock(ILink.class);
+        
+        RequestLocaleManager rlm = newMock(RequestLocaleManager.class);
+        MarkupWriterSource mrs = newMock(MarkupWriterSource.class);
+        WebResponse resp = newMock(WebResponse.class);
+        AssetFactory assetFactory = newMock(AssetFactory.class);
+        IEngineService pageService = newEngineService();
+        
+        List errorPages = new ArrayList();
+        
+        List parts = new ArrayList();
+        parts.add("id1");
+        
+        DojoAjaxResponseBuilder builder = 
+            new DojoAjaxResponseBuilder(cycle, rlm, mrs, resp, 
+                    errorPages, assetFactory, "", pageService);
+        
+        builder.setWriter(writer);
+        
+        expect(page.getPageName()).andReturn("RequestPage").anyTimes();
+        
+        expect(cycle.getParameter(ServiceConstants.PAGE)).andReturn("anotherPage").anyTimes();
+        
+        expect(writer.getNestedWriter()).andReturn(nwriter);
+        nwriter.begin("response");
+        nwriter.attribute("type", ResponseBuilder.PAGE_TYPE);
+        
+        expect(pageService.getLink(true, "RequestPage")).andReturn(link);
+        expect(link.getAbsoluteURL()).andReturn("/new/url");
+        
+        nwriter.attribute("url", "/new/url");
+        
+        replay();
+        
+        builder.render(null, page, cycle);
+        
+        verify();
     }
     
     public void test_Allowed_Scripts()