001package org.granite.generator.as3; 002 003import java.io.Serializable; 004import java.lang.reflect.ParameterizedType; 005import java.lang.reflect.Type; 006import java.math.BigDecimal; 007import java.math.BigInteger; 008import java.math.MathContext; 009import java.math.RoundingMode; 010import java.net.URI; 011import java.net.URL; 012import java.util.Calendar; 013import java.util.Collection; 014import java.util.Date; 015import java.util.HashMap; 016import java.util.Locale; 017import java.util.Map; 018 019import org.granite.util.ClassUtil; 020import org.w3c.dom.Document; 021 022public class LCDSAs3TypeFactory implements As3TypeFactory { 023 024 /////////////////////////////////////////////////////////////////////////// 025 // Fields. 026 027 private final Map<Class<?>, As3Type> java2As3Type = new HashMap<Class<?>, As3Type>(); 028 029 /////////////////////////////////////////////////////////////////////////// 030 // Constructors. 031 032 public LCDSAs3TypeFactory() { 033 java2As3Type.put(Double.class, As3Type.NUMBER); 034 java2As3Type.put(Double.TYPE, As3Type.NUMBER); 035 java2As3Type.put(Float.class, As3Type.NUMBER); 036 java2As3Type.put(Float.TYPE, As3Type.NUMBER); 037 java2As3Type.put(Long.class, As3Type.NUMBER); 038 java2As3Type.put(Long.TYPE, As3Type.NUMBER); 039 java2As3Type.put(Integer.class, As3Type.NUMBER); 040 java2As3Type.put(Integer.TYPE, As3Type.INT); 041 java2As3Type.put(Short.class, As3Type.NUMBER); 042 java2As3Type.put(Short.TYPE, As3Type.INT); 043 java2As3Type.put(Byte.class, As3Type.NUMBER); 044 java2As3Type.put(Byte.TYPE, As3Type.INT); 045 046 java2As3Type.put(Long.class, As3Type.NUMBER); 047 java2As3Type.put(Long.TYPE, As3Type.NUMBER); 048 java2As3Type.put(BigInteger.class, As3Type.NUMBER); 049 java2As3Type.put(BigDecimal.class, As3Type.NUMBER); 050 java2As3Type.put(MathContext.class, As3Type.NUMBER); 051 java2As3Type.put(RoundingMode.class, As3Type.NUMBER); 052 053 java2As3Type.put(Boolean.class, As3Type.BOOLEAN); 054 java2As3Type.put(Boolean.TYPE, As3Type.BOOLEAN); 055 056 java2As3Type.put(String.class, As3Type.STRING); 057 java2As3Type.put(Character.class, As3Type.STRING); 058 java2As3Type.put(Character.TYPE, As3Type.STRING); 059 java2As3Type.put(Locale.class, As3Type.STRING); 060 java2As3Type.put(URL.class, As3Type.STRING); 061 java2As3Type.put(URI.class, As3Type.STRING); 062 063 java2As3Type.put(Object.class, As3Type.OBJECT); 064 java2As3Type.put(Serializable.class, As3Type.OBJECT); 065 066 java2As3Type.put(Enum.class, As3Type.STRING); 067 } 068 069 @Override 070 public void configure(boolean externalizeLong, boolean externalizeBigInteger, boolean externalizeBigDecimal) { 071 } 072 073 @Override 074 public ClientType getClientType(Type jType, Class<?> declaringClass, ParameterizedType[] declaringTypes, PropertyType propertyType) { 075 return null; 076 } 077 078 @Override 079 public ClientType getAs3Type(Class<?> jType) { 080 As3Type as3Type = getFromCache(jType); 081 082 if (as3Type == null) { 083 if (Date.class.isAssignableFrom(jType) || Calendar.class.isAssignableFrom(jType)) { 084 as3Type = As3Type.DATE; 085 } 086 else if (Number.class.isAssignableFrom(jType)) { 087 as3Type = As3Type.NUMBER; 088 } 089 else if (Document.class.isAssignableFrom(jType)) { 090 as3Type = As3Type.XML; 091 } 092 else if (jType.isEnum()) { 093 as3Type = As3Type.STRING; 094 } 095 else if ("javassist.bytecode.ByteArray".equals(jType.getName())) { 096 as3Type = As3Type.BYTE_ARRAY; 097 } 098 else if (jType.isArray()) { 099 Class<?> componentType = jType.getComponentType(); 100 if (Byte.class.equals(componentType) || Byte.TYPE.equals(componentType)) 101 as3Type = As3Type.BYTE_ARRAY; 102 else if (Character.class.equals(componentType) || Character.TYPE.equals(componentType)) 103 as3Type = As3Type.STRING; 104 else 105 as3Type = As3Type.ARRAY; 106 } 107 else if (Collection.class.isAssignableFrom(jType)) { 108 as3Type = As3Type.ARRAY_COLLECTION; 109 } 110 else if (Map.class.isAssignableFrom(jType)) { 111 as3Type = As3Type.OBJECT; 112 } 113 else { 114 as3Type = createAs3Type(jType); 115 } 116 117 putInCache(jType, as3Type); 118 } 119 120 return as3Type; 121 } 122 123 protected As3Type createAs3Type(Class<?> jType) { 124 String name = jType.getSimpleName(); 125 if (jType.isMemberClass()) 126 name = jType.getEnclosingClass().getSimpleName() + '$' + jType.getSimpleName(); 127 return new As3Type(ClassUtil.getPackageName(jType), name); 128 } 129 130 protected As3Type getFromCache(Class<?> jType) { 131 if (jType == null) 132 throw new NullPointerException("jType must be non null"); 133 return java2As3Type.get(jType); 134 } 135 136 protected void putInCache(Class<?> jType, As3Type as3Type) { 137 if (jType == null || as3Type == null) 138 throw new NullPointerException("jType and as3Type must be non null"); 139 java2As3Type.put(jType, as3Type); 140 } 141}