Skip to main content

By clicking Submit, you agree to the developerWorks terms of use.

The first time you sign into developerWorks, a profile is created for you. Select information in your developerWorks profile is displayed to the public, but you may edit the information at any time. Your first name, last name (unless you choose to hide them), and display name will accompany the content that you post.

All information submitted is secure.

  • Close [x]

The first time you sign in to developerWorks, a profile is created for you, so you need to choose a display name. Your display name accompanies the content you post on developerworks.

Please choose a display name between 3-31 characters. Your display name must be unique in the developerWorks community and should not be your email address for privacy reasons.

By clicking Submit, you agree to the developerWorks terms of use.

All information submitted is secure.

  • Close [x]

Service Registry Proxy

A higher-level API

Alfredo Silva (afdasilv@us.ibm.com), Advisory Software Engineer, IBM, Software Group
Alfredo da Silva is a software developer at IBM. He is a member of the group responsible for the IBM Web Services Toolkit (WSTK). You can contact Alfredo at afdasilv@us.ibm.com.

Summary:  In order to provide additional tools to the Web services developer, this article discusses a new API -- the Service Registry Proxy, or SRP -- which helps to raise the abstraction level during application development and promotes seamless integration between UDDI and WSDL elements.

Date:  01 Nov 2001
Level:  Introductory
Also available in:   Japanese

Activity:  7561 views
Comments:  

The release of the UDDI4J API (see Resources for links to this and other references made in this article) enabled the creation of UDDI-aware applications, making the publish, unpublish and find operations available from an open-source API.

In order to allow WSDL documents (see Resources for a link) to be part of this equation, a new layer called the Service Registry Proxy API (or SRP), which sits on top of the UDDI4J, has been devised.

The SRP API elements encapsulate classes present in the UDDI4J API, and some defined by the WSDL4J API, and offer a comprehensive set of methods for interfacing with a UDDI Registry. Its model simplifies the development of applications because it raises the level of abstraction, enabling the developer to concentrate on entities directly related to the Web services architecture domain.

SRP supporting classes

The SRP API is structured around the following main elements: Service Provider (SP), Service Definition (SD), Service Implementation (SIMP), and Service Interface (SITF), as shown in Figure 1.


Figure 1: SRP API main elements
Figure 1: SRP API main elements
  • SP
    The Service Provider represents an entity capable of providing services. It encapsulates a reference to the UDDI4J class BusinessEntity.
  • SD
    The Service Definition describes a service by breaking it down into two pieces: implementation (SIMP) and a list of the implemented interfaces (SITF).
  • SIMP
    The Service Implementation has a dual role. It exposes the related WSDL implementation document (see Resources) and also has a reference to the UDDI4J class BusinessService.
  • SINT
    The Service Interface also encapsulates two entities: a WSDL interface document (see Resources) and a reference to the UDDI4J class TModel.

The WSDL capabilities presented by SIMP and SINT are inherited from their parent class WSDLServiceInfo.

This organization enables SRP to tie together UDDI and WSDL elements and, at the same time, abstract their concepts -- thereby making the creation of Web services a more productive task.


SRP data structure

Internally, SRP has the main attributes you see illustrated in Table 1. They handle the interface with the UDDI4J API and maintain relevant UDDI Registry connection information.


Table 1: SRP attributes
AttributeDescription
protected int maxRowsReturned = 100; Max number of rows returned
protected int numRowsToSearch = 100; Max number of rows to search
protected String inquiryURL; URL used in Find operations
protected String publishURL; URL used in Publish operations
protected String userId; Userid to connect to the UDDI Registry
protected String cred; Password to connect to the UDDI Registry
protected UDDIProxy uddiProxy; UDDI4J proxy object

API functionality

The SRP API consists of the following functional groups: Publish, Unpublish, and Find -- as shown in Table 2. For complete SRP API javadocs, please see Resources for a link.


Table 2: SRP functional groups
API Sub-API Method Call Description
Publish     Publishes ServiceProviders, ServiceDefinition, and ServiceInterface objects
       
    publish (ServiceProvider) : ServiceProvider  
    publish (ServiceProvider, ServiceDefinition) : ServiceDefinition  
    publish (ServiceInterface) : ServiceInterface  
       
Unpublish     Unpublishes ServiceProviders, ServiceDefinition, and ServiceInterface objects
       
    unpublish (ServiceProvider) : void  
    unpublish (ServiceInterface) : void  
    unpublish (ServiceProvider, ServiceDefinition) : void  
       
Find      
  Service Provider   Find ServiceProvider objects given a search criteria
       
    findAllServiceProviders (FindQualifiers, boolean) : ServiceProvider[]  
    findServiceProvider (ServiceDefinition) : ServiceProvider  
    findServiceProvider (String) : ServiceProvider  
    findServiceProviders (FindQualifiers, DiscoveryURLs) : ServiceProvider[]  
    findServiceProviders (FindQualifiers, TModelBag) : ServiceProvider[]  
    findServiceProviders (String, boolean) : ServiceProvider[]  
    findServiceProviders (CategoryList) : ServiceProvider[] 
    findServiceProviders (IdentifierList) : ServiceProvider[]  
       
  Service Definition   Find ServiceDefinition objects given a search criteria
       
    findAllServices (FindQualifiers, boolean) : ServiceDefinition[]  
    findService (String) : ServiceDefinition 
    findService (FindQualifiers, ServiceProvider, ServiceImplementation) : ServiceDefinition 
    findServices (FindQualifiers, TModelBag) : ServiceDefinition[]  
    findServices (String, boolean) : ServiceDefinition[]  
    findServices (FindQualifiers, ServiceInterface) : ServiceDefinition[]  
    findServices (ServiceInterface, String) : ServiceDefinition[]  
    findServices (ServiceInterface, CategoryList) : ServiceDefinition[]  
    findServices (ServiceProvider, String) : ServiceDefinition[]  
    findServices (FindQualifiers, ServiceProvider) : ServiceDefinition[]  
    findServices (FindQualifiers, ServiceProvider, CategoryList) : ServiceDefinition[]  
    findServices (FindQualifiers, CategoryList) : ServiceDefinition[]  
    findServices (ServiceList) : ServiceDefinition[]  
       
  Service Interface   Find ServiceInterface objects given a search criteria
       
    findAllServiceInterfaces (FindQualifiers, boolean) : ServiceInterface[]  
    findServiceInterface (String) : ServiceInterface  
    findServiceInterfaces (String, boolean) : ServiceInterface[]  
    findServiceInterfaces (FindQualifiers, IdentifierList) : ServiceInterface[]  
    findServiceInterfaces (FindQualifiers, CategoryList) : ServiceInterface[]  
    findServiceInterfaces (ServiceImplementation) : ServiceInterface[]  
    findServiceInterfaces (ServiceImplementation, String) : ServiceInterface[]  
    findServiceInterfaces (ServiceImplementation, IdentifierList) : ServiceInterface[]  
    findServiceInterfaces (ServiceImplementation, CategoryList) : ServiceInterface[]  

Putting it to work

The demos in this article illustrate the capabilities of the SRP API by publishing, finding, and finally unpublishing a Service Provider element. The source code is shown in Listings 1, 2, and 3. Please feel free to use and adapt this code for your own projects.

The ServiceProviderPublishDemo, during its initialization phase, creates an SRP object with specific URLs to publish and inquire as well as a userid and password which have been pre-registered with the target UDDI registry. A CategoryList class is instantiated to support the creation of a ServiceProvider that also needs a name and a description.

Once the ServiceProvider is successfully created, the SRP publish method is invoked -- receiving this object as its only parameter. The code checks for possible error conditions issuing appropriate messages during its execution.


Listing 1: Service provider publish demo


     import com.ibm.wstk.service.provider.*;
     import com.ibm.wstk.service.registry.*;
     import com.ibm.wstk.service.util.*;
     import com.ibm.wstk.uddi.*;


     public class ServiceProviderPublishDemo
     {
       public static String UDDI_TEST_REGISTRY_INQUIRY
     = "http://www-3.ibm.com/services/uddi/testregistry/inquiryapi";
       public static String UDDI_TEST_REGISTRY_PUBLISH
     = "https://www-3.ibm.com/services/uddi/testregistry/protect/publishapi";
       public static String UDDI_USER = "srpuser";
       public static String UDDI_PASSWD = "srppwd";
       public static String SERVICE_PROVIDER_NAME = "demo provider";
       public static String SERVICE_PROVIDER_DESC = "SRP provider demo";
       public static String TMODEL_KEY = "NAICS";
       public static String KEY_NAME = "Greeting Card Publishers";
       public static String KEY_VALUE = "511191";


       public static void main(String args[])
       {
         try
         {
           //////////////////// INITIALIZATION
     /////////////////////////////////

           // Create Service Registry Proxy
           ServiceRegistryProxy srp =
             new ServiceRegistryProxy(UDDI_TEST_REGISTRY_INQUIRY,
                                      UDDI_TEST_REGISTRY_PUBLISH,
                                      UDDI_USER, UDDI_PASSWD);

           // Create category list
           CategoryList categoryList =
             new CategoryList(TModelKeyTable.getTModelKey(TMODEL_KEY),
                              KEY_NAME, KEY_VALUE);

           // Create service provider
           ServiceProvider serviceProvider =
             new ServiceProvider(SERVICE_PROVIDER_NAME,
                                 SERVICE_PROVIDER_DESC,
                                 categoryList);

           //////////////////// PUBLISH
     ////////////////////////////////////////

           // Publish the service provider
           srp.publish(serviceProvider);

           // Display publish completed message
           System.out.println("Service provider " + "\"" +
                              SERVICE_PROVIDER_NAME + "\"" + " was published.");
         }
         catch (ServiceRegistryProxyException e)
         {
           System.out.println("ServiceRegistryProxyException: " + e.getMessage());
         }
         catch (InvalidCategoryException e)
         {
           System.out.println("InvalidCategoryException: " + e.getMessage());
         }
       }
     }



The demo responsible for finding a ServiceProvider creates an SRP instance with the same parameters used by the previous demo.

The previously published ServiceProvider is then found using one of the find SRP methods, and appropriate messages are generated during execution:


Listing 2: Service provider find demo


     import com.ibm.wstk.service.provider.*;
     import com.ibm.wstk.service.registry.*;
     import com.ibm.wstk.service.util.*;
     import com.ibm.wstk.uddi.*;


     public class ServiceProviderFindDemo
     {
       public static String UDDI_TEST_REGISTRY_INQUIRY
     = "http://www-3.ibm.com/services/uddi/testregistry/inquiryapi";
       public static String UDDI_TEST_REGISTRY_PUBLISH
     = "https://www-3.ibm.com/services/uddi/testregistry/protect/publishapi";
       public static String UDDI_USER = "srpuser";
       public static String UDDI_PASSWD = "srppwd";
       public static String SERVICE_PROVIDER_NAME = "demo provider";


       public static void main(String args[])
       {
         try
         {
           //////////////////// INITIALIZATION
     /////////////////////////////////

           // Create Service Registry Proxy
           ServiceRegistryProxy srp =
             new ServiceRegistryProxy(UDDI_TEST_REGISTRY_INQUIRY,
                                      UDDI_TEST_REGISTRY_PUBLISH,
                                      UDDI_USER, UDDI_PASSWD);

           //////////////////// FIND
     ///////////////////////////////////////////

           // Find the published service provider
           ServiceProvider[] serviceProviderList =
             srp.findServiceProviders(SERVICE_PROVIDER_NAME, true);

           // Display find completed message
           if (serviceProviderList == null)
             System.out.println("Service provider " + "\"" +
     SERVICE_PROVIDER_NAME
                                + "\"" + " was not found.");
           else
           {
             System.out.println("Service Provider Name: " +
                                  serviceProviderList[0].getBusinessEntity
     ().getNameString());
             System.out.println("          Description: " +
                                serviceProviderList[0].getBusinessEntity
     ().getDefaultDescriptionString());
           }
         }
         catch (ServiceRegistryProxyException e)
         {
           System.out.println("ServiceRegistryProxyException: " + e.getMessage());
         }
       }
     }



At last it is unpublish time. Initialization is the same as before. Then the target ServiceProvider is found and unpublished via the appropriate SRP unpublish method. Again, errors are monitored and reported.


Listing 3: Service provider unpublish demo



     import com.ibm.wstk.service.provider.*;
     import com.ibm.wstk.service.registry.*;
     import com.ibm.wstk.service.util.*;
     import com.ibm.wstk.uddi.*;


     public class ServiceProviderUnpublishDemo
     {
       public static String UDDI_TEST_REGISTRY_INQUIRY
     = "http://www-3.ibm.com/services/uddi/testregistry/inquiryapi";
       public static String UDDI_TEST_REGISTRY_PUBLISH
     = "https://www-3.ibm.com/services/uddi/testregistry/protect/publishapi";
       public static String UDDI_USER = "srpuser";
       public static String UDDI_PASSWD = "srppwd";
       public static String SERVICE_PROVIDER_NAME = "demo provider";


       public static void main(String args[])
       {
         try
         {
           //////////////////// INITIALIZATION
     /////////////////////////////////

           // Create Service Registry Proxy
           ServiceRegistryProxy srp =
             new ServiceRegistryProxy(UDDI_TEST_REGISTRY_INQUIRY,
                                      UDDI_TEST_REGISTRY_PUBLISH,
                                      UDDI_USER, UDDI_PASSWD);

           //////////////////// UNPUBLISH
     //////////////////////////////////////

           // Find the published service provider
           ServiceProvider[] serviceProviderList =
             srp.findServiceProviders(SERVICE_PROVIDER_NAME, true);

           if (serviceProviderList != null)
           {
             // Unpublish the service provider
             srp.unpublish(serviceProviderList[0]);

             // Display unpublish completed message
             System.out.println("Service provider " + "\"" +
                                SERVICE_PROVIDER_NAME + "\"" + " was unpublished.");
           }
           else
             // Display error message
             System.out.println("Service provider " + "\"" +
                                SERVICE_PROVIDER_NAME + "\"" + " not found.");
         }
         catch (ServiceRegistryProxyException e)
         {
           System.out.println("ServiceRegistryProxyException: " + e.getMessage());
         }
       }
     }


These demos use the IBM UDDI Test Registry to interact; a predefined login and password have already been registered with the Test Registry.

The SRP, UDDI4J, and WSDL4J are also available as part of the IBM Web Services Toolkit (WSTK) - see Resources for a link. Once WSTK is installed and configured, follow these directions to compile and execute the Service Provider in a Microsoft Windows 2000 environment (The only difference on Linux or Unix would be in the syntax of the commands used to compiled and execute the code):

Compile

Open a shell window and go to the directory where the demos are located, and from the prompt type the following:

 %WSTK_HOME%\bin\wstkenv.bat
 javac -classpath .;%WSTK_CP%;%WSTK_HOME%\uddi4j\lib\uddi4j.jar
 *.java


Execute

In the same shell window now type:

 java -cp .;%WSTK_CP%;%WSTK_HOME%\uddi4j\lib\uddi4j.jar
 ServiceProviderXXXDemo


A successful execution of these demos yields the output shown in Table 3.


Table 3: Demos' output
DemoOutput
ServiceProviderPublishDemo Service provider "demo provider" was published
ServiceProviderFindDemo Service Provider Name: demo provider
Description: SRP provider demo
ServiceProviderUnpublishDemo Service provider "demo provider" was unpublished

Summary

Now that you are familiar with SRP, I hope that you will find the tool useful. Please feel free to use the code presented here in your own work, and remember to let the Web services team know what other types of articles or tools you would find useful. You'll find links to the WSTK page (and links to feedback forms for the project team) listed in the Resources section.


Resources

About the author

Alfredo da Silva is a software developer at IBM. He is a member of the group responsible for the IBM Web Services Toolkit (WSTK). You can contact Alfredo at afdasilv@us.ibm.com.

Report abuse help

Report abuse

Thank you. This entry has been flagged for moderator attention.


Report abuse help

Report abuse

Report abuse submission failed. Please try again later.


developerWorks: Sign in


Need an IBM ID?
Forgot your IBM ID?


Forgot your password?
Change your password

By clicking Submit, you agree to the developerWorks terms of use.

 


The first time you sign into developerWorks, a profile is created for you. Select information in your developerWorks profile is displayed to the public, but you may edit the information at any time. Your first name, last name (unless you choose to hide them), and display name will accompany the content that you post.

Choose your display name

The first time you sign in to developerWorks, a profile is created for you, so you need to choose a display name. Your display name accompanies the content you post on developerWorks.

Please choose a display name between 3-31 characters. Your display name must be unique in the developerWorks community and should not be your email address for privacy reasons.

(Must be between 3 – 31 characters.)

By clicking Submit, you agree to the developerWorks terms of use.

 


Rate this article

Comments

Help: Update or add to My dW interests

What's this?

This little timesaver lets you update your My developerWorks profile with just one click! The general subject of this content (AIX and UNIX, Information Management, Lotus, Rational, Tivoli, WebSphere, Java, Linux, Open source, SOA and Web services, Web development, or XML) will be added to the interests section of your profile, if it's not there already. You only need to be logged in to My developerWorks.

And what's the point of adding your interests to your profile? That's how you find other users with the same interests as yours, and see what they're reading and contributing to the community. Your interests also help us recommend relevant developerWorks content to you.

View your My developerWorks profile

Return from help

Help: Remove from My dW interests

What's this?

Removing this interest does not alter your profile, but rather removes this piece of content from a list of all content for which you've indicated interest. In a future enhancement to My developerWorks, you'll be able to see a record of that content.

View your My developerWorks profile

Return from help

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=1
Zone=SOA and Web services
ArticleID=11621
ArticleTitle=Service Registry Proxy
publish-date=11012001
author1-email=afdasilv@us.ibm.com
author1-email-cc=

Tags

Help
Use the search field to find all types of content in My developerWorks with that tag.

Use the slider bar to see more or fewer tags.

For articles in technology zones (such as Java technology, Linux, Open source, XML), Popular tags shows the top tags for all technology zones. For articles in product zones (such as Info Mgmt, Rational, WebSphere), Popular tags shows the top tags for just that product zone.

For articles in technology zones (such as Java technology, Linux, Open source, XML), My tags shows your tags for all technology zones. For articles in product zones (such as Info Mgmt, Rational, WebSphere), My tags shows your tags for just that product zone.

Use the search field to find all types of content in My developerWorks with that tag. Popular tags shows the top tags for this particular content zone (for example, Java technology, Linux, WebSphere). My tags shows your tags for this particular content zone (for example, Java technology, Linux, WebSphere).

Special offers