Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/apache/axis/encoding/DefaultTypeMappingImpl.java


1   /*
2    * Copyright 2001-2004 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.apache.axis.encoding;
18  
19  import org.apache.axis.Constants;
20  import org.apache.axis.attachments.OctetStream;
21  import org.apache.axis.encoding.ser.ArrayDeserializerFactory;
22  import org.apache.axis.encoding.ser.ArraySerializerFactory;
23  import org.apache.axis.encoding.ser.Base64DeserializerFactory;
24  import org.apache.axis.encoding.ser.Base64SerializerFactory;
25  import org.apache.axis.encoding.ser.BeanDeserializerFactory;
26  import org.apache.axis.encoding.ser.BeanSerializerFactory;
27  import org.apache.axis.encoding.ser.DateDeserializerFactory;
28  import org.apache.axis.encoding.ser.DateSerializerFactory;
29  import org.apache.axis.encoding.ser.DocumentDeserializerFactory;
30  import org.apache.axis.encoding.ser.DocumentSerializerFactory;
31  import org.apache.axis.encoding.ser.ElementDeserializerFactory;
32  import org.apache.axis.encoding.ser.ElementSerializerFactory;
33  import org.apache.axis.encoding.ser.HexDeserializerFactory;
34  import org.apache.axis.encoding.ser.HexSerializerFactory;
35  import org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory;
36  import org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory;
37  import org.apache.axis.encoding.ser.MapDeserializerFactory;
38  import org.apache.axis.encoding.ser.MapSerializerFactory;
39  import org.apache.axis.encoding.ser.QNameDeserializerFactory;
40  import org.apache.axis.encoding.ser.QNameSerializerFactory;
41  import org.apache.axis.encoding.ser.SimpleDeserializerFactory;
42  import org.apache.axis.encoding.ser.SimpleSerializerFactory;
43  import org.apache.axis.encoding.ser.VectorDeserializerFactory;
44  import org.apache.axis.encoding.ser.VectorSerializerFactory;
45  import org.apache.axis.schema.SchemaVersion;
46  import org.apache.axis.types.HexBinary;
47  import org.apache.axis.utils.JavaUtils;
48  import org.apache.axis.utils.Messages;
49  
50  import javax.xml.namespace.QName;
51  import javax.xml.rpc.JAXRPCException;
52  import javax.xml.rpc.encoding.DeserializerFactory;
53  
54  /**
55   * This is the implementation of the axis Default TypeMapping (which extends
56   * the JAX-RPC TypeMapping interface) for SOAP 1.1.
57   *
58   * A TypeMapping contains tuples as follows:
59   * {Java type, SerializerFactory, DeserializerFactory, Type QName)
60   *
61   * In other words, it serves to map Java types to and from XML types using
62   * particular Serializers/Deserializers.  Each TypeMapping is associated with
63   * one or more encodingStyle URIs.
64   *
65   * The wsdl in your web service will use a number of types.  The tuple
66   * information for each of these will be accessed via the TypeMapping.
67   *
68   * This TypeMapping is the "default" one, which includes all the standard
69   * SOAP and schema XSD types.  Individual TypeMappings (associated with
70   * AxisEngines and SOAPServices) will delegate to this one, so if you haven't
71   * overriden a default mapping we'll end up getting it from here.
72   *
73   * @author Rich Scheuerle (scheu@us.ibm.com)
74   */
75  public class DefaultTypeMappingImpl extends TypeMappingImpl {
76  
77      private static DefaultTypeMappingImpl tm = null;
78      private boolean inInitMappings = false;
79  
80      /**
81       * Obtain the singleton default typemapping.
82       */
83      public static synchronized TypeMappingDelegate getSingletonDelegate() {
84          if (tm == null) {
85              tm = new DefaultTypeMappingImpl();
86          }
87          return new TypeMappingDelegate(tm);
88      }
89  
90      protected DefaultTypeMappingImpl() {
91          initMappings();
92      }
93  
94      protected DefaultTypeMappingImpl(boolean noMappings) {
95          if (!noMappings) {
96              initMappings();
97          }
98      }
99  
100     protected void initMappings() {
101         inInitMappings = true;
102 
103         // Notes:
104         // 1) The registration statements are order dependent.  The last one
105         //    wins.  So if two javaTypes of String are registered, the
106         //    ser factory for the last one registered will be chosen.  Likewise
107         //    if two javaTypes for XSD_DATE are registered, the deserializer
108         //    factory for the last one registered will be chosen.
109         //    Corollary:  Please be very careful with the order.  The
110         //                runtime, Java2WSDL and WSDL2Java emitters all
111         //                use this code to get type mapping information.
112         // 2) Even if the SOAP 1.1 format is used over the wire, an
113         //    attempt is made to receive SOAP 1.2 format from the wire.
114         //    This is the reason why the soap encoded primitives are
115         //    registered without serializers.
116 
117         // Since the last-registered type wins, I want to add the mime
118         // String FIRST.
119         if (JavaUtils.isAttachmentSupported()) {
120             myRegister(Constants.MIME_PLAINTEXT, java.lang.String.class,
121                     new JAFDataHandlerSerializerFactory(
122                             java.lang.String.class,
123                             Constants.MIME_PLAINTEXT),
124                     new JAFDataHandlerDeserializerFactory(
125                             java.lang.String.class,
126                             Constants.MIME_PLAINTEXT));
127         }
128 
129         // HexBinary binary data needs to use the hex binary serializer/deserializer
130         myRegister(Constants.XSD_HEXBIN,     HexBinary.class,
131                    new HexSerializerFactory(
132                         HexBinary.class, Constants.XSD_HEXBIN),
133                    new HexDeserializerFactory(
134                         HexBinary.class, Constants.XSD_HEXBIN));
135         myRegister(Constants.XSD_HEXBIN,     byte[].class,
136                    new HexSerializerFactory(
137                         byte[].class, Constants.XSD_HEXBIN),
138                    new HexDeserializerFactory(
139                         byte[].class, Constants.XSD_HEXBIN));
140 
141         // SOAP 1.1
142         // byte[] -ser-> XSD_BASE64
143         // XSD_BASE64 -deser-> byte[]
144         // SOAP_BASE64 -deser->byte[]
145         //
146         // Special case:
147         // If serialization is requested for xsd:byte with byte[],
148         // the array serializer is used.  If deserialization
149         // is specifically requested for xsd:byte with byte[], the
150         // simple deserializer is used.  This is necessary
151         // to support the serialization/deserialization
152         // of <element name="a" type="xsd:byte" maxOccurs="unbounded" />
153         // as discrete bytes without interference with XSD_BASE64.
154         myRegister(Constants.XSD_BYTE,       byte[].class,
155                    new ArraySerializerFactory(),
156                    null
157         );
158 
159         myRegister(Constants.XSD_BASE64,     byte[].class,
160                    new Base64SerializerFactory(byte[].class,
161                                                Constants.XSD_BASE64 ),
162                    new Base64DeserializerFactory(byte[].class,
163                                            Constants.XSD_BASE64));
164 
165         // anySimpleType is mapped to java.lang.String according to JAX-RPC 1.1 spec.
166         myRegisterSimple(Constants.XSD_ANYSIMPLETYPE, java.lang.String.class);
167         
168         // If SOAP 1.1 over the wire, map wrapper classes to XSD primitives.
169         myRegisterSimple(Constants.XSD_STRING, java.lang.String.class);
170         myRegisterSimple(Constants.XSD_BOOLEAN, java.lang.Boolean.class);
171         myRegisterSimple(Constants.XSD_DOUBLE, java.lang.Double.class);
172         myRegisterSimple(Constants.XSD_FLOAT, java.lang.Float.class);
173         myRegisterSimple(Constants.XSD_INT, java.lang.Integer.class);
174         myRegisterSimple(Constants.XSD_INTEGER, java.math.BigInteger.class
175         );
176         myRegisterSimple(Constants.XSD_DECIMAL, java.math.BigDecimal.class
177         );
178         myRegisterSimple(Constants.XSD_LONG, java.lang.Long.class);
179         myRegisterSimple(Constants.XSD_SHORT, java.lang.Short.class);
180         myRegisterSimple(Constants.XSD_BYTE, java.lang.Byte.class);
181 
182         // The XSD Primitives are mapped to java primitives.
183         myRegisterSimple(Constants.XSD_BOOLEAN, boolean.class);
184         myRegisterSimple(Constants.XSD_DOUBLE, double.class);
185         myRegisterSimple(Constants.XSD_FLOAT, float.class);
186         myRegisterSimple(Constants.XSD_INT, int.class);
187         myRegisterSimple(Constants.XSD_LONG, long.class);
188         myRegisterSimple(Constants.XSD_SHORT, short.class);
189         myRegisterSimple(Constants.XSD_BYTE, byte.class);
190 
191         // Map QNAME to the jax rpc QName class
192         myRegister(Constants.XSD_QNAME,
193               javax.xml.namespace.QName.class,
194               new QNameSerializerFactory(javax.xml.namespace.QName.class,
195                                         Constants.XSD_QNAME),
196               new QNameDeserializerFactory(javax.xml.namespace.QName.class,
197                                         Constants.XSD_QNAME)
198         );
199 
200         // The closest match for anytype is Object
201         myRegister(Constants.XSD_ANYTYPE,    java.lang.Object.class,
202                    null, null);
203 
204         // See the SchemaVersion classes for where the registration of
205         // dateTime (for 2001) and timeInstant (for 1999 & 2000) happen.
206         myRegister(Constants.XSD_DATE,       java.sql.Date.class,
207                    new DateSerializerFactory(java.sql.Date.class,
208                                              Constants.XSD_DATE),
209                    new DateDeserializerFactory(java.sql.Date.class,
210                                                Constants.XSD_DATE)
211         );
212 
213         // See the SchemaVersion classes for where the registration of
214         // dateTime (for 2001) and timeInstant (for 1999 & 2000) happen.
215         myRegister(Constants.XSD_DATE,       java.util.Date.class,
216                    new DateSerializerFactory(java.util.Date.class,
217                                              Constants.XSD_DATE),
218                    new DateDeserializerFactory(java.util.Date.class,
219                                                Constants.XSD_DATE)
220         );
221 
222         // Mapping for xsd:time.  Map to Axis type Time
223         myRegister(Constants.XSD_TIME,       org.apache.axis.types.Time.class,
224                    new SimpleSerializerFactory(org.apache.axis.types.Time.class,
225                                              Constants.XSD_TIME),
226                    new SimpleDeserializerFactory(org.apache.axis.types.Time.class,
227                                                Constants.XSD_TIME)
228         );
229         // These are the g* types (gYearMonth, etc) which map to Axis types
230         myRegister(Constants.XSD_YEARMONTH, org.apache.axis.types.YearMonth.class,
231                    new SimpleSerializerFactory(org.apache.axis.types.YearMonth.class,
232                                              Constants.XSD_YEARMONTH),
233                    new SimpleDeserializerFactory(org.apache.axis.types.YearMonth.class,
234                                              Constants.XSD_YEARMONTH)
235         );
236         myRegister(Constants.XSD_YEAR, org.apache.axis.types.Year.class,
237                    new SimpleSerializerFactory(org.apache.axis.types.Year.class,
238                                              Constants.XSD_YEAR),
239                    new SimpleDeserializerFactory(org.apache.axis.types.Year.class,
240                                              Constants.XSD_YEAR)
241         );
242         myRegister(Constants.XSD_MONTH, org.apache.axis.types.Month.class,
243                    new SimpleSerializerFactory(org.apache.axis.types.Month.class,
244                                              Constants.XSD_MONTH),
245                    new SimpleDeserializerFactory(org.apache.axis.types.Month.class,
246                                              Constants.XSD_MONTH)
247         );
248         myRegister(Constants.XSD_DAY, org.apache.axis.types.Day.class,
249                    new SimpleSerializerFactory(org.apache.axis.types.Day.class,
250                                              Constants.XSD_DAY),
251                    new SimpleDeserializerFactory(org.apache.axis.types.Day.class,
252                                              Constants.XSD_DAY)
253         );
254         myRegister(Constants.XSD_MONTHDAY, org.apache.axis.types.MonthDay.class,
255                    new SimpleSerializerFactory(org.apache.axis.types.MonthDay.class,
256                                              Constants.XSD_MONTHDAY),
257                    new SimpleDeserializerFactory(org.apache.axis.types.MonthDay.class,
258                                              Constants.XSD_MONTHDAY)
259         );
260 
261         // Serialize all extensions of Map to SOAP_MAP
262         // Order counts here, HashMap should be last.
263         myRegister(Constants.SOAP_MAP,       java.util.Hashtable.class,
264                    new MapSerializerFactory(java.util.Hashtable.class,
265                                             Constants.SOAP_MAP),
266                    null  // Make sure not to override the deser mapping
267         );
268         myRegister(Constants.SOAP_MAP,       java.util.Map.class,
269                    new MapSerializerFactory(java.util.Map.class,
270                                             Constants.SOAP_MAP),
271                    null  // Make sure not to override the deser mapping
272         );
273         // The SOAP_MAP will be deserialized into a HashMap by default.
274         myRegister(Constants.SOAP_MAP,       java.util.HashMap.class,
275                    new MapSerializerFactory(java.util.Map.class,
276                                             Constants.SOAP_MAP),
277                    new MapDeserializerFactory(java.util.HashMap.class,
278                                               Constants.SOAP_MAP)
279         );
280 
281         // Use the Element Serializeration for elements
282         myRegister(Constants.SOAP_ELEMENT,   org.w3c.dom.Element.class,
283                    new ElementSerializerFactory(),
284                    new ElementDeserializerFactory());
285 
286         // Use the Document Serializeration for Document's
287         myRegister(Constants.SOAP_DOCUMENT,   org.w3c.dom.Document.class,
288                    new DocumentSerializerFactory(),
289                    new DocumentDeserializerFactory());
290 
291         myRegister(Constants.SOAP_VECTOR,    java.util.Vector.class,
292                    new VectorSerializerFactory(java.util.Vector.class,
293                                                Constants.SOAP_VECTOR),
294                    new VectorDeserializerFactory(java.util.Vector.class,
295                                                  Constants.SOAP_VECTOR)
296         );
297 
298         // Register all the supported MIME types
299         // (note that MIME_PLAINTEXT was registered near the top)
300         if (JavaUtils.isAttachmentSupported()) {
301             myRegister(Constants.MIME_IMAGE, java.awt.Image.class,
302                     new JAFDataHandlerSerializerFactory(
303                             java.awt.Image.class,
304                             Constants.MIME_IMAGE),
305                     new JAFDataHandlerDeserializerFactory(
306                             java.awt.Image.class,
307                             Constants.MIME_IMAGE));
308             myRegister(Constants.MIME_MULTIPART, javax.mail.internet.MimeMultipart.class,
309                     new JAFDataHandlerSerializerFactory(
310                             javax.mail.internet.MimeMultipart.class,
311                             Constants.MIME_MULTIPART),
312                     new JAFDataHandlerDeserializerFactory(
313                             javax.mail.internet.MimeMultipart.class,
314                             Constants.MIME_MULTIPART));
315             myRegister(Constants.MIME_SOURCE, javax.xml.transform.Source.class,
316                     new JAFDataHandlerSerializerFactory(
317                             javax.xml.transform.Source.class,
318                             Constants.MIME_SOURCE),
319                     new JAFDataHandlerDeserializerFactory(
320                             javax.xml.transform.Source.class,
321                             Constants.MIME_SOURCE));
322             myRegister(Constants.MIME_OCTETSTREAM, OctetStream.class,
323                     new JAFDataHandlerSerializerFactory(
324                             OctetStream.class,
325                             Constants.MIME_OCTETSTREAM),
326                     new JAFDataHandlerDeserializerFactory(
327                             OctetStream.class,
328                             Constants.MIME_OCTETSTREAM));
329             myRegister(Constants.MIME_DATA_HANDLER, javax.activation.DataHandler.class,
330                     new JAFDataHandlerSerializerFactory(),
331                     new JAFDataHandlerDeserializerFactory());
332         }
333 
334         // xsd:token
335         myRegister(Constants.XSD_TOKEN, org.apache.axis.types.Token.class,
336                    new SimpleSerializerFactory(org.apache.axis.types.Token.class,
337                                              Constants.XSD_TOKEN),
338                    new SimpleDeserializerFactory(org.apache.axis.types.Token.class,
339                                              Constants.XSD_TOKEN)
340         );
341 
342         // a xsd:normalizedString
343         myRegister(Constants.XSD_NORMALIZEDSTRING, org.apache.axis.types.NormalizedString.class,
344                    new SimpleSerializerFactory(org.apache.axis.types.NormalizedString.class,
345                                              Constants.XSD_NORMALIZEDSTRING),
346                    new SimpleDeserializerFactory(org.apache.axis.types.NormalizedString.class,
347                                              Constants.XSD_NORMALIZEDSTRING)
348         );
349 
350         // a xsd:unsignedLong
351         myRegister(Constants.XSD_UNSIGNEDLONG, org.apache.axis.types.UnsignedLong.class,
352              new SimpleSerializerFactory(org.apache.axis.types.UnsignedLong.class,
353                                                   Constants.XSD_UNSIGNEDLONG),
354              new SimpleDeserializerFactory(org.apache.axis.types.UnsignedLong.class,
355                                            Constants.XSD_UNSIGNEDLONG)
356         );
357 
358         // a xsd:unsignedInt
359         myRegister(Constants.XSD_UNSIGNEDINT, org.apache.axis.types.UnsignedInt.class,
360              new SimpleSerializerFactory(org.apache.axis.types.UnsignedInt.class,
361                                                   Constants.XSD_UNSIGNEDINT),
362              new SimpleDeserializerFactory(org.apache.axis.types.UnsignedInt.class,
363                                            Constants.XSD_UNSIGNEDINT)
364         );
365 
366         // a xsd:unsignedShort
367         myRegister(Constants.XSD_UNSIGNEDSHORT, org.apache.axis.types.UnsignedShort.class,
368              new SimpleSerializerFactory(org.apache.axis.types.UnsignedShort.class,
369                                                   Constants.XSD_UNSIGNEDSHORT),
370              new SimpleDeserializerFactory(org.apache.axis.types.UnsignedShort.class,
371                                            Constants.XSD_UNSIGNEDSHORT)
372         );
373 
374         // a xsd:unsignedByte
375         myRegister(Constants.XSD_UNSIGNEDBYTE, org.apache.axis.types.UnsignedByte.class,
376                    new SimpleSerializerFactory(org.apache.axis.types.UnsignedByte.class,
377                                              Constants.XSD_UNSIGNEDBYTE),
378                    new SimpleDeserializerFactory(org.apache.axis.types.UnsignedByte.class,
379                                              Constants.XSD_UNSIGNEDBYTE)
380         );
381 
382         // a xsd:nonNegativeInteger
383         myRegister(Constants.XSD_NONNEGATIVEINTEGER, org.apache.axis.types.NonNegativeInteger.class,
384              new SimpleSerializerFactory(org.apache.axis.types.NonNegativeInteger.class,
385                                                   Constants.XSD_NONNEGATIVEINTEGER),
386              new SimpleDeserializerFactory(org.apache.axis.types.NonNegativeInteger.class,
387                                            Constants.XSD_NONNEGATIVEINTEGER)
388         );
389 
390         // a xsd:negativeInteger
391         myRegister(Constants.XSD_NEGATIVEINTEGER, org.apache.axis.types.NegativeInteger.class,
392              new SimpleSerializerFactory(org.apache.axis.types.NegativeInteger.class,
393                                                   Constants.XSD_NEGATIVEINTEGER),
394              new SimpleDeserializerFactory(org.apache.axis.types.NegativeInteger.class,
395                                            Constants.XSD_NEGATIVEINTEGER)
396         );
397 
398         // a xsd:positiveInteger
399         myRegister(Constants.XSD_POSITIVEINTEGER, org.apache.axis.types.PositiveInteger.class,
400              new SimpleSerializerFactory(org.apache.axis.types.PositiveInteger.class,
401                                                   Constants.XSD_POSITIVEINTEGER),
402              new SimpleDeserializerFactory(org.apache.axis.types.PositiveInteger.class,
403                                            Constants.XSD_POSITIVEINTEGER)
404         );
405 
406         // a xsd:nonPositiveInteger
407         myRegister(Constants.XSD_NONPOSITIVEINTEGER, org.apache.axis.types.NonPositiveInteger.class,
408              new SimpleSerializerFactory(org.apache.axis.types.NonPositiveInteger.class,
409                                                   Constants.XSD_NONPOSITIVEINTEGER),
410              new SimpleDeserializerFactory(org.apache.axis.types.NonPositiveInteger.class,
411                                            Constants.XSD_NONPOSITIVEINTEGER)
412         );
413 
414         // a xsd:Name
415         myRegister(Constants.XSD_NAME, org.apache.axis.types.Name.class,
416                    new SimpleSerializerFactory(org.apache.axis.types.Name.class,
417                                              Constants.XSD_NAME),
418                    new SimpleDeserializerFactory(org.apache.axis.types.Name.class,
419                                              Constants.XSD_NAME)
420         );
421 
422         // a xsd:NCName
423         myRegister(Constants.XSD_NCNAME, org.apache.axis.types.NCName.class,
424                    new SimpleSerializerFactory(org.apache.axis.types.NCName.class,
425                                              Constants.XSD_NCNAME),
426                    new SimpleDeserializerFactory(org.apache.axis.types.NCName.class,
427                                              Constants.XSD_NCNAME)
428         );
429 
430          // a xsd:ID
431         myRegister(Constants.XSD_ID, org.apache.axis.types.Id.class,
432                    new SimpleSerializerFactory(org.apache.axis.types.Id.class,
433                                              Constants.XSD_ID),
434                    new SimpleDeserializerFactory(org.apache.axis.types.Id.class,
435                                              Constants.XSD_ID)
436         );
437 
438         // a xml:lang
439         myRegister(Constants.XML_LANG, org.apache.axis.types.Language.class,
440                    new SimpleSerializerFactory(org.apache.axis.types.Language.class,
441                                              Constants.XML_LANG),
442                    new SimpleDeserializerFactory(org.apache.axis.types.Language.class,
443                                              Constants.XML_LANG)
444         );
445         
446         // a xsd:language
447         myRegister(Constants.XSD_LANGUAGE, org.apache.axis.types.Language.class,
448                    new SimpleSerializerFactory(org.apache.axis.types.Language.class,
449                                              Constants.XSD_LANGUAGE),
450                    new SimpleDeserializerFactory(org.apache.axis.types.Language.class,
451                                              Constants.XSD_LANGUAGE)
452         );
453 
454         // a xsd:NmToken
455         myRegister(Constants.XSD_NMTOKEN, org.apache.axis.types.NMToken.class,
456                    new SimpleSerializerFactory(org.apache.axis.types.NMToken.class,
457                                              Constants.XSD_NMTOKEN),
458                    new SimpleDeserializerFactory(org.apache.axis.types.NMToken.class,
459                                              Constants.XSD_NMTOKEN)
460         );
461 
462         // a xsd:NmTokens
463         myRegister(Constants.XSD_NMTOKENS, org.apache.axis.types.NMTokens.class,
464                    new SimpleSerializerFactory(org.apache.axis.types.NMTokens.class,
465                                              Constants.XSD_NMTOKENS),
466                    new SimpleDeserializerFactory(org.apache.axis.types.NMTokens.class,
467                                              Constants.XSD_NMTOKENS)
468         );
469 
470         // a xsd:NOTATION
471         myRegister(Constants.XSD_NOTATION, org.apache.axis.types.Notation.class,
472                    new BeanSerializerFactory(org.apache.axis.types.Notation.class,
473                                              Constants.XSD_NOTATION),
474                    new BeanDeserializerFactory(org.apache.axis.types.Notation.class,
475                                              Constants.XSD_NOTATION)
476         );
477 
478         // a xsd:XSD_ENTITY
479         myRegister(Constants.XSD_ENTITY, org.apache.axis.types.Entity.class,
480                    new SimpleSerializerFactory(org.apache.axis.types.Entity.class,
481                                              Constants.XSD_ENTITY),
482                    new SimpleDeserializerFactory(org.apache.axis.types.Entity.class,
483                                              Constants.XSD_ENTITY)
484         );
485 
486         // a xsd:XSD_ENTITIES
487         myRegister(Constants.XSD_ENTITIES, org.apache.axis.types.Entities.class,
488                    new SimpleSerializerFactory(org.apache.axis.types.Entities.class,
489                                              Constants.XSD_ENTITIES),
490                    new SimpleDeserializerFactory(org.apache.axis.types.Entities.class,
491                                              Constants.XSD_ENTITIES)
492         );
493 
494         // a xsd:XSD_IDREF
495         myRegister(Constants.XSD_IDREF, org.apache.axis.types.IDRef.class,
496                    new SimpleSerializerFactory(org.apache.axis.types.IDRef.class,
497                                              Constants.XSD_IDREF),
498                    new SimpleDeserializerFactory(org.apache.axis.types.IDRef.class,
499                                              Constants.XSD_IDREF)
500         );
501 
502         // a xsd:XSD_XSD_IDREFS
503         myRegister(Constants.XSD_IDREFS, org.apache.axis.types.IDRefs.class,
504                    new SimpleSerializerFactory(org.apache.axis.types.IDRefs.class,
505                                              Constants.XSD_IDREFS),
506                    new SimpleDeserializerFactory(org.apache.axis.types.IDRefs.class,
507                                              Constants.XSD_IDREFS)
508         );
509         
510         // a xsd:Duration
511         myRegister(Constants.XSD_DURATION, org.apache.axis.types.Duration.class,
512                    new SimpleSerializerFactory(org.apache.axis.types.Duration.class,
513                                              Constants.XSD_DURATION),
514                    new SimpleDeserializerFactory(org.apache.axis.types.Duration.class,
515                                              Constants.XSD_DURATION)
516         );
517         
518         // a xsd:anyURI
519         myRegister(Constants.XSD_ANYURI, org.apache.axis.types.URI.class,
520                    new SimpleSerializerFactory(org.apache.axis.types.URI.class,
521                                              Constants.XSD_ANYURI),
522                    new SimpleDeserializerFactory(org.apache.axis.types.URI.class,
523                                              Constants.XSD_ANYURI)
524         );
525 
526         // a xsd:schema
527         myRegister(Constants.XSD_SCHEMA, org.apache.axis.types.Schema.class,
528                    new BeanSerializerFactory(org.apache.axis.types.Schema.class,
529                                              Constants.XSD_SCHEMA),
530                    new BeanDeserializerFactory(org.apache.axis.types.Schema.class,
531                                              Constants.XSD_SCHEMA)
532         );
533         
534         // Need this at the default TypeMapping level so that we can correctly
535         // obtain the ArraySerializer when in doc/lit mode and only have a
536         // Java class available (no XML type metadata) - see TypeMappingImpl
537         // (getSerializer())
538         myRegister(Constants.SOAP_ARRAY,     java.util.ArrayList.class,
539                    new ArraySerializerFactory(),
540                    new ArrayDeserializerFactory()
541         );
542 
543         //
544         // Now register the schema specific types
545         //
546         SchemaVersion.SCHEMA_1999.registerSchemaSpecificTypes(this);
547         SchemaVersion.SCHEMA_2000.registerSchemaSpecificTypes(this);
548         SchemaVersion.SCHEMA_2001.registerSchemaSpecificTypes(this);
549 
550         inInitMappings = false;
551     }
552 
553     /**
554      * Register a "simple" type mapping - in other words, a
555      * @param xmlType
556      * @param javaType
557      */
558     protected void myRegisterSimple(QName xmlType, Class javaType) {
559         SerializerFactory sf = new SimpleSerializerFactory(javaType, xmlType);
560         DeserializerFactory df = null;
561         if (javaType != java.lang.Object.class) {
562             df = new SimpleDeserializerFactory(javaType, xmlType);
563         }
564         
565         myRegister(xmlType, javaType, sf, df);        
566     }
567 
568     /**
569      * Construct TypeMapping for all the [xmlType, javaType] for all of the
570      * known xmlType namespaces.  This is the shotgun approach, which works
571      * in 99% of the cases.  The other cases that are Schema version specific
572      * (i.e. timeInstant vs. dateTime) are handled by the SchemaVersion
573      * Interface registerSchemaSpecificTypes().
574      *
575      * @param xmlType is the QName type
576      * @param javaType is the java type
577      * @param sf is the ser factory (if null, the simple factory is used)
578      * @param df is the deser factory (if null, the simple factory is used)
579      */
580     protected void myRegister(QName xmlType, Class javaType,
581                               SerializerFactory sf, DeserializerFactory df) {
582         // Register all known flavors of the namespace.
583         try {
584             if (xmlType.getNamespaceURI().equals(
585                     Constants.URI_DEFAULT_SCHEMA_XSD)) {
586                 for (int i=0; i < Constants.URIS_SCHEMA_XSD.length; i++) {
587                     QName qName = new QName(Constants.URIS_SCHEMA_XSD[i],
588                                             xmlType.getLocalPart());
589                     super.internalRegister(javaType, qName, sf, df);
590                 }
591             }
592             else if (xmlType.getNamespaceURI().equals(
593                     Constants.URI_DEFAULT_SOAP_ENC)) {
594                 for (int i=0; i < Constants.URIS_SOAP_ENC.length; i++) {
595                     QName qName = new QName(Constants.URIS_SOAP_ENC[i],
596                                             xmlType.getLocalPart());
597                     super.internalRegister(javaType, qName, sf, df);
598                 }
599             } else {
600                 // Register with the specified xmlType.
601                 // This is the prefered mapping and the last registed one wins
602                 super.internalRegister(javaType, xmlType, sf, df);
603             }
604         } catch (JAXRPCException e) { }
605     }
606 
607     // Don't allow anyone to muck with the default type mapping because
608     // it is a singleton used for the whole system.
609     public void register(Class javaType, QName xmlType,
610                          javax.xml.rpc.encoding.SerializerFactory sf,
611                          javax.xml.rpc.encoding.DeserializerFactory dsf)
612         throws JAXRPCException {
613         super.register(javaType, xmlType, sf, dsf);
614     }
615     public void removeSerializer(Class javaType, QName xmlType)
616         throws JAXRPCException {
617         throw new JAXRPCException(Messages.getMessage("fixedTypeMapping"));
618     }
619     public void removeDeserializer(Class javaType, QName xmlType)
620         throws JAXRPCException {
621         throw new JAXRPCException(Messages.getMessage("fixedTypeMapping"));
622     }
623     public void setSupportedEncodings(String[] namespaceURIs) {
624     }
625 }