001: /**
002: * Copyright 2003 Sun Microsystems, Inc. All
003: * rights reserved. Use of this product is subject
004: * to license terms. Federal Acquisitions:
005: * Commercial Software -- Government Users
006: * Subject to Standard License Terms and
007: * Conditions.
008: *
009: * Sun, Sun Microsystems, the Sun logo, and Sun ONE
010: * are trademarks or registered trademarks of Sun Microsystems,
011: * Inc. in the United States and other countries.
012: */package com.sun.portal.providers.simplewebservice.rpc;
013:
014: import com.sun.portal.providers.simplewebservice.ParameterDescriptor;
015: import com.sun.xml.rpc.encoding.*;
016: import com.sun.xml.rpc.encoding.soap.CollectionSerializer;
017: import com.sun.xml.rpc.util.StructMap;
018: import com.sun.xml.rpc.wsdl.document.schema.SchemaConstants;
019:
020: import javax.xml.rpc.Service;
021: import javax.xml.rpc.encoding.SerializerFactory;
022: import javax.xml.rpc.encoding.DeserializerFactory;
023: import javax.xml.namespace.QName;
024: import java.util.ArrayList;
025:
026: public class RPCComplexTypeHandler extends ComplexTypeHandler {
027: RPCComplexTypeHandler(Service service, String encoding) {
028: super (service, encoding);
029: }
030:
031: public void registerComplexTypeHandler(
032: ParameterDescriptor descriptor, int type) {
033: context = SerializationContext
034: .createComplexSerializationContext(descriptor);
035:
036: // Check if f:complex type->java holder class
037: if (isAlreadyRegistered(context.typeHolderClass,
038: context.typeQName)) {
039: return;
040: }
041:
042: CombinedSerializer complexSerializer = null;
043: complexSerializer = createComplexSerializer(descriptor, type);
044:
045: SerializerFactory complexSerializerFactory = new SingletonSerializerFactory(
046: complexSerializer);
047: DeserializerFactory complexDeserializerFactory = new SingletonDeserializerFactory(
048: complexSerializer);
049:
050: if (type == COMPLEX_TYPE_SERIALIZER) {
051: typeMapping.register(StructMap.class, context.typeQName,
052: complexSerializerFactory,
053: complexDeserializerFactory);
054: } else if (type == COMPLEX_ARRAY_TYPE_SERIALIZER) {
055: typeMapping.register(ArrayList.class, context.typeQName,
056: complexSerializerFactory,
057: complexDeserializerFactory);
058: }
059: }
060:
061: protected CombinedSerializer createComplexSerializer(
062: ParameterDescriptor descriptor, int type) {
063:
064: CombinedSerializer complexSerializer = null;
065:
066: if (type == COMPLEX_TYPE_SERIALIZER) {
067: complexSerializer = createComplexTypeSerializer(context,
068: descriptor);
069: complexSerializer = new ReferenceableSerializerImpl(
070: CollectionSerializer.SERIALIZE_AS_REF,
071: complexSerializer);
072:
073: } else if (type == COMPLEX_ARRAY_TYPE_SERIALIZER) {
074: complexSerializer = createComplexTypeArraySerializer(
075: context, descriptor);
076: complexSerializer = new ReferenceableSerializerImpl(
077: ObjectSerializerBase.SERIALIZE_AS_REF,
078: complexSerializer);
079: }
080:
081: return complexSerializer;
082: }
083:
084: protected CombinedSerializer createComplexTypeArraySerializer(
085: SerializationContext context, ParameterDescriptor descriptor) {
086: CombinedSerializer complexArraySerializer = null;
087:
088: complexArraySerializer = new CollectionSerializer(
089: context.typeQName, ArrayList.class,
090: CollectionSerializer.ENCODE_TYPE,
091: CollectionSerializer.NULLABLE, encoding, null,
092: context.typeArrayQName, StructMap.class);
093:
094: return complexArraySerializer;
095: }
096:
097: protected CombinedSerializer createComplexTypeSerializer(
098: SerializationContext context, ParameterDescriptor descriptor) {
099: CombinedSerializer complexSerializer = null;
100:
101: complexSerializer = new XMapSerializer(context.typeQName,
102: ObjectSerializerBase.ENCODE_TYPE,
103: ObjectSerializerBase.NULLABLE, encoding, descriptor);
104:
105: return complexSerializer;
106: }
107:
108: /* protected boolean isAlreadyRegistered(Class javaClass, QName complexTypeQName) {
109: if(service == null)
110: if (registry == null && typeMapping == null) {
111: registry = service.getTypeMappingRegistry();
112: typeMapping = registry.getTypeMapping(encoding);
113: }
114:
115: // Verify, if type holder is not already registered
116: if (typeMapping.isRegistered(javaClass, complexTypeQName)) {
117: return true;
118: }
119:
120: return false;
121: } */
122: }
|