1 22 package org.apache.beehive.wsm.axis.util; 23 24 import java.lang.reflect.Constructor ; 25 import java.lang.reflect.Method ; 26 27 import java.io.File ; 28 import java.io.Serializable ; 29 30 import java.rmi.Remote ; 31 32 import java.util.Collection ; 33 import java.util.HashMap ; 34 import java.util.List ; 35 import java.util.Map ; 36 37 import javax.jws.WebParam; 38 import javax.xml.namespace.QName ; 39 import javax.xml.soap.SOAPHeader ; 40 import javax.wsdl.OperationType; 41 42 import org.apache.axis.Message; 43 import org.apache.axis.client.Call; 44 import org.apache.axis.client.Service; 45 import org.apache.axis.client.Stub; 46 import org.apache.axis.description.ElementDesc; 47 import org.apache.axis.description.FaultDesc; 48 import org.apache.axis.description.FieldDesc; 49 import org.apache.axis.description.OperationDesc; 50 import org.apache.axis.description.ParameterDesc; 51 import org.apache.axis.description.TypeDesc; 52 import org.apache.axis.encoding.DeserializerFactory; 53 import org.apache.axis.encoding.SerializerFactory; 54 import org.apache.axis.encoding.TypeMapping; 55 import org.apache.axis.encoding.ser.ArraySerializerFactory; 56 import org.apache.axis.encoding.ser.BeanSerializerFactory; 57 import org.apache.axis.encoding.ser.ArrayDeserializerFactory; 58 import org.apache.axis.encoding.ser.BeanDeserializerFactory; 59 import org.apache.axis.encoding.ser.VectorDeserializerFactory; 60 import org.apache.axis.message.SOAPHeaderElement; 61 import org.apache.axis.utils.BeanPropertyDescriptor; 62 import org.apache.axis.wsdl.fromJava.Namespaces; 63 import org.apache.axis.wsdl.fromJava.Types; 64 65 import org.apache.beehive.wsm.axis.util.encoding.XmlBeanDeserializerFactory; 66 import org.apache.beehive.wsm.axis.util.encoding.XmlBeanSerializerFactory; 67 import org.apache.beehive.wsm.util.InvalidTypeMappingException; 68 import org.apache.beehive.wsm.util.XmlBeanTypeMappingUtil; 69 70 import org.apache.xmlbeans.SchemaType; 71 import org.apache.xmlbeans.SchemaTypeLoader; 72 import org.apache.xmlbeans.XmlBeans; 73 import org.apache.xmlbeans.XmlObject; 74 75 import org.w3c.dom.Element ; 76 77 81 public class AxisTypeMappingUtil extends XmlBeanTypeMappingUtil { 82 83 private TypeMapping mTypeMapping; 84 85 public AxisTypeMappingUtil(TypeMapping tm) { 86 super(); 87 88 mTypeMapping = tm; 89 } 90 91 public QName registerType(Class cls) throws InvalidTypeMappingException { 92 return registerType(cls, null); 93 } 94 95 public QName registerType(Class cls, QName expectedType) 96 throws InvalidTypeMappingException { 97 98 QName q; 99 100 if (Void.TYPE.equals(cls)) { 101 q = null; 102 } 103 else { 104 105 q = mTypeMapping.getTypeQName(cls); 106 107 if (q == null || 108 (expectedType != null && !expectedType.equals(q))) { 109 110 if (expectedType == null) { 111 q = generateQName(cls, "http://no.namespace.specified"); 112 } 113 else { 114 q = expectedType; 115 } 116 117 if (cls.isArray()) { 118 if (!mTypeMapping.isRegistered(cls, q)) { 119 mTypeMapping.register(cls, q, 120 new ArraySerializerFactory(cls, q), 121 new ArrayDeserializerFactory()); 122 } 123 q = registerType(cls.getComponentType()); 124 if (expectedType != null) { 126 q = expectedType; 127 } 128 } 129 else if (!mTypeMapping.isRegistered(cls, q)) { 130 if (XmlObject.class.isAssignableFrom(cls)) { 131 mTypeMapping.register(cls, q, 132 new XmlBeanSerializerFactory(cls, q), 133 new XmlBeanDeserializerFactory(cls, q)); 134 } 135 140 else if (isActivationEnabled() && 141 (java.awt.Image .class.isAssignableFrom(cls) 142 || getMultipartClass().isAssignableFrom(cls) 143 || getDataHandlerClass().isAssignableFrom(cls))) { 144 try { 145 150 ClassLoader cl = getClass().getClassLoader(); 151 Class <SerializerFactory> sfClass = 152 (Class <SerializerFactory>) 153 cl.loadClass("org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory"); 154 Class <DeserializerFactory> dsfClass = 155 (Class <DeserializerFactory>) 156 cl.loadClass("org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"); 157 Constructor <SerializerFactory> sfCon = 158 sfClass.getConstructor(Class .class, 159 QName .class); 160 Constructor <DeserializerFactory> dsfCon = 161 dsfClass.getConstructor(Class .class, 162 QName .class); 163 SerializerFactory sf = sfCon.newInstance(cls, q); 164 DeserializerFactory dsf = dsfCon.newInstance(cls, q); 165 mTypeMapping.register(cls, q, sf, dsf); 166 } catch (Exception e) { 167 171 e.printStackTrace(); 172 } 173 } else if (! Remote .class.isAssignableFrom(cls) 174 179 180 188 && !File .class.isAssignableFrom(cls)) { 189 TypeDesc td = TypeDesc.getTypeDescForClass(cls); 190 TypeDesc superTd = null; 191 BeanPropertyDescriptor[] superPd = null; 192 if (null == td) { 193 td = new TypeDesc(cls); 194 Class supa = cls.getSuperclass(); 195 if ((supa != null) 196 && (supa != java.lang.Object .class) 197 && (supa != java.lang.Exception .class) 198 && (supa != java.lang.Throwable .class) 199 && (supa != java.rmi.RemoteException .class) 200 && (supa != org.apache.axis.AxisFault.class)) { 201 registerType(supa); 202 } 203 superTd = TypeDesc 204 .getTypeDescForClass(supa); 205 if (superTd != null) { 206 superPd = superTd.getPropertyDescriptors(); 207 } 208 td.setXmlType(q); 209 TypeDesc.registerTypeDescForClass(cls, td); 210 } else { 211 td = null; 212 } 213 mTypeMapping.register(cls, q, 214 new BeanSerializerFactory(cls, q), 215 222 new BeanDeserializerFactory(cls, q)); 223 Map serProps = BeanDeserializerFactory 224 .getProperties(cls, null); 225 for (BeanPropertyDescriptor beanProps : 226 (Collection <BeanPropertyDescriptor>) serProps 227 .values()) { 228 Class subType = beanProps.getType(); 229 if (!(subType.isPrimitive() 230 || subType.getName().startsWith("java.") 231 || subType.getName().startsWith("javax."))) { 232 registerType(subType); 233 } 234 if (td != null) { 235 String ns = q.getNamespaceURI(); 236 if (superTd != null && superPd != null) { 237 for (int j = 0; j < superPd.length; j++) { 238 if (beanProps.getName() 239 .equals(superPd[j] 240 .getName())) { 241 ns = superTd.getXmlType() 242 .getNamespaceURI(); 243 break; 244 } 245 } 246 } 247 FieldDesc fd = new ElementDesc(); 248 fd.setJavaType(subType); 249 fd.setFieldName(beanProps.getName()); 250 fd.setXmlName(new QName (ns, 251 beanProps.getName())); 252 fd.setXmlType(mTypeMapping.getTypeQName(subType)); 255 ((ElementDesc) fd).setNillable(true); 256 258 td.addFieldDesc(fd); 259 } 260 } 261 } else { 262 throw new InvalidTypeMappingException 263 ("failed to register " + cls.getName() 264 + " as a valid web service datatype," 265 + " consider using a custom type mapping"); 266 } 267 } 268 } 269 } 270 return q; 271 } 272 273 public Class q2Class(QName qType) { 274 275 Class cls = super.q2Class(qType); 276 if (Object .class.equals(cls) && mTypeMapping != null) { 277 cls = mTypeMapping.getClassForQName(qType); 278 return cls; 279 } 280 else { 281 return null; 282 } 283 } 284 285 private boolean isActivationEnabled() { 286 return null != getDataHandlerClass() && null != getMultipartClass(); 287 } 288 289 private Class getDataHandlerClass() { 290 try { 291 return getClass().getClassLoader() 292 .loadClass("javax.activation.DataHandler"); 293 } catch (Exception e) { 294 } 295 return null; 296 } 297 298 private Class getMultipartClass() { 299 try { 300 return getClass().getClassLoader() 301 .loadClass("javax.mail.internet.MimeMultipart"); 302 } catch (Exception e) { 303 } 304 return null; 305 } 306 307 public QName generateQName(Class type, String defaultNS) { 308 309 QName generated = super.generateQName(type, defaultNS); 310 if (generated == null) { 311 String namespace = Namespaces.makeNamespace(type.getName()); 312 if (namespace == null || namespace 313 .endsWith("DefaultNamespace")) { 314 namespace = defaultNS; 315 } 316 generated = new QName (namespace, 317 Types.getLocalNameFromFullName(type 318 .getName())); 319 } 320 return generated; 321 } 322 } 323 | Popular Tags |