String name = (String) i.next();
if (debug)
LOG.debug("Connecting parameter " + name + ".");
IBinding binding = _component.getBinding(name);
if (binding == null)
{
if (debug)
LOG.debug("Not bound.");
continue;
}
IParameterSpecification pspec = spec.getParameter(name);
Direction direction = pspec.getDirection();
if (direction != Direction.IN && direction != Direction.FORM)
{
if (debug)
LOG.debug("Parameter is " + pspec.getDirection().getName() + ".");
continue;
}
if (!direction.getAllowInvariant() && binding.isInvariant())
throw new ConnectedParameterException(
Tapestry.format(
"ParameterManager.incompatible-direction-and-binding",
new Object[] {
name,
_component.getExtendedId(),
direction.getDisplayName(),
binding }),
_component,
name,
null,
binding.getLocation(),
null);
String propertyName = pspec.getPropertyName();
if (debug && !name.equals(propertyName))
LOG.debug("Connecting to property " + propertyName + ".");
// Next,verify that there is a writable property with the same
// name as the parameter.
PropertyInfo propertyInfo =
PropertyFinder.getPropertyInfo(_component.getClass(), propertyName);
if (propertyInfo == null)
{
throw new ConnectedParameterException(
Tapestry.format(
"ParameterManager.no-accessor",
_component.getExtendedId(),
propertyName),
_component,
name,
propertyName,
binding.getLocation(),
null);
}
if (!propertyInfo.isReadWrite())
{
throw new ConnectedParameterException(
Tapestry.format(
"ParameterManager.property-not-read-write",
_component.getExtendedId(),
propertyName),
_component,
name,
propertyName,
binding.getLocation(),
null);
}
// Check if the parameter type matches the property type
Class propertyType = propertyInfo.getType();
Class parameterType = getType(pspec.getType(), resolver);
if (parameterType == null)
{
throw new ConnectedParameterException(
Tapestry.format(
"ParameterManager.java-type-not-specified",
name,
_component.getExtendedId()),
_component,
name,
propertyName,
binding.getLocation(),
null);
}
if (!propertyType.equals(parameterType))
{
throw new ConnectedParameterException(
Tapestry.format(
"ParameterManager.type-mismatch",
new String[] {
name,
_component.getExtendedId(),
parameterType.toString(),
propertyType.toString()}),
_component,
name,
propertyName,
binding.getLocation(),
null);
}
// Here's where we will sniff it for type, for the moment
// assume its some form of object (not scalar) type.
IParameterConnector connector =
createConnector(_component, name, binding, propertyType, parameterType);
// Static bindings are set here and then forgotten
// about. Dynamic bindings are kept for later.
if (binding.isInvariant())
{
if (debug)
LOG.debug("Setting invariant value using " + connector + ".");
try
{
connector.setParameter(cycle);
}
catch (BindingException ex)
{
throw new ConnectedParameterException(
Tapestry.format(
"ParameterManager.static-initialization-failure",
propertyName,
_component.getExtendedId(),
binding.toString()),
_component,
name,
propertyName,
ex);
}