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 <return> 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


