1 29 30 package com.caucho.quercus.function; 31 32 import com.caucho.quercus.env.ArrayValue; 33 import com.caucho.quercus.env.BinaryValue; 34 import com.caucho.quercus.env.Callback; 35 import com.caucho.quercus.env.StringValue; 36 import com.caucho.quercus.env.UnicodeValue; 37 import com.caucho.quercus.env.Value; 38 import com.caucho.quercus.module.ModuleContext; 39 import com.caucho.quercus.program.JavaClassDef; 40 import com.caucho.util.L10N; 41 import com.caucho.vfs.Path; 42 43 import java.io.InputStream ; 44 import java.net.URL ; 45 import java.util.Calendar ; 46 import java.util.Collection ; 47 import java.util.Date ; 48 import java.util.List ; 49 import java.util.Map ; 50 51 54 public class MarshalFactory { 55 private static final L10N L = new L10N(MarshalFactory.class); 56 57 protected ModuleContext _moduleContext; 58 59 public MarshalFactory(ModuleContext moduleContext) 60 { 61 _moduleContext = moduleContext; 62 } 63 64 public Marshal create(Class argType) 65 { 66 return create(argType, false); 67 } 68 69 public Marshal create(Class argType, 70 boolean isNotNull) 71 { 72 return create(argType, isNotNull, false); 73 } 74 75 public Marshal create(Class argType, 76 boolean isNotNull, 77 boolean isNullAsFalse) 78 { 79 final Marshal marshal; 80 81 83 if (String .class.equals(argType)) { 84 marshal = StringMarshal.MARSHAL; 85 } 86 else if (boolean.class.equals(argType)) { 87 marshal = BooleanMarshal.MARSHAL; 88 } 89 else if (Boolean .class.equals(argType)) { 90 marshal = BooleanObjectMarshal.MARSHAL; 91 } 92 else if (byte.class.equals(argType)) { 93 marshal = ByteMarshal.MARSHAL; 94 } 95 else if (Byte .class.equals(argType)) { 96 marshal = ByteObjectMarshal.MARSHAL; 97 } 98 else if (short.class.equals(argType)) { 99 marshal = ShortMarshal.MARSHAL; 100 } 101 else if (Short .class.equals(argType)) { 102 marshal = ShortObjectMarshal.MARSHAL; 103 } 104 else if (int.class.equals(argType)) { 105 marshal = IntegerMarshal.MARSHAL; 106 } 107 else if (Integer .class.equals(argType)) { 108 marshal = IntegerObjectMarshal.MARSHAL; 109 } 110 else if (long.class.equals(argType)) { 111 marshal = LongMarshal.MARSHAL; 112 } 113 else if (Long .class.equals(argType)) { 114 marshal = LongObjectMarshal.MARSHAL; 115 } 116 else if (float.class.equals(argType)) { 117 marshal = FloatMarshal.MARSHAL; 118 } 119 else if (Float .class.equals(argType)) { 120 marshal = FloatObjectMarshal.MARSHAL; 121 } 122 else if (double.class.equals(argType)) { 123 marshal = DoubleMarshal.MARSHAL; 124 } 125 else if (Double .class.equals(argType)) { 126 marshal = DoubleObjectMarshal.MARSHAL; 127 } 128 else if (char.class.equals(argType)) { 129 marshal = CharacterMarshal.MARSHAL; 130 } 131 else if (Character .class.equals(argType)) { 132 marshal = CharacterObjectMarshal.MARSHAL; 133 } 134 else if (Path.class.equals(argType)) { 135 marshal = PathMarshal.MARSHAL; 136 } 137 else if (Callback.class.equals(argType)) { 138 marshal = CallbackMarshal.MARSHAL; 139 } 140 else if (StringValue.class.equals(argType)) { 141 marshal = StringValueMarshal.MARSHAL; 142 } 143 else if (UnicodeValue.class.equals(argType)) { 144 marshal = UnicodeValueMarshal.MARSHAL; 145 } 146 else if (BinaryValue.class.equals(argType)) { 147 marshal = BinaryValueMarshal.MARSHAL; 148 } 149 else if (InputStream .class.equals(argType)) { 150 marshal = InputStreamMarshal.MARSHAL; 151 } 152 else if (ArrayValue.class.equals(argType)) { 153 marshal = ArrayValueMarshal.MARSHAL; 154 } 155 else if (Value.class.equals(argType)) { 156 marshal = ValueMarshal.MARSHAL; 157 } 158 else if (Value.class.isAssignableFrom(argType)) { 159 marshal = ExtValueMarshal.MARSHAL; 160 } 161 else if (void.class.equals(argType)) { 162 marshal = VoidMarshal.MARSHAL; 163 } 164 else if (Calendar .class.equals(argType)){ 165 marshal = CalendarMarshal.MARSHAL; 166 } 167 else if (Date .class.equals(argType)) { 168 marshal = DateMarshal.MARSHAL; 169 } 170 else if (URL .class.equals(argType)) { 171 marshal = URLMarshal.MARSHAL; 172 } 173 else if (byte[].class.equals(argType)) { 174 marshal = JavaByteArrayMarshal.MARSHAL; 175 } 176 else if (Byte [].class.equals(argType)) { 177 marshal = JavaByteObjectArrayMarshal.MARSHAL; 178 } 179 else if (char[].class.equals(argType)) { 180 marshal = JavaCharacterArrayMarshal.MARSHAL; 181 } 182 else if (Character [].class.equals(argType)) { 183 marshal = JavaCharacterObjectArrayMarshal.MARSHAL; 184 } 185 else if (argType.isArray()) { 186 marshal = JavaArrayMarshal.MARSHAL; 187 } 188 else if (Map .class.isAssignableFrom(argType)) { 189 String typeName = argType.getName(); 190 191 JavaClassDef javaDef = _moduleContext.getJavaClassDefinition(typeName); 192 193 marshal = new JavaMapMarshal(javaDef, isNotNull, isNullAsFalse); 194 } 195 else if (List .class.isAssignableFrom(argType)) { 196 String typeName = argType.getName(); 197 198 JavaClassDef javaDef = _moduleContext.getJavaClassDefinition(typeName); 199 200 marshal = new JavaListMarshal(javaDef, isNotNull, isNullAsFalse); 201 } 202 else if (Collection .class.isAssignableFrom(argType)) { 203 String typeName = argType.getName(); 204 205 JavaClassDef javaDef = _moduleContext.getJavaClassDefinition(typeName); 206 207 marshal = new JavaCollectionMarshal(javaDef, isNotNull, isNullAsFalse); 208 } 209 else { 210 String typeName = argType.getName(); 211 212 JavaClassDef javaDef = _moduleContext.getJavaClassDefinition(typeName); 213 214 marshal = new JavaMarshal(javaDef, isNotNull, isNullAsFalse); 215 } 216 217 if (!isNullAsFalse) 218 return marshal; 219 else { 220 if (Value.class.equals(argType) || 221 Boolean .class.equals(argType) || 222 Byte .class.equals(argType) || 223 Short .class.equals(argType) || 224 Integer .class.equals(argType) || 225 Long .class.equals(argType) || 226 Float .class.equals(argType) || 227 Double .class.equals(argType) || 228 Character .class.equals(argType)) { 229 230 String shortName = argType.getSimpleName(); 231 throw new UnsupportedOperationException ("@ReturnNullAsFalse cannot be used with return type `"+shortName+"'"); 232 } 233 234 return new NullAsFalseMarshal(marshal); 235 } 236 } 237 238 public Marshal createReference() 239 { 240 return ReferenceMarshal.MARSHAL; 241 } 242 } 243 244 | Popular Tags |