use of org.apache.tapestry5.internal.structure.ComponentPageElement in project tapestry-5 by apache.
the class AjaxComponentInstanceEventResultProcessor method processResultValue.
public void processResultValue(Component value) throws IOException {
ComponentResources resources = value.getComponentResources();
boolean isPage = value == resources.getPage();
String pageName = resources.getPageName();
if (isPage) {
// This will ultimately send a JSON response to redirect to the page
masterProcessor.processResultValue(pageName);
return;
}
// Otherwise, a component within a page. Components are transformed to implement RenderCommand, but if we just
// pass the component itself to the master processor, we'll get in a loop, so we instead
// pass the ComponentPageElement (which implements RenderCommand as well).
Page page = cache.get(pageName);
String nestedId = resources.getNestedId();
RenderCommand command = page.getComponentElementByNestedId(nestedId);
masterProcessor.processResultValue(command);
}
use of org.apache.tapestry5.internal.structure.ComponentPageElement in project tapestry-5 by apache.
the class PageLoaderImpl method addParameterBindingAction.
private void addParameterBindingAction(AssemblerContext context, final EmbeddedComponentAssembler embeddedAssembler, final String parameterName, final String parameterValue, final String metaDefaultBindingPrefix, final Location location, final boolean ignoreUnmatchedFormal) {
if (embeddedAssembler.isBound(parameterName))
return;
embeddedAssembler.setBound(parameterName);
if (parameterValue.startsWith(InternalConstants.INHERIT_BINDING_PREFIX)) {
String containerParameterName = parameterValue.substring(InternalConstants.INHERIT_BINDING_PREFIX.length());
addInheritedBindingAction(context, parameterName, containerParameterName);
return;
}
context.add(new PageAssemblyAction() {
public void execute(PageAssembly pageAssembly) {
// Because of published parameters, we have to wait until page assembly time to throw out
// informal parameters bound to components that don't support informal parameters ...
// otherwise we'd throw out (sometimes!) published parameters.
final ParameterBinder binder = embeddedAssembler.createParameterBinder(parameterName);
if (binder == null) {
if (ignoreUnmatchedFormal) {
return;
}
throw new UnknownValueException(String.format("Component %s does not include a formal parameter '%s' (and does not support informal parameters).", pageAssembly.createdElement.peek().getCompleteId(), parameterName), null, null, new AvailableValues("Formal parameters", embeddedAssembler.getFormalParameterNames()));
}
final String defaultBindingPrefix = binder.getDefaultBindingPrefix(metaDefaultBindingPrefix);
InternalComponentResources containerResources = pageAssembly.activeElement.peek().getComponentResources();
ComponentPageElement embeddedElement = pageAssembly.createdElement.peek();
InternalComponentResources embeddedResources = embeddedElement.getComponentResources();
Binding binding = elementFactory.newBinding(parameterName, containerResources, embeddedResources, defaultBindingPrefix, parameterValue, location);
binder.bind(embeddedElement, binding);
}
});
}
use of org.apache.tapestry5.internal.structure.ComponentPageElement in project tapestry-5 by apache.
the class PageLoaderImpl method parameter.
private void parameter(AssemblerContext context) {
final ParameterToken token = context.next(ParameterToken.class);
context.add(new PageAssemblyAction() {
public void execute(PageAssembly pageAssembly) {
String parameterName = token.name;
ComponentPageElement element = pageAssembly.createdElement.peek();
Location location = token.getLocation();
BlockImpl block = new BlockImpl(location, interner.format("Parameter %s of %s", parameterName, element.getCompleteId()));
Binding binding = new LiteralBinding(location, "block parameter " + parameterName, block);
EmbeddedComponentAssembler embeddedAssembler = pageAssembly.embeddedAssembler.peek();
ParameterBinder binder = embeddedAssembler.createParameterBinder(parameterName);
if (binder == null) {
throw new UnknownValueException(String.format("Component %s does not include a formal parameter '%s' (and does not support informal parameters).", element.getCompleteId(), parameterName), location, null, new AvailableValues("Formal parameters", embeddedAssembler.getFormalParameterNames()));
}
binder.bind(pageAssembly.createdElement.peek(), binding);
pageAssembly.bodyElement.push(block);
}
});
consumeToEndElementAndPopBodyElement(context);
}
use of org.apache.tapestry5.internal.structure.ComponentPageElement in project tapestry-5 by apache.
the class PageLoaderImpl method startComponent.
private EmbeddedComponentAssembler startComponent(AssemblerContext context) {
StartComponentToken token = context.next(StartComponentToken.class);
ComponentAssembler assembler = context.assembler;
String elementName = token.getElementName();
// Initial guess: the type from the token (but this may be null in many cases).
String embeddedType = token.getComponentType();
// This may be null for an anonymous component.
String embeddedId = token.getId();
String embeddedComponentClassName = null;
final EmbeddedComponentModel embeddedModel = embeddedId == null ? null : assembler.getModel().getEmbeddedComponentModel(embeddedId);
if (embeddedId == null)
embeddedId = assembler.generateEmbeddedId(embeddedType);
if (embeddedModel != null) {
String modelType = embeddedModel.getComponentType();
if (InternalUtils.isNonBlank(modelType) && embeddedType != null) {
throw new TapestryException(String.format("Embedded component '%s' provides a type attribute in the template ('%s') " + "as well as in the component class ('%s'). You should not provide a type attribute " + "in the template when defining an embedded component within the component class.", embeddedId, embeddedType, modelType), token, null);
}
embeddedType = modelType;
embeddedComponentClassName = embeddedModel.getComponentClassName();
}
String componentClassName = embeddedComponentClassName;
if (InternalUtils.isNonBlank(embeddedType)) {
try {
componentClassName = componentClassResolver.resolveComponentTypeToClassName(embeddedType);
} catch (RuntimeException ex) {
throw new TapestryException(ex.getMessage(), token, ex);
}
}
// OK, now we can record an action to get it instantiated.
EmbeddedComponentAssembler embeddedAssembler = assembler.createEmbeddedAssembler(embeddedId, componentClassName, embeddedModel, token.getMixins(), token.getLocation());
addActionForEmbeddedComponent(context, embeddedAssembler, embeddedId, elementName, componentClassName);
addParameterBindingActions(context, embeddedAssembler, embeddedModel);
if (embeddedModel != null && embeddedModel.getInheritInformalParameters()) {
// Another two-step: The first "captures" the container and embedded component. The second
// occurs at the end of the page setup.
assembler.add(new PageAssemblyAction() {
public void execute(PageAssembly pageAssembly) {
final ComponentPageElement container = pageAssembly.activeElement.peek();
final ComponentPageElement embedded = pageAssembly.createdElement.peek();
pageAssembly.deferred.add(new PageAssemblyAction() {
public void execute(PageAssembly pageAssembly) {
copyInformalParameters(container, embedded);
}
});
}
});
}
return embeddedAssembler;
}
use of org.apache.tapestry5.internal.structure.ComponentPageElement in project tapestry-5 by apache.
the class EmbeddedComponentAssemblerImpl method addMixinsToElement.
public int addMixinsToElement(ComponentPageElement newElement) {
for (Map.Entry<String, Instantiator> entry : mixinIdToInstantiator.entrySet()) {
String mixinId = entry.getKey();
Instantiator instantiator = entry.getValue();
newElement.addMixin(mixinId, instantiator, mixinsIdToOrderConstraints.get(mixinId));
}
return mixinIdToInstantiator.size();
}
Aggregations