package com.google.code.joto.value2java.converters;
import com.google.code.joto.ast.beanstmt.BeanAST.BeanExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.FieldExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.LiteralExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.SimpleNameExpr;
import com.google.code.joto.ast.valueholder.ValueHolderAST.AbstractObjectValueHolder;
import com.google.code.joto.ast.valueholder.ValueHolderAST.FieldValueHolder;
import com.google.code.joto.ast.valueholder.ValueHolderAST.ImmutableObjectValueHolder;
import com.google.code.joto.ast.valueholder.ValueHolderAST.ObjectValueHolder;
import com.google.code.joto.ast.valueholder.ValueHolderAST.RefFieldValueHolder;
import com.google.code.joto.value2java.ObjectVHToStmtConverter;
import com.google.code.joto.value2java.VHToStmt;
import com.google.code.joto.value2java.impl.ObjectStmtInfo;
import java.lang.reflect.Field;
import java.util.Map;
/**
* converter for java 5 Enum objects
*
* format as <<SimpleClassName>>.<<EnumName>>
* where <<EnumName>> is retreived from field "java.lang.Enum#name"
*
*/
public class EnumVHToStmtConverter implements ObjectVHToStmtConverter {
@Override
public boolean canConvert(Class<?> type) {
return type.isEnum();
}
@Override
public void convert(VHToStmt owner, AbstractObjectValueHolder obj, ObjectStmtInfo objInfo) {
try {
ObjectValueHolder objVH = (ObjectValueHolder) obj;
Class<?> enumClass = objVH.getObjClass();
Class<?> enumLangClass = java.lang.Enum.class;
Field[] enumLangFields = enumLangClass.getDeclaredFields();
Field enumLangNameField = enumLangFields[0];
Map<Field, FieldValueHolder> fieldsValuesMap = objVH.getFieldsValuesMap();
RefFieldValueHolder enumLangNameRefVH = (RefFieldValueHolder) fieldsValuesMap.get(enumLangNameField);
ImmutableObjectValueHolder enumLangNameVH = (ImmutableObjectValueHolder) enumLangNameRefVH.getTo();
String enumLangNameValue = (String) enumLangNameVH.getValue();
BeanExpr enumClassExpr = new SimpleNameExpr(enumClass.getSimpleName());
FieldExpr enumFieldExpr = new FieldExpr(enumClassExpr, enumLangNameValue);
objInfo.setTypeAndInitExpr(enumClass, enumFieldExpr);
} catch(Exception ex) {
objInfo.setTypeAndInitExpr(String.class, new LiteralExpr("*** Failed to decode enum ****"));
}
}
}