Consuming .NET Web Services in Oracle JDeveloper by Max I. Fomitchev Listing One private Response InvokeCall(String methodName, Vector params) throws Exception { try { Call call = InitializeCall(methodName, params); // Invoke call Response response = call.invoke(m_endpointURL,"#" + call.getMethodName()); // Report server-side SOAP fault (if any) if ( response.generatedFault() ) ReportFault(response); return response; } catch(Exception e) { throw e; } finally { // Reset SOAP type mappings to default state erasing all custom // mappings done for each specific SOAP method call ResetBeanSerializer(); } } private Call InitializeCall(String methodName, Vector params) throws ParserConfigurationException { Call call = new Call(); call.setSOAPTransport(m_httpConnection); call.setTargetObjectURI("urn:UltraMaxService"); call.setMethodName(methodName); call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); call.setParams(params); // SOAP header support call.setHeader(makeHeader()); // User-define type mapping support call.setSOAPMappingRegistry(m_smr); return call; } private void ResetBeanSerializer() { // Associate bean serializer with all user-defined types m_smr = new SOAPMappingRegistry(); m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("urn:UltraMaxService", "CUltraMaxUser"), CUltraMaxUser.class, m_beanSer, m_beanSer); } // Builds SOAPHeader containing SessionID public Header makeHeader() throws ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument(); Header header = new Header(); Vector headerEntries = new Vector(); // Build our sessionId element via DOM and add it to the header Element headerElement = doc.createElement("m_Header"); Element sessionIdElement = doc.createElement("m_SessionID"); sessionIdElement.setAttribute("xsi:type", "xsd:string"); sessionIdElement.appendChild(doc.createTextNode(getSessionId())); headerElement.appendChild(sessionIdElement); headerEntries.add(headerElement); header.setHeaderEntries(headerEntries); return header; } // Throws SOAPException containing detail information public void ReportFault(Response response) throws SOAPException { String detailText = null; Fault fault = response.getFault(); Vector detailEntires = fault.getDetailEntries(); if ( detailEntires.size() > 0 ) { XMLElement detail = (XMLElement)detailEntires.get(0); detailText = detail.getText(); } else detailText = fault.getFaultString(); throw new SOAPException(fault.getFaultCode(), detailText); } Listing Two public void MapType(Class c) throws Exception { // Make sure array item type is mapped if ( c.isArray() ) c = c.getComponentType(); // Map only UDTs defined in this package String className = c.getName(); if ( className.indexOf(CLASS_PREFIX) != 0 ) return; Method[] methods = c.getMethods(); for ( int i = 0; i < methods.length; i++ ) { String methodName = methods[i].getName(); if ( methodName.indexOf("get") == 0 ) { String propertyName = methodName.substring(3); Class propertyType = methods[i].getReturnType(); String propertyTypeName = propertyType.getName(); if ( propertyTypeName.compareTo("java.lang.String") == 0 ) m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", propertyName), null, null, m_stringSer); else if ( propertyTypeName.compareTo("java.util.Date") == 0 ) m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", propertyName), null, null, new DateSerializer()); else if ( propertyTypeName.compareTo("boolean") == 0 ) m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", propertyName), null, null, m_boolSer); else if ( propertyTypeName.compareTo("java.lang.Integer") == 0 || propertyTypeName.compareTo("int") == 0 ) m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", propertyName), null, null, m_intSer); else if ( propertyTypeName.compareTo("java.lang.Float") == 0 || propertyTypeName.compareTo("float") == 0 ) m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", propertyName), null, null, m_floatSer); else if ( propertyTypeName.indexOf(CLASS_PREFIX) == 0 ) { String truncatedName = propertyTypeName.substring(CLASS_PREFIX.length()); m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", propertyName), propertyType, m_beanSer, m_beanSer); m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("urn:UltraMaxService", truncatedName), propertyType, m_beanSer, m_beanSer); MapType(propertyType); } } } } // Invokes SOAP method and returns null when response is empty but // non-empty response is expected private Response InvokeCallEmpty(String methodName, Vector params) throws Exception { Response response = null; try { // Throws SOAPException when the element is empty response = InvokeCall(methodName, params); } catch (SOAPException ex) { String faultCode = ex.getFaultCode(); // If the SOAPException is generated on client side it is likely // to be due to deserialization error, most probably empty array if ( faultCode.compareTo("SOAP-ENV:Client") == 0 ) return null; else throw ex; } return response; } // Invokes SOAP method and returns an array of UDTs public Object InvokeUdtArrayTemplate(String methodName, Class cls, Vector params) throws Exception { // Return type UDT[] m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "return"), cls, m_arraySer, m_arraySer); // Mapp array element UDT MapType(cls); Response response = InvokeCallEmpty(methodName, params); // Return value if ( response != null ) { Parameter result = response.getReturnValue(); return result.getValue(); } else return null; } // Invokes SOAP method and returns an UDT public Object InvokeUdtTemplate(String methodName, Class cls, Vector params) throws Exception { Deserializer deser = null; if ( cls == String.class ) deser = m_stringSer; else if ( cls == Integer.class ) deser = m_intSer; else if ( cls == Boolean.class ) deser = m_boolSer; else if ( cls == Float.class ) deser = m_floatSer; else deser = m_beanSer; m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "return"), cls, null, deser); m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("urn:UltraMaxService", "return"), cls, null, deser); MapType(cls); Response response = InvokeCall(methodName, params); // Return value Parameter result = response.getReturnValue(); return result.getValue(); } Listing Three public class CUltraMaxUserBeanInfo extends SimpleBeanInfo { private final static Class target = CUltraMaxUser.class; public PropertyDescriptor[] getPropertyDescriptors() { try { return new PropertyDescriptor[] { new PropertyDescriptor("FirstName", target.getMethod("getFirstName", null), target.getMethod("setFirstName", new Class[] {String.class})), new PropertyDescriptor("LastName", target.getMethod("getLastName", null), target.getMethod("setLastName", new Class[] {String.class})), }; } catch (IntrospectionException e1) { throw new Error(e1.toString()); } catch (NoSuchMethodException e2) { throw new Error(e2.toString()); } } Listing Four public TrialPeriodSpan GetTrialPeriodSpan() throws Exception { // Output parameter String m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "start"), String.class, null, m_stringSer); // Return type Boolean m_smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "end"), String.class, null, m_stringSer); Response response = InvokeCall("GetTrialPeriodSpan", null); TrialPeriodSpan span = new TrialPeriodSpan(); // Output parameters Vector parameters = response.getParams(); for ( int i = 0; i < parameters.size(); i++ ) { Parameter outParameter = (Parameter)parameters.get(i); String parameterName = outParameter.getName(); Object parameterValue = outParameter.getValue(); if ( parameterName.compareTo("start") == 0 ) span.setStart((String)parameterValue); else if ( parameterName.compareTo("end") == 0 ) span.setEnd((String)parameterValue); } // Return value Parameter returnValue = response.getReturnValue(); String returnValueName = returnValue.getName(); String returnValueValue = (String)returnValue.getValue(); if ( returnValueName.compareTo("start") == 0 ) span.setStart(returnValueValue); else if ( returnValueName.compareTo("end") == 0 ) span.setEnd(returnValueValue); return span; } 1