package org.whole.lang.pojo.templates; import org.whole.lang.java.factories.JavaEntityFactory; import org.whole.lang.java.model.ArrayType; import org.whole.lang.java.model.ParameterizedType; import org.whole.lang.java.model.PrimitiveType; import org.whole.lang.java.model.Types; import org.whole.lang.java.reflect.JavaEntityDescriptorEnum; import org.whole.lang.matchers.Matcher; import org.whole.lang.model.IEntity; import org.whole.lang.pojo.factories.PojoEntityFactory; import org.whole.lang.pojo.model.CollectionInterfaceEnum; import org.whole.lang.pojo.model.CollectionType; import org.whole.lang.pojo.model.MapType; import org.whole.lang.pojo.model.PrimitiveTypeEnum; import org.whole.lang.pojo.model.Type; import org.whole.lang.pojo.reflect.PojoEntityDescriptorEnum; import org.whole.lang.util.DataTypeUtils; import org.whole.lang.util.StringUtils; public class Helpers { public static Type toPojoType(IEntity javaType, IEntity packageName) { PojoEntityFactory pef = PojoEntityFactory.instance; switch (javaType.wGetEntityDescriptor().getOrdinal()) { case JavaEntityDescriptorEnum.SimpleType_ord: case JavaEntityDescriptorEnum.QualifiedType_ord: String javaTypeName = DataTypeUtils.getAsPersistenceString(javaType); String packageNameString = packageName.wStringValue(); String typeName = (javaTypeName.indexOf('.') == -1 ? (StringUtils.isAmbiguous(javaTypeName) ? "java.lang" : packageNameString) + "." : "") + javaTypeName; if (StringUtils.isString(typeName)) return pef.createPrimitiveType(PrimitiveTypeEnum.String); else if ("java.util.Set".equals(typeName)) return pef.createCollectionType(pef.createCollectionInterface(CollectionInterfaceEnum.Set), pef.createReferenceType("java.lang.Object")); else if ("java.util.List".equals(typeName)) return pef.createCollectionType(pef.createCollectionInterface(CollectionInterfaceEnum.List), pef.createReferenceType("java.lang.Object")); else if ("java.util.Map".equals(typeName)) return pef.createMapType(pef.createReferenceType("java.lang.Object"), pef.createReferenceType("java.lang.Object")); else return pef.createReferenceType(typeName); case JavaEntityDescriptorEnum.PrimitiveType_ord: return (Type) DataTypeUtils.convertCloneIfParented(JavaEntityFactory.instance.createPrimitiveType(((PrimitiveType) javaType).getValue()), PojoEntityDescriptorEnum.PrimitiveType); case JavaEntityDescriptorEnum.ArrayType_ord: ArrayType arrayType = (ArrayType) javaType; return pef.createArrayType(toPojoType(arrayType.getComponentType(), packageName)); case JavaEntityDescriptorEnum.ParameterizedType_ord: ParameterizedType parameterizedType = (ParameterizedType) javaType; Types typeArguments = parameterizedType.getTypeArguments(); Type pojoType = toPojoType(parameterizedType.getType(), packageName); if (Matcher.matchImpl(PojoEntityDescriptorEnum.CollectionType, pojoType) && typeArguments.wSize() == 1) ((CollectionType) pojoType).setElementType(toPojoType(typeArguments.wGet(0), packageName)); else if (Matcher.matchImpl(PojoEntityDescriptorEnum.MapType, pojoType) && typeArguments.wSize() == 2) { ((MapType) pojoType).setKeyType(toPojoType(typeArguments.wGet(0), packageName)); ((MapType) pojoType).setValueType(toPojoType(typeArguments.wGet(1), packageName)); } return pojoType; default: throw new IllegalStateException("cannot convert java type to pojo type: "+javaType); } } }