Search in sources :

Example 6 with Mixin

use of org.apache.tapestry5.annotations.Mixin in project tapestry-5 by apache.

the class EmbeddedComponentAssemblerImpl method addMixin.

private void addMixin(String className, String... order) {
    Instantiator mixinInstantiator = instantiatorSource.getInstantiator(className);
    String mixinId = InternalUtils.lastTerm(className);
    if (mixinIdToInstantiator.containsKey(mixinId))
        throw new TapestryException(String.format("Mixins applied to a component must be unique. Mixin '%s' has already been applied.", mixinId), location, null);
    mixinIdToInstantiator.put(mixinId, mixinInstantiator);
    mixinsIdToOrderConstraints.put(mixinId, order);
}
Also used : Instantiator(org.apache.tapestry5.internal.services.Instantiator) TapestryException(org.apache.tapestry5.commons.internal.util.TapestryException)

Example 7 with Mixin

use of org.apache.tapestry5.annotations.Mixin in project tapestry-5 by apache.

the class EmbeddedComponentAssemblerImpl method prescanMixins.

private String prescanMixins(boolean strictMixinParameters) {
    // Mixin id found to support informal parameters
    String supportsInformals = null;
    for (Map.Entry<String, Instantiator> entry : mixinIdToInstantiator.entrySet()) {
        String mixinId = entry.getKey();
        ComponentModel mixinModel = entry.getValue().getModel();
        updateParameterNameToQualified(mixinId, mixinModel, strictMixinParameters);
        if (supportsInformals == null && mixinModel.getSupportsInformalParameters())
            supportsInformals = mixinId;
    }
    // The component comes last and overwrites simple names from the others.
    updateParameterNameToQualified(null, componentModel, false);
    return supportsInformals;
}
Also used : ComponentModel(org.apache.tapestry5.model.ComponentModel) EmbeddedComponentModel(org.apache.tapestry5.model.EmbeddedComponentModel) Instantiator(org.apache.tapestry5.internal.services.Instantiator) Map(java.util.Map)

Example 8 with Mixin

use of org.apache.tapestry5.annotations.Mixin in project tapestry-5 by apache.

the class EmbeddedComponentAssemblerImpl method createParameterBinderFromQualifiedParameterName.

private ParameterBinder createParameterBinderFromQualifiedParameterName(String qualifiedParameterName, String mixinId, String parameterName) {
    if (mixinId.equalsIgnoreCase(componentPsuedoMixinId)) {
        return createParameterBinderForComponent(qualifiedParameterName, parameterName);
    }
    if (!mixinIdToInstantiator.containsKey(mixinId)) {
        throw new TapestryException(String.format("Mixin id for parameter '%s' not found. Attached mixins: %s.", qualifiedParameterName, InternalUtils.joinSorted(mixinIdToInstantiator.keySet())), location, null);
    }
    ParameterBinder binder = parameterNameToBinder.get(qualifiedParameterName);
    if (binder != null) {
        return binder;
    }
    // Ok, so perhaps this is a qualified name for an informal parameter of the mixin.
    Instantiator instantiator = mixinIdToInstantiator.get(mixinId);
    assert instantiator != null;
    return bindInformalParameter(qualifiedParameterName, mixinId, parameterName, instantiator.getModel());
}
Also used : Instantiator(org.apache.tapestry5.internal.services.Instantiator) TapestryException(org.apache.tapestry5.commons.internal.util.TapestryException)

Example 9 with Mixin

use of org.apache.tapestry5.annotations.Mixin in project tapestry-5 by apache.

the class PageLoaderImpl method connectInheritedParameter.

private void connectInheritedParameter(ComponentPageElement container, ComponentPageElement embedded, String parameterName, String containerParameterName) {
    // TODO: This assumes that the two parameters are both on the core component and not on
    // a mixin. I think this could be improved with more static analysis.
    Binding containerBinding = container.getBinding(containerParameterName);
    if (containerBinding == null)
        return;
    // This helps with debugging, and re-orients any thrown exceptions
    // to the location of the inherited binding, rather than the container component's
    // binding.
    // Binding inherited = new InheritedBinding(description, containerBinding, embedded.getLocation());
    embedded.bindParameter(parameterName, containerBinding);
}
Also used : LiteralBinding(org.apache.tapestry5.internal.bindings.LiteralBinding) Binding(org.apache.tapestry5.Binding)

Example 10 with Mixin

use of org.apache.tapestry5.annotations.Mixin in project tapestry-5 by apache.

the class OverridenMixin method afterRender.

void afterRender(MarkupWriter writer) {
    final Element element = writer.getDocument().getElementById(clientElement.getClientId());
    element.element("span", "id", "overridenMixin").text(" [Overriden mixin]");
}
Also used : ClientElement(org.apache.tapestry5.ClientElement) Element(org.apache.tapestry5.dom.Element)

Aggregations

TapestryException (org.apache.tapestry5.commons.internal.util.TapestryException)3 Instantiator (org.apache.tapestry5.internal.services.Instantiator)3 ClientElement (org.apache.tapestry5.ClientElement)2 UnknownValueException (org.apache.tapestry5.commons.util.UnknownValueException)2 Element (org.apache.tapestry5.dom.Element)2 Map (java.util.Map)1 Binding (org.apache.tapestry5.Binding)1 ComponentResources (org.apache.tapestry5.ComponentResources)1 BindParameter (org.apache.tapestry5.annotations.BindParameter)1 Mixin (org.apache.tapestry5.annotations.Mixin)1 Resource (org.apache.tapestry5.commons.Resource)1 AvailableValues (org.apache.tapestry5.commons.util.AvailableValues)1 InternalComponentResources (org.apache.tapestry5.internal.InternalComponentResources)1 LiteralBinding (org.apache.tapestry5.internal.bindings.LiteralBinding)1 ComponentWorker (org.apache.tapestry5.internal.transform.ComponentWorker)1 InjectComponentWorker (org.apache.tapestry5.internal.transform.InjectComponentWorker)1 MixinAfterWorker (org.apache.tapestry5.internal.transform.MixinAfterWorker)1 MixinWorker (org.apache.tapestry5.internal.transform.MixinWorker)1 PageActivationContextWorker (org.apache.tapestry5.internal.transform.PageActivationContextWorker)1 PropertyWorker (org.apache.tapestry5.internal.transform.PropertyWorker)1