boolean isFormal = pspec != null;
String parameterName = isFormal ? pspec.getParameterName() : name;
IBindingSpecification bspec = contained.getBinding(name);
// If not allowing informal parameters, check that each binding
// matches
// a formal parameter.
if (formalOnly && !isFormal)
throw new ApplicationRuntimeException(PageloadMessages.formalParametersOnly(
component,
name), component, bspec.getLocation(), null);
// If an informal parameter that conflicts with a reserved name,
// then skip it.
if (!isFormal && spec.isReservedParameterName(name))
continue;
if (isFormal)
{
if (!name.equals(parameterName))
{
_log.error(PageloadMessages.usedParameterAlias(
contained,
name,
parameterName,
bspec.getLocation()));
}
else if (pspec.isDeprecated())
_log.error(PageloadMessages.deprecatedParameter(
name,
bspec.getLocation(),
contained.getType()));
}
// The type determines how to interpret the value:
// As a simple static String
// As a nested property name (relative to the component)
// As the name of a binding inherited from the containing component.
// As the name of a public field
// As a script for a listener
BindingType type = bspec.getType();
// For inherited bindings, defer until later. This gives components
// a chance to setup bindings from static values and expressions in
// the template. The order of operations is tricky, template bindings
// come later. Note that this is a hold over from the Tapestry 3.0 DTD
// and will some day no longer be supported.
if (type == BindingType.INHERITED)
{
QueuedInheritedBinding queued = new QueuedInheritedBinding(component, bspec
.getValue(), parameterName);
_inheritedBindingQueue.add(queued);
continue;
}