Author: hlship
Date: Thu Jan 4 12:04:45 2007
New Revision: 492710
URL: http://svn.apache.org/viewvc?view=rev&rev=492710
Log:
Only bind a field to a container property (matching the field's id) if such a
property actually exists.
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractField.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractTextField.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractField.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractField.java?view=diff&rev=492710&r1=492709&r2=492710
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractField.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractField.java
Thu Jan 4 12:04:45 2007
@@ -34,6 +34,8 @@
import org.apache.tapestry.internal.bindings.LiteralBinding;
import org.apache.tapestry.internal.services.FormParameterLookup;
import org.apache.tapestry.ioc.Messages;
+import org.apache.tapestry.ioc.services.PropertyAccess;
+import org.apache.tapestry.runtime.Component;
import org.apache.tapestry.services.Binding;
import org.apache.tapestry.services.BindingSource;
import org.apache.tapestry.services.FormSupport;
@@ -122,6 +124,12 @@
@Inject("service:tapestry.internal.FormParameterLookup")
private FormParameterLookup _paramLookup;
+ @Inject("infrastructure:BindingSource")
+ private BindingSource _bindingSource;
+
+ @Inject("infrastructure:PropertyAccess")
+ private PropertyAccess _propertyAccess;
+
final Binding defaultLabel()
{
Messages containerMessages =
_resources.getContainer().getComponentResources()
@@ -185,17 +193,31 @@
processSubmission(_paramLookup, _elementName);
}
- @Inject("infrastructure:BindingSource")
- private BindingSource _bindingSource;
-
- /** Used by subclasses to create a default binding to a property of the
container. */
+ /**
+ * Used by subclasses to create a default binding to a property of the
container.
+ *
+ * @return a binding to the property, or null if the container does not
have a corresponding
+ * property
+ */
protected final Binding createDefaultParameterBinding(String parameterName)
{
String componentId = _resources.getId();
- ComponentResources container = _resources.getContainerResources();
+ Component container = _resources.getContainer();
- return _bindingSource.newBinding("default " + parameterName,
container, componentId);
+ // Only provide a default binding if the container actually contains
the property.
+ // This sets up an error condition for when the value parameter is not
bound, and
+ // the binding can't be deduced.
+
+ if
(_propertyAccess.getAdapter(container).getPropertyAdapter(componentId) == null)
+ return null;
+
+ ComponentResources containerResources =
_resources.getContainerResources();
+
+ return _bindingSource.newBinding(
+ "default " + parameterName,
+ containerResources,
+ componentId);
}
/**
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractTextField.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractTextField.java?view=diff&rev=492710&r1=492709&r2=492710
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractTextField.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractTextField.java
Thu Jan 4 12:04:45 2007
@@ -89,7 +89,7 @@
/**
* The default value is a property of the container whose name matches the
component's id. May
- * return null if the container does not have a matching property (not yet
implemented).
+ * return null if the container does not have a matching property.
*/
final Binding defaultValue()
{
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java?view=diff&rev=492710&r1=492709&r2=492710
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
Thu Jan 4 12:04:45 2007
@@ -128,6 +128,7 @@
import org.apache.tapestry.ioc.services.ChainBuilder;
import org.apache.tapestry.ioc.services.ClassFactory;
import org.apache.tapestry.ioc.services.PipelineBuilder;
+import org.apache.tapestry.ioc.services.PropertyAccess;
import org.apache.tapestry.ioc.services.PropertyShadowBuilder;
import org.apache.tapestry.ioc.services.StrategyBuilder;
import org.apache.tapestry.ioc.services.ThreadLocale;
@@ -432,7 +433,9 @@
public static void contributeInfrastructure(
Configuration<InfrastructureContribution> configuration,
ServiceLocator locator,
@InjectService("tapestry.ioc.TypeCoercer")
- TypeCoercer typeCoercer)
+ TypeCoercer typeCoercer,
@InjectService("tapestry.ioc.PropertyAccess")
+ PropertyAccess propertyAccess)
+
{
add(
configuration,
@@ -457,6 +460,7 @@
FieldValidatorSource.class);
configuration.add(new InfrastructureContribution("TypeCoercer",
typeCoercer));
+ configuration.add(new InfrastructureContribution("PropertyAccess",
propertyAccess));
}
/**