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 2008/10/17 23:15:54 UTC
svn commit: r705756 - in /tapestry/tapestry5/trunk/tapestry-core/src:
main/java/org/apache/tapestry5/corelib/components/
main/java/org/apache/tapestry5/corelib/internal/
main/java/org/apache/tapestry5/services/
test/java/org/apache/tapestry5/corelib/in...
Author: hlship
Date: Fri Oct 17 14:15:53 2008
New Revision: 705756
URL: http://svn.apache.org/viewvc?rev=705756&view=rev
Log:
TAP5-279: Client-side validation is always enabled for injected AjaxFormLoop fields
Added:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/InternalFormSupport.java
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormInjector.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/FormSupportAdapter.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/FormSupportImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/FormSupport.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/internal/FormSupportImplTest.java
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java?rev=705756&r1=705755&r2=705756&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java Fri Oct 17 14:15:53 2008
@@ -18,6 +18,7 @@
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.corelib.internal.ComponentActionSink;
import org.apache.tapestry5.corelib.internal.FormSupportImpl;
+import org.apache.tapestry5.corelib.internal.InternalFormSupport;
import org.apache.tapestry5.corelib.mixins.RenderInformals;
import org.apache.tapestry5.dom.Element;
import org.apache.tapestry5.internal.services.ClientBehaviorSupport;
@@ -30,6 +31,7 @@
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.annotations.Symbol;
+import org.apache.tapestry5.ioc.internal.util.IdAllocator;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
import org.apache.tapestry5.ioc.internal.util.TapestryException;
import org.apache.tapestry5.ioc.util.ExceptionUtils;
@@ -176,7 +178,7 @@
@Inject
private ComponentInvocationMap componentInvocationMap;
- private FormSupportImpl formSupport;
+ private InternalFormSupport formSupport;
private Element form;
@@ -228,8 +230,7 @@
name = renderSupport.allocateClientId(resources);
- formSupport = new FormSupportImpl(resources.getLocation(), name, actionSink, clientBehaviorSupport,
- clientValidation);
+ formSupport = createRenderTimeFormSupport(name, actionSink, new IdAllocator());
if (zone != null) clientBehaviorSupport.linkZone(name, zone);
@@ -287,6 +288,22 @@
environment.peek(Heartbeat.class).begin();
}
+ /**
+ * Creates an {@link org.apache.tapestry5.corelib.internal.InternalFormSupport} for this Form. This method is used
+ * by {@link org.apache.tapestry5.corelib.components.FormInjector}.
+ *
+ * @param name the client-side name and client id for the rendered form element
+ * @param actionSink used to collect component actions that will, ultimately, be written as the t:formdata hidden
+ * field
+ * @param allocator used to allocate unique ids
+ * @return form support object
+ */
+ InternalFormSupport createRenderTimeFormSupport(String name, ComponentActionSink actionSink, IdAllocator allocator)
+ {
+ return new FormSupportImpl(resources, name, actionSink, clientBehaviorSupport,
+ clientValidation, allocator);
+ }
+
void afterRender(MarkupWriter writer)
{
environment.peek(Heartbeat.class).end();
@@ -325,7 +342,7 @@
{
tracker.clear();
- formSupport = new FormSupportImpl(resources.getLocation());
+ formSupport = new FormSupportImpl(resources);
environment.push(ValidationTracker.class, tracker);
environment.push(FormSupport.class, formSupport);
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormInjector.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormInjector.java?rev=705756&r1=705755&r2=705756&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormInjector.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormInjector.java Fri Oct 17 14:15:53 2008
@@ -20,8 +20,8 @@
import org.apache.tapestry5.annotations.SupportsInformalParameters;
import org.apache.tapestry5.corelib.data.InsertPosition;
import org.apache.tapestry5.corelib.internal.ComponentActionSink;
-import org.apache.tapestry5.corelib.internal.FormSupportImpl;
import org.apache.tapestry5.corelib.internal.HiddenFieldPositioner;
+import org.apache.tapestry5.corelib.internal.InternalFormSupport;
import org.apache.tapestry5.dom.Element;
import org.apache.tapestry5.internal.services.ClientBehaviorSupport;
import org.apache.tapestry5.internal.services.ComponentResultProcessorWrapper;
@@ -51,7 +51,9 @@
{
public static final String INJECT_EVENT = "inject";
- public static final String FORMID_PARAMETER = "t:formid";
+ public static final String FORM_CLIENTID_PARAMETER = "t:formid";
+
+ public static final String FORM_COMPONENTID_PARAMETER = "t:formcomponentid";
/**
* The context for the link (optional parameter). This list of values will be converted into strings and included in
@@ -113,6 +115,9 @@
@Inject
private Logger logger;
+ @Inject
+ private ComponentSource componentSource;
+
private Element clientElement;
String defaultElement()
@@ -135,7 +140,8 @@
Link link = resources.createEventLink(INJECT_EVENT,
context == null ? new Object[0] : context.toArray());
- link.addParameter(FORMID_PARAMETER, formSupport.getClientId());
+ link.addParameter(FORM_CLIENTID_PARAMETER, formSupport.getClientId());
+ link.addParameter(FORM_COMPONENTID_PARAMETER, formSupport.getFormComponentId());
clientBehaviorSupport.addFormInjector(clientId, link, position, show);
}
@@ -186,12 +192,11 @@
final RenderCommand rootRenderCommand = pageRenderQueue.getRootRenderCommand();
- final String formId = request.getParameter(FORMID_PARAMETER);
+ final String formClientId = readParameterValue(FORM_CLIENTID_PARAMETER);
- if (InternalUtils.isBlank(formId))
- throw new RuntimeException(String.format(
- "Query parameter '%s' was blank, but should have been specified in the request.",
- FORMID_PARAMETER));
+ String formComponentId = request.getParameter(FORM_COMPONENTID_PARAMETER);
+
+ final Form form = (Form) componentSource.getComponent(formComponentId);
final ComponentActionSink actionSink = new ComponentActionSink(logger);
@@ -214,8 +219,8 @@
reply.put("elementId", clientId);
- FormSupportImpl formSupport = new FormSupportImpl(null, formId, actionSink, clientBehaviorSupport, true,
- idAllocator);
+ InternalFormSupport formSupport =
+ form.createRenderTimeFormSupport(formClientId, actionSink, idAllocator);
environment.push(FormSupport.class, formSupport);
environment.push(ValidationTracker.class, new ValidationTrackerImpl());
@@ -242,4 +247,16 @@
pageRenderQueue.addPartialMarkupRendererFilter(filter);
}
+
+ private String readParameterValue(String parameterName)
+ {
+ String value = request.getParameter(parameterName);
+
+ if (InternalUtils.isBlank(value))
+ throw new RuntimeException(String.format(
+ "Query parameter '%s' was blank, but should have been specified in the request.",
+ parameterName));
+
+ return value;
+ }
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/FormSupportAdapter.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/FormSupportAdapter.java?rev=705756&r1=705755&r2=705756&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/FormSupportAdapter.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/FormSupportAdapter.java Fri Oct 17 14:15:53 2008
@@ -70,4 +70,9 @@
{
return delegate.isClientValidationEnabled();
}
+
+ public String getFormComponentId()
+ {
+ return delegate.getFormComponentId();
+ }
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/FormSupportImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/FormSupportImpl.java?rev=705756&r1=705755&r2=705756&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/FormSupportImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/FormSupportImpl.java Fri Oct 17 14:15:53 2008
@@ -15,14 +15,14 @@
package org.apache.tapestry5.corelib.internal;
import org.apache.tapestry5.ComponentAction;
+import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.Field;
import org.apache.tapestry5.internal.services.ClientBehaviorSupport;
-import org.apache.tapestry5.ioc.BaseLocatable;
+import org.apache.tapestry5.ioc.Locatable;
import org.apache.tapestry5.ioc.Location;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.ioc.internal.util.Defense;
import org.apache.tapestry5.ioc.internal.util.IdAllocator;
-import org.apache.tapestry5.services.FormSupport;
import java.util.List;
@@ -32,8 +32,10 @@
* <p/>
* TODO: Most methods should only be invokable depending on whether the form is rendering or processing a submission.
*/
-public class FormSupportImpl extends BaseLocatable implements FormSupport
+public class FormSupportImpl implements InternalFormSupport, Locatable
{
+ private final ComponentResources resources;
+
private final ClientBehaviorSupport clientBehaviorSupport;
private final boolean clientValidationEnabled;
@@ -50,33 +52,20 @@
/**
* Constructor used when processing a form submission.
- *
- * @param location
- */
- public FormSupportImpl(Location location)
- {
- this(location, null, null, null, false);
- }
-
- /**
- * Constructor used when rendering.
*/
- public FormSupportImpl(Location location, String clientId, ComponentActionSink actionSink,
- ClientBehaviorSupport clientBehaviorSupport,
- boolean clientValidationEnabled)
+ public FormSupportImpl(ComponentResources resources)
{
- this(location, clientId, actionSink, clientBehaviorSupport, clientValidationEnabled, new IdAllocator());
+ this(resources, null, null, null, false, null);
}
/**
- * Full constructor.
+ * Full constructor (specifically constructor for render time).
*/
- public FormSupportImpl(Location location, String clientId, ComponentActionSink actionSink,
+ public FormSupportImpl(ComponentResources resources, String clientId, ComponentActionSink actionSink,
ClientBehaviorSupport clientBehaviorSupport,
boolean clientValidationEnabled, IdAllocator idAllocator)
{
- super(location);
-
+ this.resources = resources;
this.clientId = clientId;
this.actionSink = actionSink;
this.clientBehaviorSupport = clientBehaviorSupport;
@@ -84,9 +73,14 @@
this.idAllocator = idAllocator;
}
- public String getFormId()
+ public Location getLocation()
{
- return clientId;
+ return resources.getLocation();
+ }
+
+ public String getFormComponentId()
+ {
+ return resources.getCompleteId();
}
public String allocateControlName(String id)
Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/InternalFormSupport.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/InternalFormSupport.java?rev=705756&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/InternalFormSupport.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/internal/InternalFormSupport.java Fri Oct 17 14:15:53 2008
@@ -0,0 +1,36 @@
+// Copyright 2008 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.tapestry5.corelib.internal;
+
+import org.apache.tapestry5.services.FormSupport;
+
+/**
+ * Additional methods for {@link org.apache.tapestry5.services.FormSupport} used internally by Tapestry.
+ *
+ * @see org.apache.tapestry5.corelib.components.Form
+ * @see org.apache.tapestry5.corelib.components.FormInjector
+ */
+public interface InternalFormSupport extends FormSupport
+{
+ /**
+ * Executes any deferred callbacks added via {@link org.apache.tapestry5.services.FormSupport#defer(Runnable)}.
+ */
+ void executeDeferred();
+
+ /**
+ * Returns the form encoding type, if one has been set via a call to {@link org.apache.tapestry5.services.FormSupport#setEncodingType(String)}.
+ */
+ String getEncodingType();
+}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/FormSupport.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/FormSupport.java?rev=705756&r1=705755&r2=705756&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/FormSupport.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/FormSupport.java Fri Oct 17 14:15:53 2008
@@ -84,4 +84,10 @@
* Return true if client validation is enabled for this form, false otherwise.
*/
boolean isClientValidationEnabled();
+
+ /**
+ * Returns the complete id of the underlying Form component. This is needed by {@link
+ * org.apache.tapestry5.corelib.components.FormInjector}.
+ */
+ String getFormComponentId();
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/internal/FormSupportImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/internal/FormSupportImplTest.java?rev=705756&r1=705755&r2=705756&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/internal/FormSupportImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/internal/FormSupportImplTest.java Fri Oct 17 14:15:53 2008
@@ -140,7 +140,7 @@
replay();
- FormSupportImpl support = new FormSupportImpl(null, null, null, clientBehaviorSupport, true);
+ FormSupportImpl support = new FormSupportImpl(null, null, null, clientBehaviorSupport, true, null);
support.addValidation(barney, "required", "Who can live without Barney?", null);
@@ -155,7 +155,7 @@
replay();
- FormSupportImpl support = new FormSupportImpl(null, null, null, clientBehaviorSupport, false);
+ FormSupportImpl support = new FormSupportImpl(null, null, null, clientBehaviorSupport, false, null);
support.addValidation(barney, "required", "Who can live without Barney?", null);