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.portal.providers.simplewebservice.util.XList;
016: import com.sun.xml.rpc.encoding.*;
017: import com.sun.xml.rpc.wsdl.document.schema.SchemaConstants;
018: import com.sun.xml.rpc.wsdl.document.soap.SOAPConstants;
019: import com.sun.xml.rpc.soap.streaming.SOAPNamespaceConstants;
020:
021: import javax.xml.rpc.Service;
022: import javax.xml.rpc.encoding.TypeMappingRegistry;
023: import javax.xml.rpc.encoding.TypeMapping;
024: import javax.xml.rpc.encoding.SerializerFactory;
025: import javax.xml.rpc.encoding.DeserializerFactory;
026: import javax.xml.namespace.QName;
027: import java.lang.reflect.Array;
028:
029: public class RPCSimpleTypeHandler extends SimpleTypeHandler {
030: RPCSimpleTypeHandler(Service service, String encoding) {
031: super (service, encoding);
032: }
033:
034: public void registerSimpleTypeHandlers(
035: ParameterDescriptor descriptor) {
036:
037: context = SerializationContext
038: .createSimpleSerializationContext(descriptor);
039:
040: TypeMappingRegistry registry = service.getTypeMappingRegistry();
041: TypeMapping typeMapping = registry
042: .getTypeMapping(this .encoding);
043:
044: if (typeMapping.isRegistered(context.typeHolderClass,
045: context.typeArrayQName)) {
046: return;
047: }
048:
049: CombinedSerializer primitiveSerializer = getPrimitiveTypeSerializer(context);
050: context.serializer = primitiveSerializer;
051:
052: SerializerFactory stringArraySerializerFactory = new SingletonSerializerFactory(
053: primitiveSerializer);
054: DeserializerFactory stringArrayDeserializerFactory = new SingletonDeserializerFactory(
055: primitiveSerializer);
056:
057: typeMapping.register(context.typeHolderClass,
058: context.typeArrayQName, stringArraySerializerFactory,
059: stringArrayDeserializerFactory);
060: }
061:
062: public void registerSimpleTypeArrayHandlers(
063: ParameterDescriptor descriptor) {
064:
065: context = SerializationContext
066: .createSimpleSerializationContext(descriptor);
067:
068: TypeMappingRegistry registry = service.getTypeMappingRegistry();
069: TypeMapping typeMapping = registry
070: .getTypeMapping(this .encoding);
071:
072: if (typeMapping.isRegistered(XList.class, context.typeQName)) {
073: return;
074: }
075:
076: CombinedSerializer primitiveSerializer = getPrimitiveTypeSerializer(context);
077: context.serializer = primitiveSerializer;
078:
079: CombinedSerializer primitiveArraySerializer = getPrimitiveTypeArraySerializer(context);
080: primitiveArraySerializer = new ReferenceableSerializerImpl(
081: SimpleTypeSerializer.DONT_SERIALIZE_AS_REF,
082: primitiveArraySerializer);
083:
084: SerializerFactory stringArraySerializerFactory = new SingletonSerializerFactory(
085: primitiveArraySerializer);
086: DeserializerFactory stringArrayDeserializerFactory = new SingletonDeserializerFactory(
087: primitiveArraySerializer);
088:
089: typeMapping.register(Object[].class, context.typeQName,
090: stringArraySerializerFactory,
091: stringArrayDeserializerFactory);
092:
093: }
094:
095: protected CombinedSerializer getPrimitiveTypeSerializer(
096: SerializationContext context) {
097:
098: CombinedSerializer primitiveSerializer = null;
099:
100: primitiveSerializer = new SimpleTypeSerializer(
101: context.typeArrayQName,
102: SimpleTypeSerializer.DONT_ENCODE_TYPE,
103: SimpleTypeSerializer.NULLABLE,
104: SOAPNamespaceConstants.ENCODING,
105: context.primitiveTypeEncoder);
106:
107: return primitiveSerializer;
108: }
109:
110: protected CombinedSerializer getPrimitiveTypeArraySerializer(
111: SerializationContext context) {
112:
113: CombinedSerializer primitiveArraySerializer = null;
114: primitiveArraySerializer = new SimpleTypeArraySerializer(
115: context.typeQName, // array's QName
116: SimpleTypeArraySerializer.ENCODE_TYPE, // encoding needed
117: SimpleTypeArraySerializer.NULLABLE, // isNullable
118: SOAPNamespaceConstants.ENCODING, // SchemaConstants.NS_XSD, // encoding style
119: // SOAPConstants.URI_NS_SOAP_ENCODING,
120: new QName("", "item"), // element name
121: context.typeArrayQName, // element QName
122: context.typeHolderClass, // element's class
123: 1, // rank
124: null, // dimensions
125: (SimpleTypeSerializer) context.serializer); // simpletype serializer/deserializer
126:
127: return primitiveArraySerializer;
128: }
129: }
|