KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > caucho > quercus > function > MarshalFactory


1 /*
2  * Copyright (c) 1998-2006 Caucho Technology -- all rights reserved
3  *
4  * This file is part of Resin(R) Open Source
5  *
6  * Each copy or derived work must preserve the copyright notice and this
7  * notice unmodified.
8  *
9  * Resin Open Source is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * Resin Open Source is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
17  * of NON-INFRINGEMENT. See the GNU General Public License for more
18  * details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with Resin Open Source; if not, write to the
22  *
23  * Free Software Foundation, Inc.
24  * 59 Temple Place, Suite 330
25  * Boston, MA 02111-1307 USA
26  *
27  * @author Scott Ferguson
28  */

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 JavaDoc;
44 import java.net.URL JavaDoc;
45 import java.util.Calendar JavaDoc;
46 import java.util.Collection JavaDoc;
47 import java.util.Date JavaDoc;
48 import java.util.List JavaDoc;
49 import java.util.Map JavaDoc;
50
51 /**
52  * Code for marshaling (PHP to Java) and unmarshaling (Java to PHP) arguments.
53  */

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 JavaDoc argType)
65   {
66     return create(argType, false);
67   }
68
69   public Marshal create(Class JavaDoc argType,
70             boolean isNotNull)
71   {
72     return create(argType, isNotNull, false);
73   }
74
75   public Marshal create(Class JavaDoc argType,
76             boolean isNotNull,
77             boolean isNullAsFalse)
78   {
79     final Marshal marshal;
80
81     // optimized cases, new types should be added to JavaMarshall
82

83     if (String JavaDoc.class.equals(argType)) {
84       marshal = StringMarshal.MARSHAL;
85     }
86     else if (boolean.class.equals(argType)) {
87       marshal = BooleanMarshal.MARSHAL;
88     }
89     else if (Boolean JavaDoc.class.equals(argType)) {
90       marshal = BooleanObjectMarshal.MARSHAL;
91     }
92     else if (byte.class.equals(argType)) {
93       marshal = ByteMarshal.MARSHAL;
94     }
95     else if (Byte JavaDoc.class.equals(argType)) {
96       marshal = ByteObjectMarshal.MARSHAL;
97     }
98     else if (short.class.equals(argType)) {
99       marshal = ShortMarshal.MARSHAL;
100     }
101     else if (Short JavaDoc.class.equals(argType)) {
102       marshal = ShortObjectMarshal.MARSHAL;
103     }
104     else if (int.class.equals(argType)) {
105       marshal = IntegerMarshal.MARSHAL;
106     }
107     else if (Integer JavaDoc.class.equals(argType)) {
108       marshal = IntegerObjectMarshal.MARSHAL;
109     }
110     else if (long.class.equals(argType)) {
111       marshal = LongMarshal.MARSHAL;
112     }
113     else if (Long JavaDoc.class.equals(argType)) {
114       marshal = LongObjectMarshal.MARSHAL;
115     }
116     else if (float.class.equals(argType)) {
117       marshal = FloatMarshal.MARSHAL;
118     }
119     else if (Float JavaDoc.class.equals(argType)) {
120       marshal = FloatObjectMarshal.MARSHAL;
121     }
122     else if (double.class.equals(argType)) {
123       marshal = DoubleMarshal.MARSHAL;
124     }
125     else if (Double JavaDoc.class.equals(argType)) {
126       marshal = DoubleObjectMarshal.MARSHAL;
127     }
128     else if (char.class.equals(argType)) {
129       marshal = CharacterMarshal.MARSHAL;
130     }
131     else if (Character JavaDoc.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 JavaDoc.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 JavaDoc.class.equals(argType)){
165       marshal = CalendarMarshal.MARSHAL;
166     }
167     else if (Date JavaDoc.class.equals(argType)) {
168       marshal = DateMarshal.MARSHAL;
169     }
170     else if (URL JavaDoc.class.equals(argType)) {
171       marshal = URLMarshal.MARSHAL;
172     }
173     else if (byte[].class.equals(argType)) {
174       marshal = JavaByteArrayMarshal.MARSHAL;
175     }
176     else if (Byte JavaDoc[].class.equals(argType)) {
177       marshal = JavaByteObjectArrayMarshal.MARSHAL;
178     }
179     else if (char[].class.equals(argType)) {
180       marshal = JavaCharacterArrayMarshal.MARSHAL;
181     }
182     else if (Character JavaDoc[].class.equals(argType)) {
183       marshal = JavaCharacterObjectArrayMarshal.MARSHAL;
184     }
185     else if (argType.isArray()) {
186       marshal = JavaArrayMarshal.MARSHAL;
187     }
188     else if (Map JavaDoc.class.isAssignableFrom(argType)) {
189       String JavaDoc typeName = argType.getName();
190
191       JavaClassDef javaDef = _moduleContext.getJavaClassDefinition(typeName);
192
193       marshal = new JavaMapMarshal(javaDef, isNotNull, isNullAsFalse);
194     }
195     else if (List JavaDoc.class.isAssignableFrom(argType)) {
196       String JavaDoc typeName = argType.getName();
197
198       JavaClassDef javaDef = _moduleContext.getJavaClassDefinition(typeName);
199
200       marshal = new JavaListMarshal(javaDef, isNotNull, isNullAsFalse);
201     }
202     else if (Collection JavaDoc.class.isAssignableFrom(argType)) {
203       String JavaDoc typeName = argType.getName();
204
205       JavaClassDef javaDef = _moduleContext.getJavaClassDefinition(typeName);
206
207       marshal = new JavaCollectionMarshal(javaDef, isNotNull, isNullAsFalse);
208     }
209     else {
210       String JavaDoc 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 JavaDoc.class.equals(argType) ||
222           Byte JavaDoc.class.equals(argType) ||
223           Short JavaDoc.class.equals(argType) ||
224           Integer JavaDoc.class.equals(argType) ||
225           Long JavaDoc.class.equals(argType) ||
226           Float JavaDoc.class.equals(argType) ||
227           Double JavaDoc.class.equals(argType) ||
228           Character JavaDoc.class.equals(argType)) {
229
230         String JavaDoc shortName = argType.getSimpleName();
231         throw new UnsupportedOperationException JavaDoc("@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