package com.google.code.joto.value2java.converters; import com.google.code.joto.ast.beanstmt.BeanAST.BeanExpr; import com.google.code.joto.ast.beanstmt.BeanAST.LiteralExpr; import com.google.code.joto.ast.beanstmt.BeanAST.MethodApplyExpr; 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.PrimitiveFieldValueHolder; import com.google.code.joto.value2java.ObjectVHToStmtConverter; import com.google.code.joto.value2java.VHToStmt; import com.google.code.joto.value2java.VHToStmtConverterLookup; import com.google.code.joto.value2java.impl.ObjectStmtInfo; import java.lang.reflect.Field; import java.util.Map; /** * Converter for ObjectValueHolder -> Stmt , for primitive wrapper * example: * object value: AbstractObjectValueHolder... for "java.lang.Integer" * => convert to BeanExpr(no additional stmts)... for "Integer.valueOf(primitiveIntValue)" * */ public class PrimitiveWrapperVHToStmtConverter implements ObjectVHToStmtConverter { private static final PrimitiveWrapperVHToStmtConverter BooleanConv = new PrimitiveWrapperVHToStmtConverter(Boolean.class); private static final PrimitiveWrapperVHToStmtConverter CharacterConv = new PrimitiveWrapperVHToStmtConverter(Character.class); private static final PrimitiveWrapperVHToStmtConverter ByteConv = new PrimitiveWrapperVHToStmtConverter(Byte.class); private static final PrimitiveWrapperVHToStmtConverter ShortConv = new PrimitiveWrapperVHToStmtConverter(Short.class); private static final PrimitiveWrapperVHToStmtConverter IntegerConv = new PrimitiveWrapperVHToStmtConverter(Integer.class); private static final PrimitiveWrapperVHToStmtConverter LongConv = new PrimitiveWrapperVHToStmtConverter(Long.class); private static final PrimitiveWrapperVHToStmtConverter FloatConv = new PrimitiveWrapperVHToStmtConverter(Float.class); private static final PrimitiveWrapperVHToStmtConverter DoubleConv = new PrimitiveWrapperVHToStmtConverter(Double.class); private static final EnumVHToStmtConverter EnumConv = new EnumVHToStmtConverter(); public static void registerDefaultConverters(VHToStmtConverterLookup p) { p.registerConverter(BooleanConv, 0); p.registerConverter(CharacterConv, 0); p.registerConverter(ByteConv, 0); p.registerConverter(ShortConv, 0); p.registerConverter(IntegerConv, 0); p.registerConverter(LongConv, 0); p.registerConverter(FloatConv, 0); p.registerConverter(DoubleConv, 0); p.registerConverter(EnumConv, 0); } // private final Class<?> primitiveType; private final Class<?> wrapperType; //------------------------------------------------------------------------- protected PrimitiveWrapperVHToStmtConverter(Class<?> wrapperType) { // this.primitiveType = ReflectUtils.wrapperTypeToPrimitive(wrapperType); this.wrapperType = wrapperType; } // ------------------------------------------------------------------------- @Override public boolean canConvert(Class<?> type) { return wrapperType == type; } @Override public void convert(VHToStmt owner, AbstractObjectValueHolder obj, ObjectStmtInfo objInfo) { // step1: extract value from valueHolder Object wrapperValue; Class<?> wrapperType; if (obj instanceof ImmutableObjectValueHolder) { ImmutableObjectValueHolder obj2 = (ImmutableObjectValueHolder) obj; wrapperValue = obj2.getValue(); wrapperType = obj2.getObjClass(); } else if (obj instanceof ObjectValueHolder) { ObjectValueHolder obj2 = (ObjectValueHolder) obj; // object should have only 1 field, using PrimitiveFieldValueHolder.. Map<Field, FieldValueHolder> fields = obj2.getFieldsValuesMap(); if (fields.size() != 1) throw new IllegalStateException(); FieldValueHolder fVH = fields.values().iterator().next(); if (!(fVH instanceof PrimitiveFieldValueHolder)) throw new IllegalStateException(); wrapperValue = ((PrimitiveFieldValueHolder) fVH).getValue(); wrapperType = obj2.getObjClass(); } else { throw new IllegalStateException(); } assert wrapperValue.getClass() == wrapperType; // convert value from wrapper, to stmt String wrapperTypeName = wrapperType.getClass().getSimpleName(); String methodName = "valueOf"; BeanExpr initExpr = new MethodApplyExpr( new SimpleNameExpr(wrapperTypeName), methodName, new LiteralExpr(wrapperValue)); objInfo.setTypeAndInitExpr(wrapperType, initExpr); } // override java.lang.Object //------------------------------------------------------------------------- @Override public String toString() { return "PrimitiveWrapperVHToStmtConverter[" + wrapperType + "]"; } }