// We know that if embeddedId is null, embeddedType is not.
if (embeddedId == null) embeddedId = generateEmbeddedId(embeddedType, _idAllocator);
final EmbeddedComponentModel embeddedModel = _loadingComponentModel
.getEmbeddedComponentModel(embeddedId);
if (embeddedModel != null)
{
String modelType = embeddedModel.getComponentType();
if (isNonBlank(modelType) && embeddedType != null)
{
Logger log = _loadingComponentModel.getLogger();
log.error(ServicesMessages.compTypeConflict(embeddedId, embeddedType, modelType));
}
embeddedType = modelType;
embeddedComponentClassName = embeddedModel.getComponentClassName();
}
if (isBlank(embeddedType) && isBlank(embeddedComponentClassName)) 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 = 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 = _loadingElement;
Runnable finalizer = new Runnable()
{