// This may be null for an anonymous component.
String embeddedId = token.getId();
String embeddedComponentClassName = null;
final EmbeddedComponentModel embeddedModel = embeddedId == null
? null
: loadingComponentModel.getEmbeddedComponentModel(embeddedId);
// We know that if embeddedId is null, embeddedType is not.
if (embeddedId == null) embeddedId = generateEmbeddedId(embeddedType, idAllocator);
if (embeddedModel != null)
{
String modelType = embeddedModel.getComponentType();
if (InternalUtils.isNonBlank(modelType) && embeddedType != null)
throw new TapestryException(ServicesMessages.compTypeConflict(embeddedId, embeddedType, modelType),
token, null);
embeddedType = modelType;
embeddedComponentClassName = embeddedModel.getComponentClassName();
}
// We only have the embeddedModel if the embeddedId was specified. If embeddedType was ommitted
// and
if (InternalUtils.isBlank(embeddedType) && embeddedModel == null)
throw new TapestryException(
ServicesMessages.noTypeForEmbeddedComponent(embeddedId,
loadingComponentModel.getComponentClassName()),
token, null);
final ComponentPageElement newComponent = pageElementFactory.newComponentElement(page, loadingElement,
embeddedId, embeddedType,
embeddedComponentClassName,
elementName,
token.getLocation());
addMixinsToComponent(newComponent, embeddedModel, token.getMixins());
final Map<String, Binding> newComponentBindings = CollectionFactory.newMap();
componentIdToBindingMap.put(newComponent.getCompleteId(), newComponentBindings);
if (embeddedModel != null)
bindParametersFromModel(embeddedModel, loadingElement, newComponent, newComponentBindings);
addToBody(newComponent);
// Remember to load the template for this new component
componentQueue.push(newComponent);
// Any attribute tokens that immediately follow should be
// used to bind parameters.
addAttributesAsComponentBindings = true;
// Any attributes (including component parameters) that come up belong on this component.
activeElementStack.push(newComponent);
// Set things up so that content inside the component is added to the component's body.
bodyPageElementStack.push(newComponent);
// And clean that up when the end element is reached.
final ComponentModel newComponentModel = newComponent.getComponentResources().getComponentModel();
// If the component was from an embedded @Component annotation, and it is inheritting informal parameters,
// and the component in question supports informal parameters, than get those inheritted informal parameters ...
// but later (this helps ensure that <t:parameter> elements that may provide informal parameters are
// visible when the informal parameters are copied to the child component).
if (embeddedModel != null && embeddedModel.getInheritInformalParameters() && newComponentModel.getSupportsInformalParameters())
{
final ComponentPageElement loadingElement = this.loadingElement;
Runnable finalizer = new Runnable()
{