You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@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()