package org.esmerilprogramming.overtown.http.converter;
import org.esmerilprogramming.overtown.http.OvertownRequest;
import org.jboss.logging.Logger;
import org.jboss.logging.Logger.Level;
import java.lang.reflect.*;
/**
* @author efraimgentil (efraim.gentil@gmail.com)
*/
public class ModelConverter implements ParameterConverter {
private static final Logger LOGGER = Logger.getLogger(ModelConverter.class);
@Override
public <T> T translate(Class<T> clazz, String parameterName,
OvertownRequest cloverRequest) {
boolean shouldTranslate = cloverRequest.containsAttributeStartingWith(parameterName);
if (shouldTranslate) {
try {
Constructor<T> construtor = clazz.getConstructor();
T retorno = construtor.newInstance();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
String fullParameterName = parameterName + "." + fieldName;
Object paramValue = cloverRequest.getParameter(parameterName + "." + fieldName);
if (paramValue != null) {
String setFieldName = Character.toString(fieldName.charAt(0)).toUpperCase() + fieldName.substring(1);
try {
Method method = clazz.getMethod("set" + setFieldName, field.getType());
if(Modifier.isPublic(method.getModifiers())) {
ParametersConverter translator = new ParametersConverter();
method.invoke(retorno, translator.translateParameter(field.getType(), fullParameterName, cloverRequest));
}
}catch(NoSuchMethodException nsme){
//DO nothing if doesn't have setMethod
}
}
}
return retorno;
} catch (NoSuchMethodException | SecurityException | InstantiationException |
IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
LOGGER.log(Level.FATAL, e.getMessage());
}
}
return null;
}
}