001 package org.granite.generator.as3;
002
003 import java.io.Serializable;
004 import java.lang.reflect.ParameterizedType;
005 import java.lang.reflect.Type;
006 import java.math.BigDecimal;
007 import java.math.BigInteger;
008 import java.math.MathContext;
009 import java.math.RoundingMode;
010 import java.net.URI;
011 import java.net.URL;
012 import java.util.Calendar;
013 import java.util.Collection;
014 import java.util.Date;
015 import java.util.HashMap;
016 import java.util.Locale;
017 import java.util.Map;
018
019 import org.granite.util.ClassUtil;
020 import org.w3c.dom.Document;
021
022 public 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, boolean property) {
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 }