use of org.apache.tapestry5.internal.services.Instantiator 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;
}
use of org.apache.tapestry5.internal.services.Instantiator 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());
}
use of org.apache.tapestry5.internal.services.Instantiator in project tapestry-5 by apache.
the class ComponentInstantiatorSourceImplTest method createComponent.
private Component createComponent(String classname) {
InternalComponentResources resources = mockInternalComponentResources();
replay();
Instantiator inst = source.getInstantiator(classname);
Component target = inst.newInstance(resources);
verify();
return target;
}
use of org.apache.tapestry5.internal.services.Instantiator in project tapestry-5 by apache.
the class ClojureBuilderImpl method build.
@Override
public <T> T build(final Class<T> interfaceType) {
assert interfaceType != null;
assert interfaceType.isInterface();
Namespace annotation = interfaceType.getAnnotation(Namespace.class);
if (annotation == null) {
throw new IllegalArgumentException(String.format("Interface type %s does not have the Namespace annotation.", interfaceType.getName()));
}
final String namespace = annotation.value();
ClassInstantiator<T> instantiator = proxyFactory.createProxy(interfaceType, new PlasticClassTransformer() {
@Override
public void transform(PlasticClass plasticClass) {
for (final Method m : interfaceType.getMethods()) {
bridgeToClojure(plasticClass, m);
}
}
private void bridgeToClojure(final PlasticClass plasticClass, final Method method) {
final MethodDescription desc = new MethodDescription(method);
if (method.getReturnType() == void.class) {
throw new IllegalArgumentException(String.format("Method %s may not be void when bridging to Clojure functions.", desc));
}
final Symbol symbol = mapper.mapMethod(namespace, method);
tracker.run(String.format("Mapping %s method %s to Clojure function %s", interfaceType.getName(), desc.toShortString(), symbol.toString()), new Runnable() {
@Override
public void run() {
Symbol namespaceSymbol = Symbol.create(symbol.getNamespace());
REQUIRE.invoke(namespaceSymbol);
IFn clojureFunction = Clojure.var(symbol);
final PlasticField fnField = plasticClass.introduceField(IFn.class, method.getName() + "IFn").inject(clojureFunction);
plasticClass.introduceMethod(desc).changeImplementation(new InstructionBuilderCallback() {
@Override
public void doBuild(InstructionBuilder builder) {
bridgeToClojure(builder, desc, fnField);
}
});
}
});
}
private void bridgeToClojure(InstructionBuilder builder, MethodDescription description, PlasticField ifnField) {
builder.loadThis().getField(ifnField);
int count = description.argumentTypes.length;
Class[] invokeParameterTypes = new Class[count];
for (int i = 0; i < count; i++) {
invokeParameterTypes[i] = Object.class;
builder.loadArgument(i).boxPrimitive(description.argumentTypes[i]);
}
Method ifnMethod = null;
try {
ifnMethod = IFn.class.getMethod("invoke", invokeParameterTypes);
} catch (NoSuchMethodException ex) {
throw new RuntimeException(String.format("Unable to find correct IFn.invoke() method: %s", ExceptionUtils.toMessage(ex)), ex);
}
builder.invoke(ifnMethod);
builder.castOrUnbox(description.returnType);
builder.returnResult();
}
});
return instantiator.newInstance();
}
use of org.apache.tapestry5.internal.services.Instantiator in project tapestry-5 by apache.
the class InternalComponentResourcesImplTest method render_informal_parameters_no_bindings.
@Test
public void render_informal_parameters_no_bindings() {
ComponentPageElement element = mockComponentPageElement();
Component component = mockComponent();
Instantiator ins = mockInstantiator(component);
MarkupWriter writer = mockMarkupWriter();
TypeCoercer coercer = mockTypeCoercer();
ComponentModel model = mockComponentModel();
train_getModel(ins, model);
replay();
InternalComponentResources resources = new InternalComponentResourcesImpl(null, element, null, elementResources, null, null, ins, false);
resources.renderInformalParameters(writer);
verify();
}
Aggregations