== Using UDDI Annotations
Conventionally Services (BusinessService) and their EndPoints (BindingTemplates) are registered to a UDDI Registry using a GUI, where an admin user manually adds the necessary info. This process tends to make the data in the Registry rather static and the data can grow stale over time. To make the data in the UDDI more dynamic it makes sense to register and EndPoint (BindingTemplate) when it comes online, which is when it gets deployed. The UDDI annotations are designed to just that: register a Service when it get deployed to an Application Server. There are two annotations: UDDIService, and UDDIServiceBinding. You need to use both annotations to register an EndPoint. Upon undeployment of the Service, the EndPoint will be de-registered from the UDDI. The Service information stays in the UDDI. It makes sense to leave the Service level information in the Registry since this reflects that the Service is there, however there is no EndPoint at the moment ("Check back later"). It is a manual process to remove the Service information. The annotations use the juddi-client library which means that they can be used to register to any UDDIv3 registry.

=== UDDI Service Annotation
The UDDIService annotation is used to register a service under an already existing business in the Registry. The annotation should be added at the class level of the java class.

.UDDIService attributes
[options="header"]
|======================================
|attribute|	description|	required
|serviceName|	The name of the service, by default the clerk will use the one name specified in the WebService annotation|	no
|description|	Human readable description of the service|	yes
|serviceKey|	UDDI v3 Key of the Service|	yes
|businessKey|	UDDI v3 Key of the Business that should own this Service. The business should exist in the registry at time of registration|	yes
|lang|	Language locale which will be used for the name and description, defaults to "en" if omitted|	no
|categoryBag|	Definition of a CategoryBag, see below for details|	no
|======================================



=== UDDIServiceBinding Annotation
The UDDIServiceBinding annotation is used to register a BindingTemplate to the UDDI registry. This annotation cannot be used by itself. It needs to go along side a UDDIService annotation.

.UDDIServiceBinding attributes
[options="header"]
|======================================
|attribute|	description|	required
|bindingKey|	UDDI v3 Key of the ServiceBinding|	yes
|description|	Human readable description of the service|	yes
||accessPointType	UDDI v3 AccessPointType, defaults to wsdlDeployment if omitted|	no
|accessPoint|	Endpoint reference|	yes
|lang|	Language locale which will be used for the name and description, defaults to "en" if omitted|	no
|tModelKeys|	Comma-separated list of tModelKeys key references|	no
|categoryBag|	Definition of a CategoryBag, see below for further details|	no
|======================================

==== Java Web Service Example
The annotations can be used on any class that defines a service. Here they are added to a WebService, a POJO with a JAX-WS 'WebService' annotation.
----
package org.apache.juddi.samples;

import javax.jws.WebService;
import org.apache.juddi.v3.annotations.UDDIService;
import org.apache.juddi.v3.annotations.UDDIServiceBinding;

@UDDIService(
  businessKey="uddi:myBusinessKey",
  serviceKey="uddi:myServiceKey", 
  description = "Hello World test service")
@UDDIServiceBinding(
  bindingKey="uddi:myServiceBindingKey",
  description="WSDL endpoint for the helloWorld Service. This service is used for "
				  + "testing the jUDDI annotation functionality",
  accessPointType="wsdlDeployment",
  accessPoint="http://localhost:8080/juddiv3-samples/services/helloworld?wsdl")
@WebService(
  endpointInterface = "org.apache.juddi.samples.HelloWorld",
  serviceName = "HelloWorld")

public class HelloWorldImpl implements HelloWorld {
    public String sayHi(String text) {
        System.out.println("sayHi called");
        return "Hello " + text;
    }
}
----
On deployment of this WebService, the juddi-client code will scan this class for UDDI annotations and take care of the registration process. The configuration file uddi.xml of the juddi-client is described in the chapter, Using the jUDDI-Client. In the clerk section you need to reference the Service class 'org.apache.juddi.samples.HelloWorldImpl':
----
<clerk name="BobCratchit" node="default" publisher="sales" password="sales"> 
     <class>org.apache.juddi.samples.HelloWorldImpl</class>  
</clerk>
----
which means that Bob is using the node connection setting of the node with name "default", and that he will be using the "sales" publisher, for which the password it "sales". There is some analogy here as to how datasources are defined.

==== Wiring it all together

The mechanism that triggers the automated registration is the UDDIClient. For each class you annotation, the class needs to be listed in the jUDDI Client Configuration file. When the client reads in the configuration, it will read the uddi.xml config file for the following location:
----
client/clerks/clerk[].class
----
In addition, the following flag must be set to true.
----
client/clerks@registerOnStartup="true"
----
Here's a full example
----
<clerks registerOnStartup="false" >
    <clerk name="default" node="default" publisher="userjoe" password="******" cryptoProvider="" isPasswordEncrypted="false">
        <class>com.mybiz.services.Service1</class>
    </clerk>
</clerks>
----

The next step is to automate the "starting" and "stopping" of UDDIClient. In Java, anything that runs in a servlet container and use the following servlet class:
----
org.apache.juddi.v3.client.config.UDDIClerkServlet
----
It will automatically handle registration on start up and it will remove binding Templates on shutdown (this ensuring clients that discover the endpoint won't find a dead link).

Clients that run elsewhere simply need to "start" the UDDIClient.
----
//start up
UDDIClient clerkManager = new UDDIClient("META-INF/uddi.xml");
// register the clerkManager with the client side container
UDDIClientContainer.addClient(clerkManager); 
clerkManager.start(); //will create business/services/bindings as necessary

//shutdown down
clerkManager.stop(); //will unregister binding templates
----


=== .NET Web Service Example

In .NET, the procedure is almost identical to Java. Annotate your web service classes, append the classnames to your uddi.xml client config file. .NET annotations work with any WCF, ASP.NET or any other class. 

==== Wiring it all together

In .NET, there's a few options, each with pro's and con's for automating registration.

===== Use UDDIClient in your service's constructor
Pro: It's simple
Con: Services often get multiple instances depending on the number of worker threads in the server and thus can cause some concurrency issues.

===== Use UDDIClient in Global.asa Application_Start
Pro: It's simple 
Con: You need .NET 4.0 and ASP.NET enabled in order to utilize this function

More information about this can be found here: http://weblogs.asp.net/scottgu/archive/2009/09/15/auto-start-asp-net-applications-vs-2010-and-net-4-0-series.aspx


=== CategoryBag Attribute
The CategoryBag attribute allows you to reference tModels. For example the following categoryBag
----
<categoryBag>
    <keyedReference tModelKey="uddi:uddi.org:categorization:types" 
     keyName="uddi-org:types:wsdl" keyValue="wsdlDeployment" /> 
    <keyedReference tModelKey="uddi:uddi.org:categorization:types" 
     keyName="uddi-org:types:wsdl2" keyValue="wsdlDeployment2" />
</categoryBag> 
----
can be put in like
----
categoryBag="keyedReference=keyName=uddi-org:types:wsdl;keyValue=wsdlDeployment;" +
            "tModelKey=uddi:uddi.org:categorization:types," +  
                     "keyedReference=keyName=uddi-org:types:wsdl2;keyValue=wsdlDeployment2;" +
            "tModelKey=uddi:uddi.org:categorization:types2",
----

=== Considerations for clustered or load balanced web servers and automated registration

Most production environments have primary and failover web servers and/or an intelligent load balancer that routers traffic to whichever server is online. When using automated registration with the jUDDI client, care must be taken when enabling automated registration.
