package net.agef.jobexchange.services.internal;
import java.lang.reflect.Modifier;
import net.agef.jobexchange.annotation.InjectSelectionModel;
import net.agef.jobexchange.services.internal.GenericSelectionModel;
import net.agef.jobexchange.services.internal.GenericValueEncoder;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.apache.tapestry5.ioc.util.BodyBuilder;
import org.apache.tapestry5.model.MutableComponentModel;
import org.apache.tapestry5.services.ClassTransformation;
import org.apache.tapestry5.services.ComponentClassTransformWorker;
import org.apache.tapestry5.services.TransformMethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class InjectSelectionModelWorker implements ComponentClassTransformWorker {
final private Logger _logger = LoggerFactory.getLogger(InjectSelectionModelWorker.class);
final private PropertyAccess _access;
public InjectSelectionModelWorker(PropertyAccess propertyAccess) {
_access = propertyAccess;
}
public void transform(ClassTransformation transformation, MutableComponentModel componentModel) {
for (String fieldName : transformation.findFieldsWithAnnotation(InjectSelectionModel.class)) {
InjectSelectionModel annotation = transformation.getFieldAnnotation(fieldName, InjectSelectionModel.class);
if (_logger.isDebugEnabled()){
_logger.debug("Creating selection model getter method for the field " + fieldName);
}
String accessActualName = transformation.addField(Modifier.PRIVATE, "org.apache.tapestry5.ioc.services.PropertyAccess", "_access");
transformation.injectField(accessActualName, _access);
addGetSelectionModelMethod(transformation, fieldName, annotation.labelField(), accessActualName);
if (_logger.isDebugEnabled()){
_logger.debug("Creating value encoder getter method for the field " + fieldName);
}
addGetValueEncoderMethod(transformation, fieldName, annotation.idField(), accessActualName);
}
}
private void addGetSelectionModelMethod(ClassTransformation transformation, String fieldName, String labelField, String accessName) {
String methodName = "get" + InternalUtils.capitalize(InternalUtils.stripMemberName(fieldName)) + "SelectionModel";
String modelQualifiedName = (GenericSelectionModel.class).getName();
TransformMethodSignature sig =
new TransformMethodSignature(Modifier.PUBLIC, modelQualifiedName, methodName, null, null);
BodyBuilder builder = new BodyBuilder();
builder.begin();
builder.addln("return new " + modelQualifiedName + "(" + fieldName + ", \"" + labelField +"\", " + accessName + ");");
builder.end();
transformation.addMethod(sig, builder.toString());
}
private void addGetValueEncoderMethod(ClassTransformation transformation, String fieldName, String idField, String accessName) {
String methodName = "get" + InternalUtils.capitalize(InternalUtils.stripMemberName(fieldName)) + "ValueEncoder";
String encoderQualifiedName = (GenericValueEncoder.class).getName();
TransformMethodSignature sig =
new TransformMethodSignature(Modifier.PUBLIC, encoderQualifiedName, methodName, null, null);
BodyBuilder builder = new BodyBuilder();
builder.begin();
String line = "return new " + encoderQualifiedName + "(" + fieldName + ",\"" + idField +"\", " + accessName + ");";
builder.addln(line);
builder.end();
transformation.addMethod(sig, builder.toString());
}
}