use of org.apache.tapestry5.plastic.PlasticField in project tapestry-5 by apache.
the class PersistenceContextWorker method transform.
@Override
public void transform(PlasticClass plasticClass, TransformationSupport support, MutableComponentModel model) {
for (final PlasticField field : plasticClass.getFieldsWithAnnotation(PersistenceContext.class)) {
final PersistenceContext annotation = field.getAnnotation(PersistenceContext.class);
field.claim(annotation);
field.setConduit(new ReadOnlyComponentFieldConduit(plasticClass.getClassName(), field.getName()) {
@Override
public Object get(Object instance, InstanceContext context) {
return JpaInternalUtils.getEntityManager(entityManagerManager, annotation);
}
});
}
}
use of org.apache.tapestry5.plastic.PlasticField in project tapestry-5 by apache.
the class UnclaimedFieldWorker method createComputedFieldConduit.
private ComputedValue<FieldConduit<Object>> createComputedFieldConduit(PlasticField field) {
final String fieldType = field.getTypeName();
return new ComputedValue<FieldConduit<Object>>() {
public FieldConduit<Object> get(InstanceContext context) {
Object fieldDefaultValue = classCache.defaultValueForType(fieldType);
InternalComponentResources resources = context.get(InternalComponentResources.class);
return new UnclaimedFieldConduit(resources, perThreadManager.createValue(), fieldDefaultValue);
}
};
}
use of org.apache.tapestry5.plastic.PlasticField in project tapestry-5 by apache.
the class StrategyBuilderImpl method createProxy.
private <S> S createProxy(final Class<S> interfaceType, final StrategyRegistry<S> registry) {
ClassInstantiator instantiator = proxyFactory.createProxy(interfaceType, new PlasticClassTransformer() {
@Override
public void transform(PlasticClass plasticClass) {
final PlasticField registryField = plasticClass.introduceField(StrategyRegistry.class, "registry").inject(registry);
Class<?> interfaceSelectorType = null;
for (final Method method : interfaceType.getMethods()) {
Class<?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length == 0) {
throw new IllegalArgumentException("Invalid method " + method + ", when using the strategy pattern, every method must take at least the selector as its parameter");
}
Class<?> methodSelectorType = parameterTypes[0];
if (interfaceSelectorType == null) {
interfaceSelectorType = methodSelectorType;
} else if (!interfaceSelectorType.equals(methodSelectorType)) {
throw new IllegalArgumentException("Conflicting method definitions," + " expecting the first argument of every method to have the same type");
}
plasticClass.introduceMethod(new MethodDescription(method), new InstructionBuilderCallback() {
@Override
public void doBuild(InstructionBuilder builder) {
Class returnType = method.getReturnType();
builder.loadThis().getField(registryField);
// Argument 0 is the selector used to find the adapter and should be an object reference,
// not a primitive.
builder.loadArgument(0);
// Use the StrategyRegistry to get the adapter to re-invoke the method on
builder.invoke(StrategyRegistry.class, Object.class, "getByInstance", Object.class).checkcast(interfaceType);
// That leaves the correct adapter on top of the stack. Get the
// selector and the rest of the arguments in place and invoke the method.
builder.loadArguments().invoke(interfaceType, returnType, method.getName(), method.getParameterTypes());
builder.returnResult();
}
});
}
plasticClass.addToString(String.format("<Strategy for %s>", interfaceType.getName()));
}
});
return interfaceType.cast(instantiator.newInstance());
}
use of org.apache.tapestry5.plastic.PlasticField in project tapestry-5 by apache.
the class ChainBuilderImpl method implementMethod.
private void implementMethod(PlasticClass plasticClass, final Method method, final PlasticField commandsField) {
plasticClass.introduceMethod(method).changeImplementation(new InstructionBuilderCallback() {
@Override
public void doBuild(InstructionBuilder builder) {
builder.loadThis().getField(commandsField).iterateArray(new InstructionBuilderCallback() {
@Override
public void doBuild(InstructionBuilder builder) {
// The command is on the stack; add the elements and invoke the method.
builder.loadArguments().invoke(method);
Class returnType = method.getReturnType();
if (returnType == void.class)
return;
final boolean wide = returnType == long.class || returnType == double.class;
if (wide)
builder.dupeWide();
else
builder.dupe();
if (returnType == float.class) {
builder.loadConstant(0f).compareSpecial("float");
}
if (returnType == long.class) {
builder.loadConstant(0l).compareSpecial("long");
}
if (returnType == double.class) {
builder.loadConstant(0d).compareSpecial("double");
}
Condition condition = returnType.isPrimitive() ? Condition.NON_ZERO : Condition.NON_NULL;
builder.when(condition, new WhenCallback() {
@Override
public void ifTrue(InstructionBuilder builder) {
builder.returnResult();
}
@Override
public void ifFalse(InstructionBuilder builder) {
if (wide)
builder.popWide();
else
builder.pop();
}
});
}
});
builder.returnDefaultValue();
}
});
}
use of org.apache.tapestry5.plastic.PlasticField in project tapestry-5 by apache.
the class ChainBuilderImpl method build.
@Override
@SuppressWarnings("unchecked")
public <T> T build(final Class<T> commandInterface, List<T> commands) {
// Jump through some hoops to convert the list into an array of the proper type
Object[] array = (Object[]) Array.newInstance(commandInterface, commands.size());
final Object[] commandsArray = commands.toArray(array);
ClassInstantiator<T> instantiator = proxyFactory.createProxy(commandInterface, new PlasticClassTransformer() {
@Override
public void transform(PlasticClass plasticClass) {
PlasticField commandsField = plasticClass.introduceField(commandsArray.getClass(), "commands").inject(commandsArray);
for (Method method : commandInterface.getMethods()) {
if (!Modifier.isStatic(method.getModifiers())) {
implementMethod(plasticClass, method, commandsField);
}
}
plasticClass.addToString(String.format("<Command chain of %s>", commandInterface.getName()));
}
});
return instantiator.newInstance();
}
Aggregations