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/11/07 02:11:28 UTC
svn commit: r331173 - in /jakarta/tapestry/trunk: ./
framework/src/java/org/apache/tapestry/form/ framework/src/scripts/
framework/src/test/org/apache/tapestry/form/
Author: hlship
Date: Sun Nov 6 17:11:23 2005
New Revision: 331173
URL: http://svn.apache.org/viewcvs?rev=331173&view=rev
Log:
TAPESTRY-678: LinkSubmit does not work correctly when the browser's back button is used and the form resubmitted normally
Added:
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/LinkSubmitTest.java
- copied, changed from r329587, jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestLinkSubmit.java
Modified:
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/Form.js
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormConstants.java
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.java
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.script
jakarta/tapestry/trunk/framework/src/scripts/TestListEdit.xml
jakarta/tapestry/trunk/framework/src/scripts/TestSelectOption.xml
jakarta/tapestry/trunk/framework/src/scripts/TestWMLComponents.xml
jakarta/tapestry/trunk/framework/src/scripts/TestWMLFormComponents.xml
jakarta/tapestry/trunk/framework/src/scripts/TestWMLStaleSession.xml
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormSupportTest.java
jakarta/tapestry/trunk/status.xml
Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/Form.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/Form.js?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/Form.js (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/Form.js Sun Nov 6 17:11:23 2005
@@ -287,11 +287,13 @@
// Submits a form programatically.
//
-FormEventManager.prototype.submit = function()
+FormEventManager.prototype.submit = function(name)
{
if (this.onsubmit_handler())
{
this.form.onsubmit = null;
+
+ this.form.submitname.value = name;
this.form.submit();
}
}
@@ -316,6 +318,7 @@
return false;
this.form.submitmode.value = "submit";
+ this.form.submitname.value = "";
return true;
}
@@ -342,7 +345,7 @@
// that another field be updated via a server round-trip. Refresh listeners
// can prevent the form submission by setting the event's abort flag.
-FormEventManager.prototype.refresh = function()
+FormEventManager.prototype.refresh = function(name)
{
var event = new FormSubmitEvent(this.form, "refresh", this.invalid_field_handler);
@@ -352,6 +355,7 @@
return;
this.form.submitmode.value = "refresh";
+ this.form.submitname.value = name;
this.form.onsubmit = null;
this.form.submit();
}
Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormConstants.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormConstants.java?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormConstants.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormConstants.java Sun Nov 6 17:11:23 2005
@@ -42,4 +42,10 @@
* is invoked.
*/
public static final String SUBMIT_REFRESH = "refresh";
+
+ /**
+ * Query parameter reserved to identify the name of the component that triggered the form
+ * submit. This is primarily used by the {@link org.apache.tapestry.form.LinkSubmit} component.
+ */
+ public static final String SUBMIT_NAME_PARAMETER = "submitname";
}
Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java Sun Nov 6 17:11:23 2005
@@ -95,6 +95,7 @@
set.add(FORM_IDS);
set.add(RESERVED_FORM_IDS);
set.add(SUBMIT_MODE);
+ set.add(FormConstants.SUBMIT_NAME_PARAMETER);
_standardReservedIds = Collections.unmodifiableSet(set);
}
@@ -458,6 +459,11 @@
// client-side JavaScript forces an update.
addHiddenValue(SUBMIT_MODE, null);
+
+ // And another for the name of the component that
+ // triggered the submit.
+
+ addHiddenValue(FormConstants.SUBMIT_NAME_PARAMETER, null);
IMarkupWriter nested = _writer.getNestedWriter();
Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.java?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.java Sun Nov 6 17:11:23 2005
@@ -38,17 +38,21 @@
{
/**
- * The name of an {@link org.apache.tapestry.IRequestCycle}attribute in which the current
+ * The name of an {@link org.apache.tapestry.IRequestCycle} attribute in which the current
* submit link is stored. LinkSubmits do not nest.
*/
public static final String ATTRIBUTE_NAME = "org.apache.tapestry.form.LinkSubmit";
+ /**
+ * Checks the submit name ({@link FormConstants#SUBMIT_NAME_PARAMETER}) to see if it matches
+ * this LinkSubmit's assigned element name.
+ */
protected boolean isClicked(IRequestCycle cycle, String name)
{
- String value = cycle.getParameter(name);
+ String value = cycle.getParameter(FormConstants.SUBMIT_NAME_PARAMETER);
- return HiveMind.isNonBlank(value);
+ return name.equals(value);
}
public abstract IScript getScript();
@@ -64,31 +68,21 @@
IForm form = getForm();
String name = getName();
- String hiddenId = cycle.getUniqueId(TapestryUtils
- .convertTapestryIdToNMToken(getIdParameter()));
-
- // Store for later access by the FieldLabel (or JavaScript).
-
- setClientId(hiddenId);
-
- // Add a hidden field used to identify the link that caused the submission.
- // Client-side JavaScript will set the value to non-null when the link is clicked,
- // then force the form to submit.
-
- form.addHiddenValue(name, hiddenId, "");
-
if (!disabled)
{
PageRenderSupport pageRenderSupport = TapestryUtils.getPageRenderSupport(cycle, this);
Map symbols = new HashMap();
symbols.put("form", form);
- symbols.put("hiddenId", hiddenId);
+ symbols.put("name", name);
getScript().execute(cycle, pageRenderSupport, symbols);
writer.begin("a");
writer.attribute("href", (String) symbols.get("href"));
+
+ renderIdAttribute(writer, cycle);
+
renderInformalParameters(writer, cycle);
}
Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.script
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.script?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.script (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.script Sun Nov 6 17:11:23 2005
@@ -20,7 +20,7 @@
"http://jakarta.apache.org/tapestry/dtd/Script_3_0.dtd">
<script>
-<input-symbol key="hiddenId" class="java.lang.String" required="yes"/>
+<input-symbol key="name" class="java.lang.String" required="yes"/>
<input-symbol key="form" class="org.apache.tapestry.IForm" required="yes"/>
<let key="functionName" unique="yes">
@@ -36,12 +36,7 @@
{
var form = Tapestry.find('${form.name}');
- if (form.events.onsubmit_handler())
- {
- Tapestry.find('${hiddenId}').value = "T";
- form.onsubmit = null;
- form.submit();
- }
+ form.events.submit('${name}');
}
</body>
Modified: jakarta/tapestry/trunk/framework/src/scripts/TestListEdit.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/scripts/TestListEdit.xml?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/scripts/TestListEdit.xml (original)
+++ jakarta/tapestry/trunk/framework/src/scripts/TestListEdit.xml Sun Nov 6 17:11:23 2005
@@ -38,7 +38,8 @@
<match>name="component" value="form"</match>
<match>name="page" value="ListEdit"</match>
<match>name="service" value="direct"</match>
- <match>name="submitmode" value=""</match>
+ <match>name="submitmode" value=""</match>
+ <match>name="submitname" value=""</match>
<match>name="e" value="SClothing"</match>
<match>name="e" value="SEye Color"</match>
<match>name="e" value="SFood"</match>
@@ -147,6 +148,7 @@
<match>name="page" value="ListEditArray"</match>
<match>name="service" value="direct"</match>
<match>name="submitmode" value=""</match>
+ <match>name="submitname" value=""</match>
<match>name="e" value="SFred"</match>
<match>name="e" value="SDino"</match>
<match>name="e" value="SWilma"</match>
@@ -174,6 +176,8 @@
<match>name="page" value="ListEditNull"</match>
<match>name="service" value="direct"</match>
<match>name="submitmode" value=""</match>
+ <match>name="submitname" value=""</match>
+
</assert-output-matches>
</request>
</mock-test>
Modified: jakarta/tapestry/trunk/framework/src/scripts/TestSelectOption.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/scripts/TestSelectOption.xml?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/scripts/TestSelectOption.xml (original)
+++ jakarta/tapestry/trunk/framework/src/scripts/TestSelectOption.xml Sun Nov 6 17:11:23 2005
@@ -43,6 +43,7 @@
<match>name="page" value="Home"</match>
<match>name="service" value="direct"</match>
<match>name="submitmode" value=""</match>
+ <match>name="submitname" value=""</match>
</assert-output-matches>
<assert-regexp name="Select Tag">
@@ -131,6 +132,7 @@
<match>name="page" value="Two"</match>
<match>name="service" value="direct"</match>
<match>name="submitmode" value=""</match>
+ <match>name="submitname" value=""</match>
</assert-output-matches>
<assert-output name="Select Tag">
@@ -230,6 +232,7 @@
<match>name="service" value="direct"</match>
<match>name="session" value="T"</match>
<match>name="submitmode" value=""</match>
+ <match>name="submitname" value=""</match>
</assert-output-matches>
<assert-output name="Select Tag">
Modified: jakarta/tapestry/trunk/framework/src/scripts/TestWMLComponents.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/scripts/TestWMLComponents.xml?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/scripts/TestWMLComponents.xml (original)
+++ jakarta/tapestry/trunk/framework/src/scripts/TestWMLComponents.xml Sun Nov 6 17:11:23 2005
@@ -116,6 +116,7 @@
<match>service</match>
<match>reservedids</match>
<match>submitmode</match>
+ <match>submitname</match>
<match>u</match>
<match>l</match>
</assert-output-matches>
@@ -130,6 +131,7 @@
<match>Home</match>
<match>action</match>
<match>action</match>
+ <match></match>
<match></match>
<match>$(username)</match>
<match>$(l)</match>
Modified: jakarta/tapestry/trunk/framework/src/scripts/TestWMLFormComponents.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/scripts/TestWMLFormComponents.xml?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/scripts/TestWMLFormComponents.xml (original)
+++ jakarta/tapestry/trunk/framework/src/scripts/TestWMLFormComponents.xml Sun Nov 6 17:11:23 2005
@@ -83,6 +83,7 @@
<match>page</match>
<match>service</match>
<match>submitmode</match>
+ <match>submitname</match>
<match>u</match>
<match>formids</match>
@@ -92,6 +93,7 @@
<match>service</match>
<match>reservedids</match>
<match>submitmode</match>
+ <match>submitname</match>
<match>v</match>
</assert-output-matches>
@@ -104,6 +106,7 @@
<match>Rewind</match>
<match>direct</match>
<match></match>
+ <match></match>
<match>$(u)</match>
<match>v</match>
@@ -112,6 +115,7 @@
<match>Rewind</match>
<match>action</match>
<match>action</match>
+ <match></match>
<match></match>
<match>$(v)</match>
</assert-output-matches>
Modified: jakarta/tapestry/trunk/framework/src/scripts/TestWMLStaleSession.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/scripts/TestWMLStaleSession.xml?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/scripts/TestWMLStaleSession.xml (original)
+++ jakarta/tapestry/trunk/framework/src/scripts/TestWMLStaleSession.xml Sun Nov 6 17:11:23 2005
@@ -64,6 +64,7 @@
<match>page</match>
<match>service</match>
<match>submitmode</match>
+ <match>submitname</match>
</assert-output-matches>
<assert-output-matches name="Go Parameter Values" subgroup="1">
@@ -74,6 +75,7 @@
<match>go</match>
<match>Stale</match>
<match>direct</match>
+ <match></match>
<match></match>
</assert-output-matches>
Modified: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormSupportTest.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormSupportTest.java?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormSupportTest.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormSupportTest.java Sun Nov 6 17:11:23 2005
@@ -150,13 +150,7 @@
writer.println();
- trainDiv(writer);
-
- trainHidden(writer, "formids", "barney,wilma,barney_0");
- trainHidden(writer, "service", "fred");
- trainHidden(writer, "submitmode", "");
-
- writer.end();
+ trainHiddenBlock(writer, "fred", "barney,wilma,barney_0");
nested.close();
@@ -176,7 +170,19 @@
verifyControls();
}
- private void trainDiv(IMarkupWriter writer)
+ protected void trainHiddenBlock(IMarkupWriter writer, String serviceName, String formIds)
+ {
+ trainDiv(writer);
+
+ trainHidden(writer, "formids", formIds);
+ trainHidden(writer, "service", serviceName);
+ trainHidden(writer, "submitmode", "");
+ trainHidden(writer, FormConstants.SUBMIT_NAME_PARAMETER, "");
+
+ writer.end();
+ }
+
+ protected void trainDiv(IMarkupWriter writer)
{
writer.begin("div");
writer.attribute("style", "display:none;");
@@ -317,13 +323,7 @@
writer.println();
- trainDiv(writer);
-
- trainHidden(writer, "formids", "");
- trainHidden(writer, "service", "fred");
- trainHidden(writer, "submitmode", "");
-
- writer.end();
+ trainHiddenBlock(writer, "fred", "");
nested.close();
@@ -406,13 +406,7 @@
writer.println();
- trainDiv(writer);
-
- trainHidden(writer, "formids", "");
- trainHidden(writer, "service", "fred");
- trainHidden(writer, "submitmode", "");
-
- writer.end();
+ trainHiddenBlock(writer, "fred", "");
nested.close();
@@ -489,6 +483,7 @@
trainHidden(writer, "formids", "");
trainHidden(writer, "service", "fred");
trainHidden(writer, "submitmode", "");
+ trainHidden(writer, FormConstants.SUBMIT_NAME_PARAMETER, "");
trainHidden(writer, "hidden1", "value1");
trainHidden(writer, "hidden2", "id2", "value2");
@@ -629,6 +624,7 @@
trainHidden(writer, "action", "fred");
trainHidden(writer, "reservedids", "action");
trainHidden(writer, "submitmode", "");
+ trainHidden(writer, FormConstants.SUBMIT_NAME_PARAMETER, "");
writer.end();
@@ -702,14 +698,8 @@
writer.println();
- trainDiv(writer);
-
- trainHidden(writer, "formids", "");
- trainHidden(writer, "service", "fred");
- trainHidden(writer, "submitmode", "");
-
- writer.end();
-
+ trainHiddenBlock(writer, "fred", "");
+
nested.close();
writer.end();
@@ -988,13 +978,7 @@
writer.println();
- trainDiv(writer);
-
- trainHidden(writer, "formids", "barney");
- trainHidden(writer, "service", "fred");
- trainHidden(writer, "submitmode", "");
-
- writer.end();
+ trainHiddenBlock(writer, "fred", "barney");
nested.close();
@@ -1067,14 +1051,8 @@
writer.println();
- trainDiv(writer);
-
- trainHidden(writer, "formids", "barney");
- trainHidden(writer, "service", "fred");
- trainHidden(writer, "submitmode", "");
-
- writer.end();
-
+ trainHiddenBlock(writer, "fred", "barney");
+
nested.close();
writer.end();
@@ -1160,13 +1138,7 @@
writer.println();
- trainDiv(writer);
-
- trainHidden(writer, "formids", "");
- trainHidden(writer, "service", "fred");
- trainHidden(writer, "submitmode", "");
-
- writer.end();
+ trainHiddenBlock(writer, "fred", "");
// EasyMock can't fully verify that this gets called at the right moment, nor can we truly
// prove (well, except by looking at the code), that the deferred runnables execute at the
@@ -1406,13 +1378,7 @@
writer.println();
- trainDiv(writer);
-
- trainHidden(writer, "formids", "");
- trainHidden(writer, "service", "fred");
- trainHidden(writer, "submitmode", "");
-
- writer.end();
+ trainHiddenBlock(writer, "fred", "");
nested.close();
Copied: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/LinkSubmitTest.java (from r329587, jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestLinkSubmit.java)
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/LinkSubmitTest.java?p2=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/LinkSubmitTest.java&p1=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestLinkSubmit.java&r1=329587&r2=331173&rev=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestLinkSubmit.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/LinkSubmitTest.java Sun Nov 6 17:11:23 2005
@@ -38,7 +38,7 @@
* @author Howard Lewis Ship
* @since 4.0
*/
-public class TestLinkSubmit extends BaseComponentTestCase
+public class LinkSubmitTest extends BaseComponentTestCase
{
private class ScriptFixture implements IScript
{
@@ -72,19 +72,17 @@
{ "form", form, "name", "fred_1", "script", script, "idParameter", "fred_id" });
linkSubmit.addBody(newBody());
- trainGetUniqueId(cycle, "fred_id", "fred_id_unique");
-
- form.addHiddenValue("fred_1", "fred_id_unique", "");
-
trainGetSupport(cycle, support);
+ trainGetUniqueId(cycle, "fred_id", "fred_id_unique");
+
replayControls();
linkSubmit.renderFormComponent(writer, cycle);
verifyControls();
- assertBuffer("<a href=\"HREF\">BODY</a>");
+ assertBuffer("<a href=\"HREF\" id=\"fred_id_unique\">BODY</a>");
}
public void testRenderDisabled()
@@ -98,10 +96,6 @@
{ "disabled", Boolean.TRUE, "form", form, "name", "fred_1", "idParameter", "fred_id" });
linkSubmit.addBody(newBody());
- trainGetUniqueId(cycle, "fred_id", "fred_id_unique");
-
- form.addHiddenValue("fred_1", "fred_id_unique", "");
-
replayControls();
linkSubmit.renderFormComponent(writer, cycle);
@@ -153,7 +147,7 @@
catch (ApplicationRuntimeException ex)
{
assertEquals(
- "LinkSubmit MyPage/fred may not be enclosed by another LinkSubmit (MyPage/barney, at classpath:/org/apache/tapestry/form/TestLinkSubmit, line 1).",
+ "LinkSubmit MyPage/fred may not be enclosed by another LinkSubmit (MyPage/barney, at classpath:/org/apache/tapestry/form/LinkSubmitTest, line 1).",
ex.getMessage());
assertSame(linkSubmit, ex.getComponent());
assertSame(floc, ex.getLocation());
@@ -181,7 +175,7 @@
{
IRequestCycle cycle = newCycle();
- trainGetParameter(cycle, "fred", "T");
+ trainGetParameter(cycle, FormConstants.SUBMIT_NAME_PARAMETER, "fred");
replayControls();
@@ -196,7 +190,7 @@
{
IRequestCycle cycle = newCycle();
- trainGetParameter(cycle, "fred", null);
+ trainGetParameter(cycle, FormConstants.SUBMIT_NAME_PARAMETER, null);
replayControls();
@@ -233,7 +227,7 @@
// Finally, code inside LinkSubmit ...
- trainGetParameter(cycle, "fred", null);
+ trainGetParameter(cycle, FormConstants.SUBMIT_NAME_PARAMETER, null);
// ... and back to AbstractFormComponent
Modified: jakarta/tapestry/trunk/status.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/status.xml?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- jakarta/tapestry/trunk/status.xml (original)
+++ jakarta/tapestry/trunk/status.xml Sun Nov 6 17:11:23 2005
@@ -52,6 +52,7 @@
<changes>
<release version="4.0-beta-13" date="unreleased">
<action type="update" dev="HLS">Switch to HiveMind 1.1 (final)</action>
+ <action type="fix" dev="HLS" fixes-bug="TAPESTRT-678">LinkSubmit does not work correctly when the browser's back button is used and the form resubmitted normally</action>
</release>
<release version="4.0-beta-12" date="Oct 30 2005">
<action type="fix" dev="HLS" fixes-bug="TAPESTRY-718">Asset injection makes assets appear as null inside finishLoad()</action>
---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org