gSOAP UDDI v2: Code Example 3: Publishing a WSDL and service on XMethods
Main Page | Class List | File List | Class Members | File Members | Related Pages

Code Example 3: Publishing a WSDL and service on XMethods

This example shows you how to publish a Web service. In this case, the example template code obtains an authorization token, saves the tModel with the WSDL URL in the server, and saves the business service information in the server.

#include "pubH.h"

const char *server = "https://uddi.xmethods.net/publish";

const char *userid = "..."; // user ID to access UDDI server
const char *passwd = "..."; // password to access UDDI server

int main(int argc, char **argv)
{ 
  // Create a gSOAP context
  struct soap *soap = soap_new();

  // Setup SSL context (optional) to verify server's credentials
  if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL))
  { 
    soap_print_fault(soap, stderr);
    exit(1);
  }

  // Step 1: Get an authorization token from the UDDI server
  uddi2__get_USCOREauthToken get_authToken(soap, userid, passwd);
  uddi2__authToken *authToken = get_authToken.send(server);

  // Check if authorized
  if (!authToken)
  {
    soap_print_fault(soap, stderr);
    exit(1);
  }

  // Authorization info provided by server for this session
  char *authInfo = authToken->authInfo;

  // Step 2: Create a tModel for the WSDL to be published
  uddi2__tModel tModel;
  tModel.soap_default(soap);

  // Create the tModel and service name
  tModel.name = soap_new_uddi2__name(soap, -1);
  tModel.name->__item = "...";
  tModel.name->xml__lang_ = "en";

  // Create XMethods description elements (see http://www.xmethods.net/ve2/UDDI.po)
  uddi2__description *description = soap_new_uddi2__description(soap, 6);
  description[0].__item = "SHORT DESCRIPTION: ...";
  description[0].xml__lang_ = "en";
  description[1].__item = "SHORT DESCRIPTION: ...";
  description[1].xml__lang_ = "en";
  description[2].__item = "USAGE NOTES: ...";
  description[2].xml__lang_ = "en";
  description[3].__item = "HOMEPAGE URL: ...";
  description[3].xml__lang_ = "en";
  description[4].__item = "CONTACT EMAIL: ...";
  description[4].xml__lang_ = "en";
  description[5].__item = "IMPLEMENTATION: ...";
  description[5].xml__lang_ = "en";

  // Add the four description elements to the tModel
  tModel.description.push_back(description + 0);
  tModel.description.push_back(description + 1);
  tModel.description.push_back(description + 2);
  tModel.description.push_back(description + 4);

  // Add an overviewDoc element with description and overviewURL
  tModel.overviewDoc = soap_new_uddi2__overviewDoc(soap, -1);
  tModel.overviewDoc->soap_default(soap);
  tModel.overviewDoc->description.push_back(soap_new_uddi2__description(soap, -1));
  tModel.overviewDoc->description[0]->__item = "WSDL source document";
  tModel.overviewDoc->description[0]->xml__lang_ = "en";
  tModel.overviewDoc->overviewURL = "http://.../my.wsdl#bindingName";

  // Omit identifier bag
  tModel.identifierBag = NULL;

  // Add a category with a WSDL-specific keyedReference
  tModel.categoryBag = soap_new_uddi2__categoryBag(soap, -1);
  tModel.categoryBag->soap_default(soap);
  tModel.categoryBag->keyedReference.push_back(soap_new_uddi2__keyedReference(soap, -1));
  tModel.categoryBag->keyedReference[0]->tModelKey = "...";
  tModel.categoryBag->keyedReference[0]->keyName = "uddi-org:types";
  tModel.categoryBag->keyedReference[0]->keyValue = "wsdlSpec";

  tModel.authorizedName = "...";
  tModel.operator_ = "...";
  tModel.tModelKey = "...";

  // Save the tModel
  uddi2__save_USCOREtModel save_tModel(soap, tModel);
  uddi2__tModelDetail *tModelDetail = save_tModel.send(server, authInfo);

  // Step 3: Create a new service to be published
  uddi2__businessService service;
  service.soap_default(soap);

  // Service name is the tModel name (XMethods)
  service.name.push_back(tModel.name);

  // Add two description elements to the service
  service.description.push_back(description + 4);
  service.description.push_back(description + 5);

  // Create binding template
  uddi2__bindingTemplate bindingTemplate;
  bindingTemplate.soap_default(soap);
  bindingTemplate.tModelInstanceDetails = soap_new_uddi2__tModelInstanceDetails(soap, -1);
  bindingTemplate.tModelInstanceDetails->tModelInstanceInfo.push_back(soap_new_uddi2__tModelInstanceInfo(soap, -1));
  bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->instanceDetails = NULL;
  bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->tModelKey = tModel.tModelKey;
  bindingTemplate.accessPoint = soap_new_uddi2__accessPoint(soap, -1);
  bindingTemplate.accessPoint->__item = "...";
  bindingTemplate.accessPoint->URLType = uddi2__URLType__http;
  bindingTemplate.hostingRedirector = NULL;
  bindingTemplate.serviceKey = "...";
  bindingTemplate.bindingKey = "...";

  // Add binding Template to service
  service.bindingTemplates = soap_new_uddi2__bindingTemplates(soap, -1);
  service.bindingTemplates->soap_default(soap);
  service.bindingTemplates->bindingTemplate.push_back(&bindingTemplate);

  service.categoryBag = NULL;
  service.serviceKey = "...";
  service.businessKey = "...";

  // Save the service
  uddi2__save_USCOREservice save_service(soap, service);
  uddi2__serviceDetail *serviceDetail = save_service.send(server, authInfo);

  // Step 4: Discard authorization token
  uddi2__discard_USCOREauthToken discard_authToken(soap, authInfo);
  uddi2__dispositionReport *dispositionReport = discard_authToken.send(server);

  // Remove deserialized objects
  soap_destroy(soap);

  // Remove temporary data
  soap_end(soap);

  // Detach and free context
  soap_done(soap);
  free(soap);

  return 0;
}
To compile:
Generated on Sun Sep 18 12:33:01 2005 for gSOAP UDDI v2 by doxygen 1.3.8