You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juddi.apache.org by al...@apache.org on 2013/05/11 17:21:35 UTC

svn commit: r1481355 - /juddi/trunk/juddi-client/src/main/java/org/apache/juddi/v3/client/mapping/WSDL2UDDI.java

Author: alexoree
Date: Sat May 11 15:21:35 2013
New Revision: 1481355

URL: http://svn.apache.org/r1481355
Log:
Adding additional javadoc and sample code to WSDL2UDDI

Modified:
    juddi/trunk/juddi-client/src/main/java/org/apache/juddi/v3/client/mapping/WSDL2UDDI.java

Modified: juddi/trunk/juddi-client/src/main/java/org/apache/juddi/v3/client/mapping/WSDL2UDDI.java
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-client/src/main/java/org/apache/juddi/v3/client/mapping/WSDL2UDDI.java?rev=1481355&r1=1481354&r2=1481355&view=diff
==============================================================================
--- juddi/trunk/juddi-client/src/main/java/org/apache/juddi/v3/client/mapping/WSDL2UDDI.java (original)
+++ juddi/trunk/juddi-client/src/main/java/org/apache/juddi/v3/client/mapping/WSDL2UDDI.java Sat May 11 15:21:35 2013
@@ -65,763 +65,840 @@ import org.uddi.api_v3.TModelInstanceDet
 import org.uddi.api_v3.TModelInstanceInfo;
 import org.w3c.dom.Element;
 
-
 /**
- * This class implements the OASIS <a href="http://www.oasis-open.org/committees/uddi-spec/doc/tn/uddi-spec-tc-tn-wsdl-v202-20040631.htm">
- * 'Using WSDL in a UDDI Registry, Version 2.0.2'</a> technote. This class creates a detailed mapping of 
- * WSDL 1.1 artifacts to the UDDI V3 data model.
- * <ul>
- * <th>Section 2.4 in the technote</th>
- * <li>2.4.1 wsdl:portType -> uddi:tModel - {@link #createWSDLPortTypeTModels(String, Map)}</li>
- * <li>2.4.2 wsdl:binding  -> uddi:tModel - {@link #createWSDLBindingTModels(String, Map)}</li>
- * <li>TODO: 2.4.3 wsdl:service  -> uddi:businessService</li>
- * <li>TODO: 2.4.4 wsdl:port     -> uddi:bindingTemplate</li>
- * <li>TODO: 2.4.5 wsdl:port Address Extensions -> uddi:bindingTemplate</li>
- * </ul>
- * 
+ * This class implements the OASIS <a
+ * href="http://www.oasis-open.org/committees/uddi-spec/doc/tn/uddi-spec-tc-tn-wsdl-v202-20040631.htm">
+ * 'Using WSDL in a UDDI Registry, Version 2.0.2'</a> technote. This class
+ * creates a detailed mapping of WSDL 1.1 artifacts to the UDDI V3 data model.
+ * <ul> <th>Section 2.4 in the technote</th> <li>2.4.1 wsdl:portType ->
+ * uddi:tModel - {@link #createWSDLPortTypeTModels(String, Map)}</li> <li>2.4.2
+ * wsdl:binding -> uddi:tModel -
+ * {@link #createWSDLBindingTModels(String, Map)}</li> <li>TODO: 2.4.3
+ * wsdl:service -> uddi:businessService</li> <li>TODO: 2.4.4 wsdl:port ->
+ * uddi:bindingTemplate</li> <li>TODO: 2.4.5 wsdl:port Address Extensions ->
+ * uddi:bindingTemplate</li> </ul>
+ *
  * @author Kurt T Stam
  * @Since 3.1.5
  */
 public class WSDL2UDDI {
-	
-	private static Log log = LogFactory.getLog(WSDL2UDDI.class);
-	private String keyDomainURI;
-	private String businessKey;
-	private String lang;
-	private UDDIClerk clerk = null;
-	private Properties properties = null;
-	private URLLocalizer urlLocalizer;
-	
-	/**
-	 * Required Properties are:
-	 * 	businessName, for example: 'Apache'
-	 *  nodeName, for example: 'uddi.example.org_80'
-	 *  keyDomain, for example: juddi.apache.org
-	 * 
-	 * Optional Properties are:
-	 *  lang: for example: 'nl'
-	 *  
-	 * @param clerk - can be null if register/unregister methods are not used.
-	 * @param urlLocalizer - A reference to an custom
-	 * @param properties
-	 * @throws ConfigurationException 
-	 */
-	public WSDL2UDDI(UDDIClerk clerk, URLLocalizer urlLocalizer, Properties properties) throws ConfigurationException {
-		super();
-		
-		this.clerk = clerk;
-		this.urlLocalizer = urlLocalizer;
-		this.properties = properties;
-		
-		if (clerk!=null) {
-			if (!properties.containsKey("keyDomain")) {
-				throw new ConfigurationException("Property keyDomain is a required property when using WSDL2UDDI.");
-			}
-			if (!properties.containsKey("businessKey") && !properties.containsKey("businessName")) {
-				throw new ConfigurationException("Either property businessKey, or businessName, is a required property when using WSDL2UDDI.");
-			}
-			if (!properties.containsKey("nodeName")) {
-				if (properties.containsKey("serverName") && properties.containsKey("serverPort")) {
-					String nodeName = properties.getProperty("serverName") + "_" + properties.getProperty("serverPort");
-					properties.setProperty("nodeName", nodeName);
-				} else {
-					throw new ConfigurationException("Property nodeName is not defined and is a required property when using WSDL2UDDI.");
-				}
-			}
-		}
-		
-		//Obtaining values from the properties
-		this.keyDomainURI =  "uddi:" + properties.getProperty("keyDomain") + ":";
-		if (properties.contains(Property.BUSINESS_KEY)) {
-			this.businessKey = properties.getProperty(Property.BUSINESS_KEY);
-		} else {
-			//using the BusinessKey Template, and the businessName to construct the key 
-			this.businessKey = UDDIKeyConvention.getBusinessKey(properties);
-		}
-		this.lang = properties.getProperty(Property.LANG,Property.DEFAULT_LANG);
-	}
-	
-	public BusinessServices registerBusinessServices(Definition wsdlDefinition) throws RemoteException, ConfigurationException, TransportException, WSDLException {
-		
-		BusinessServices businessServices = new BusinessServices();
-		
-		for (Object serviceName : wsdlDefinition.getAllServices().keySet()) {
-			QName serviceQName = (QName) serviceName;
-			Service service = wsdlDefinition.getService(serviceQName);
-			BusinessService businessService = null;
-			//add service
-			URL serviceUrl = null;
-			if (service.getPorts()!=null && service.getPorts().size()>0) {
-				for (Object portName : service.getPorts().keySet()) {
-					businessService = registerBusinessService(serviceQName, (String) portName, serviceUrl, wsdlDefinition).getBusinessService();
-				}
-			}
-			if (businessService!=null) businessServices.getBusinessService().add(businessService);
-		}
-		
-		return businessServices;
-		
-	}
-	
-	@SuppressWarnings("unchecked")
-	public ServiceRegistrationResponse registerBusinessService(QName serviceQName, String portName, URL serviceUrl, Definition wsdlDefinition) throws RemoteException, ConfigurationException, TransportException, WSDLException {
-		
-		String genericWSDLURL  = wsdlDefinition.getDocumentBaseURI();   //TODO maybe point to repository version
-		ServiceRegistrationResponse response = new ServiceRegistrationResponse();
-		String serviceKey = UDDIKeyConvention.getServiceKey(properties, serviceQName.getLocalPart());
-		BusinessService businessService = lookupService(serviceKey);
-		if (businessService==null) {
-			List<TModel> tModels = new ArrayList<TModel>();
-			// Create the PortType tModels
-			Map<QName,PortType> portTypes = (Map<QName,PortType>) wsdlDefinition.getAllPortTypes();
-			tModels.addAll(createWSDLPortTypeTModels(genericWSDLURL, portTypes));
-			// Create the Binding tModels
-			Map<QName,Binding> bindings = (Map<QName,Binding>) wsdlDefinition.getAllBindings();
-			tModels.addAll(createWSDLBindingTModels(genericWSDLURL, bindings));
-			// Register these tModels
-		    for (TModel tModel : tModels) {
-				clerk.register(tModel);
-			}
-		    // Service
-		    businessService = createBusinessService(serviceQName, wsdlDefinition);
-		    // Register this Service
-		    clerk.register(businessService);
-		}
-		//Add the BindingTemplate to this Service
-		BindingTemplate binding = createWSDLBinding(serviceQName, portName, serviceUrl, wsdlDefinition);
-		// Register BindingTemplate
-		clerk.register(binding);
-		if (businessService.getBindingTemplates() == null) businessService.setBindingTemplates(new BindingTemplates());
-		businessService.getBindingTemplates().getBindingTemplate().add(binding);
-		response.setBindingKey(binding.getBindingKey());
-		response.setBusinessService(businessService);
-		return response;
-	}
-	
-	public String[] unRegisterBusinessServices(Definition wsdlDefinition) throws RemoteException, ConfigurationException, TransportException, MalformedURLException {
-		
-		String[] businessServices = new String[wsdlDefinition.getAllServices().size()];
-		int i=0;
-		for (Object serviceName : wsdlDefinition.getAllServices().keySet()) {
-			QName serviceQName = (QName) serviceName;
-			Service service = wsdlDefinition.getService(serviceQName);
-			//unregister service
-			URL serviceUrl = null;
-			if (service.getPorts()!=null && service.getPorts().size() > 0) {
-				for (Object portName : service.getPorts().keySet()) {
-					//construct the accessURL
-					serviceUrl = new URL(getBindingURL((Port) service.getPorts().get(portName)));
-					businessServices[i++] = unRegisterBusinessService(serviceQName, (String) portName, serviceUrl);
-				}
-			}
-		}
-		return businessServices;
-	}
-	
-	public String unRegisterBusinessService(QName serviceName, String portName, URL serviceUrl) throws RemoteException, ConfigurationException, TransportException {
-		
-		String serviceKey = UDDIKeyConvention.getServiceKey(properties, serviceName.getLocalPart());
-		BusinessService service = lookupService(serviceKey);
-		boolean isRemoveServiceIfNoTemplates = true; 
-		String bindingKey = UDDIKeyConvention.getBindingKey(properties, serviceName, portName, serviceUrl);
-		//check if this bindingKey is in the service's binding templates
-		for (BindingTemplate bindingTemplate : service.getBindingTemplates().getBindingTemplate()) {
-			if (bindingKey.equals(bindingTemplate.getBindingKey())) {
-				clerk.unRegisterBinding(bindingKey);
-				//if this is the last binding for this service, and 
-				if (service.getBindingTemplates().getBindingTemplate().size()==1 && isRemoveServiceIfNoTemplates) {
-					clerk.unRegisterService(serviceKey);
-					if (bindingTemplate.getTModelInstanceDetails()!=null 
-							&& bindingTemplate.getTModelInstanceDetails().getTModelInstanceInfo() != null) {
-						for (TModelInstanceInfo tModelInstanceInfo : bindingTemplate.getTModelInstanceDetails().getTModelInstanceInfo()) {
-							String tModelKey = tModelInstanceInfo.getTModelKey();
-							TModelDetail tModelDetail = clerk.getTModelDetail(tModelKey);
-							//delete all tModels assuming they are the portType and Binding tModels.
-							if (tModelDetail.getTModel()!=null && tModelDetail.getTModel().size()>0) {
-								for (TModel tModel : tModelDetail.getTModel()) {
-									clerk.unRegisterTModel(tModel.getTModelKey());
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return serviceKey;
-	}
-	
-	public String getKeyDomainURI() {
-		return keyDomainURI;
-	}
-	public void setKeyDomain(String keyDomainURI) {
-		this.keyDomainURI = keyDomainURI;
-	}
-	
-	public String getLang() {
-		return lang;
-	}
-
-	public void setLang(String lang) {
-		this.lang = lang;
-	}
-
-	/**
-	 * <h3>2.4.2 wsdl:binding -> uddi:tModel</h3>
-
-		<p>A wsdl:binding MUST be modeled as a uddi:tModel. The minimum information that must be captured about a binding is 
-		its entity type, its local name, 
-		its namespace, the location of the WSDL document that defines the binding, the portType that it implements, 
-		its protocol, and, optionally, the transport information. Capturing the entity type enables users 
-		to search for tModels that represent binding artifacts. Capturing the local name, namespace, 
-		and WSDL location enables users to locate the definition of the specified binding artifact. 
-		The link to the portType enables users to search for bindings that implement a particular portType.</p>
-		
-		<p>A wsdl:binding corresponds to a WSDL service interface definition as defined by the mapping in the 
-		Version 1 Best Practice. To maintain compatibility with the previous mapping, the binding must 
-		also be characterized as type "wsdlSpec".</p>
-		
-		<p>The wsdl:binding information is captured as follows:</p>
-		
-		<p>The uddi:name element of the tModel MUST be the value of the name attribute of the wsdl:binding.</p>
-		
-		<p>The tModel MUST contain a categoryBag, and the categoryBag MUST contain at least the following keyedReference elements:</p>
-		<ol>
-		   <li> A keyedReference with a tModelKey of the WSDL Entity Type category system and a keyValue of "binding".</li>
-		   <li> A keyedReference with a tModelKey of the WSDL portType Reference category system and a keyValue of the tModelKey that models the wsdl:portType to which the wsdl:binding relates.</li>
-		   <li> A keyedReference with a tModelKey of the UDDI Types category system and a keyValue of "wsdlSpec" for 
-		      backward compatibility[1].</li>
-		   <li> One or two keyedReferences as required to capture the protocol and optionally the transport 
-		      information refer to the next section.</li>
-		</ol>
-		
-		<p>If the wsdl:binding has a targetNamespace then the categoryBag MUST also contain an additional keyedReference 
-		with a tModelKey of the XML Namespace category system and a keyValue of the target namespace of the wsdl:definitions 
-		element that contains the wsdl:binding. If the targetNamespace is absent from the binding, a categoryBag MUST NOT 
-		contain a keyedReference to the XML Namespace category system.</p>
-		
-		<p>The tModel MUST contain an overviewDoc with an overviewURL containing the location of the WSDL document that 
-		describes the wsdl:binding.</p>
-
-		<h4>2.4.2.1      wsdl:binding Extensions</h4>
-		
-		<p>Information about the protocol and transport, if applicable, specified in an extension to the wsdl:binding 
-		is used to categorize the binding tModel as described in the following sections. This information is specified 
-		using two of the category systems defined in this Technical Note:</p>
-		<ol>
-		   <li> Protocol Categorization</li>
-		   <li> Transport Categorization</li>
-		</ol>
-		<p>The valid values for the Protocol Categorization category system are tModelKeys of tModels that 
-		are categorized as protocol tModels.  Similarly, the valid values for the Transport Categorization 
-		category system are tModelKeys of tModels that are categorized as transport tModels.</p>
-		<p>
-		The reason for having these two categorization schemes that take tModel keys as values is to allow other 
-		standard or proprietary protocols and transports to be defined and used in the same way as the standard 
-		SOAP and HTTP protocols and transport.</p>
-		
-		<h4>2.4.2.1.1               soap:binding</h4>
-		
-		<p>If the wsdl:binding contains a soap:binding extensibility element from the 
-		http://schemas.xmlsoap.org/wsdl/soap/ namespace then the categoryBag MUST include a keyedReference with
-		 a tModelKey of the Protocol Categorization category system and a keyValue of the tModelKey of the 
-		 SOAP Protocol tModel.</p>
-		
-		<p>If the value of the transport attribute of the soap:binding element is 
-		http://schemas.xmlsoap.org/soap/http then the categoryBag MUST include a keyedReference with a 
-		tModelKey of the Transport Categorization category system and a keyValue of the tModelKey of the 
-		HTTP Transport tModel.</p>
-		
-		<p>If the value of the transport attribute is anything else, then the bindingTemplate MUST include
-		 an additional keyedReference with a tModelKey of the Transport Categorization category system and 
-		 a keyValue of the tModelKey of an appropriate transport tModel.</p>
-		 
-		<h4>2.4.2.1.2               http:binding</h4>
-		
-		<p>If the wsdl:binding contains an http:binding extensibility element from the 
-		http://schemas.xmlsoap.org/wsdl/http/ namespace then the categoryBag MUST include a keyedReference 
-		with a tModelKey of the Protocol Categorization category system and a keyValue of the tModelKey 
-		of the HTTP Protocol tModel.</p>
-		
-		<p>Note that this is a different tModel from the HTTP Transport tModel, and in this case there is 
-		no separate transport tModel, and therefore no keyedReference in the categoryBag from the Transport 
-		Categorization category system.</p>
-		
-		<h4>2.4.2.1.3               Other wsdl:binding Extensions</h4>
-		
-		<p>Other wsdl:binding extensibility elements are handled in a similar fashion. It is assumed 
-		that vendors who provide other bindings will provide the appropriate protocol and transport tModels.</p>
-	
-	 * @param wsdlURL
-	 * @param binding Map
-	 * @return set of WSDL Binding tModels
-	 * @throws WSDLException
-	 */
-	protected Set<TModel> createWSDLBindingTModels(String wsdlURL, Map<QName,Binding> bindings) throws WSDLException 
-	{
-		
-		Set<TModel> tModels = new HashSet<TModel>();
-	    //Register a tModel for each portType
-	    for (QName qName : bindings.keySet()) {
-	    	String localpart = qName.getLocalPart();
-	    	String namespace = qName.getNamespaceURI();
-	    	// Build the tModel
-	    	TModel tModel = new TModel();
-	    	// Set the Key
-	    	tModel.setTModelKey(keyDomainURI + localpart);
-	    	// Set the Name
-	    	Name name = new Name();
-	    	name.setLang(lang);
-	    	name.setValue(localpart);
-	    	tModel.setName(name);
-	    	// Set the OverviewURL
-	    	OverviewURL overviewURL = new OverviewURL();
-	    	overviewURL.setUseType(AccessPointType.WSDL_DEPLOYMENT.toString());
-	    	overviewURL.setValue(wsdlURL);
-	    	OverviewDoc overviewDoc = new OverviewDoc();
-	    	overviewDoc.setOverviewURL(overviewURL);
-	    	tModel.getOverviewDoc().add(overviewDoc);
-	    	// Set the categoryBag
-	    	CategoryBag categoryBag = new CategoryBag();
-	    	
-	    	if (namespace!=null && !"".equals(namespace)) {
-	    		// A keyedReference with a tModelKey of the WSDL Entity Type category system and a keyValue of "binding".
-	    		KeyedReference namespaceReference = newKeyedReference(
-		    			"uddi:uddi.org:xml:namespace", "uddi-org:xml:namespace", namespace); 
-		    	categoryBag.getKeyedReference().add(namespaceReference);
-	    	}
-	    	
-	    	// A keyedReference with a tModelKey of the WSDL Entity Type category system and a keyValue of "binding".
-	    	KeyedReference typesReference = newKeyedReference(
-	    			"uddi:uddi.org:wsdl:types", "uddi-org:wsdl:types", "binding");
-	    	categoryBag.getKeyedReference().add(typesReference);
-	    	
-	    	// A keyedReference with a tModelKey of the WSDL portType Reference category system and a keyValue 
-	    	// of the tModelKey that models the wsdl:portType to which the wsdl:binding relates.
-	    	Binding binding = bindings.get(qName);
-	    	String portTypeKey = keyDomainURI + binding.getPortType().getQName().getLocalPart();
-	    	KeyedReference namespaceReference = newKeyedReference(
-	    			"uddi:uddi.org:wsdl:porttypereference", "uddi-org:wsdl:portTypeReference", 
-	    			portTypeKey); 
-	    	categoryBag.getKeyedReference().add(namespaceReference);
-	    	
-	    	//  A keyedReference with a tModelKey of the UDDI Types category system and a keyValue of 
-	    	// "wsdlSpec" for backward compatibility.
-	    	KeyedReference typesReferenceBackwardsCompatible = newKeyedReference(
-	    			"uddi:uddi.org:categorization:types", "uddi-org:types", "wsdlSpec");
-	    	categoryBag.getKeyedReference().add(typesReferenceBackwardsCompatible);
-	    	
-	    	// One or two keyedReferences as required to capture the protocol
-		    for (Object object : binding.getExtensibilityElements()) {
-				if (SOAPBinding.class.isAssignableFrom(object.getClass())) {
-					// If the wsdl:binding contains a soap:binding extensibility element from the 
-					// 'http://schemas.xmlsoap.org/wsdl/soap/' namespace then the categoryBag MUST 
-					//include a keyedReference with a tModelKey of the Protocol Categorization 
-					// category system and a keyValue of the tModelKey of the SOAP Protocol tModel.
-					SOAPBinding soapBinding = (SOAPBinding) object;
-					KeyedReference soapProtocol = newKeyedReference(
-			    			"uddi:uddi.org:wsdl:categorization:protocol", "uddi-org:protocol:soap", "uddi:uddi.org:protocol:soap");
-			    	categoryBag.getKeyedReference().add(soapProtocol);
-			    	// If the value of the transport attribute of the soap:binding element 
-					// is 'http://schemas.xmlsoap.org/soap/http' then the categoryBag MUST 
-					// include a keyedReference with a tModelKey of the Transport Categorization 
-					// category system and a keyValue of the tModelKey of the HTTP Transport tModel.
-					if ("http://schemas.xmlsoap.org/soap/http".equals(soapBinding.getTransportURI())) {
-				    	KeyedReference httpTransport = newKeyedReference(
-				    			"uddi:uddi.org:wsdl:categorization:transport", "uddi-org:http", "uddi:uddi.org:transport:http");
-				    	categoryBag.getKeyedReference().add(httpTransport);
-					} else if (soapBinding.getTransportURI()!=null) {
-						// TODO If the value of the transport attribute is anything else, 
-						// then the bindingTemplate MUST include an additional keyedReference with a tModelKey 
-						// of the Transport Categorization category system and a keyValue of the tModelKey of 
-						// an appropriate transport tModel.
-						log.warn("not implemented");
-					}
-					
- 					
-				} else if (object.getClass().isInstance(HTTPBinding.class)) {
-					
-					// If the wsdl:binding contains an http:binding extensibility element from the 
-					// http://schemas.xmlsoap.org/wsdl/http/ namespace then the categoryBag MUST 
-					// include a keyedReference with a tModelKey of the Protocol Categorization 
-					// category system and a keyValue of the tModelKey of the HTTP Protocol tModel.
-					KeyedReference soapProtocol = newKeyedReference(
-			    			"uddi:uddi.org:wsdl:categorization:protocol", "uddi-org:protocol:http", "uddi:uddi.org:protocol:http");
-			    	categoryBag.getKeyedReference().add(soapProtocol);
-				}
-			}
-	    	
-			
-	    	tModel.setCategoryBag(categoryBag);
-	    	tModels.add(tModel);
-	    }
-	    return tModels;
-	}
-	/**
-	 * <h3>2.4.1            wsdl:portType -> uddi:tModel</h3>
-
-		<p>A wsdl:portType MUST be modeled as a uddi:tModel.</p>
-
-		<p>The minimum information that must be captured about a portType is its entity type, 
-		its local name, its namespace, and the location of the WSDL document that defines the 
-		portType. Capturing the entity type enables users to search for tModels that represent 
-		portType artifacts. Capturing the local name, namespace, and WSDL location enables users 
-		to locate the definition of the specified portType artifact.</p>
-
-		<p>The wsdl:portType information is captured as follows:</p>
-
-		<p>The uddi:name element of the tModel MUST be the value of the name attribute of the 
-		wsdl:portType.</p>
-
-		<p>The tModel MUST contain a categoryBag, and the categoryBag MUST contain a keyedReference 
-		with a tModelKey of the WSDL Entity Type category system and a keyValue of "portType".</p>
-
-		<p>If the wsdl:portType has a targetNamespace then the categoryBag MUST also contain an 
-		additional keyedReference with a tModelKey of the XML Namespace category system and a 
-		keyValue of the target namespace of the wsdl:definitions element that contains the 
-		wsdl:portType. If the targetNamespace is absent from the portType, a categoryBag 
-		MUST NOT contain a keyedReference to the XML Namespace category system.</p>
-
-		<p>The tModel MUST contain an overviewDoc with an overviewURL containing the location 
-		of the WSDL document that describes the wsdl:portType.</p>
-
-	 * @param wsdlURL This is used to set the Overview URL
-	 * @param portType Map
-	 * @return set of WSDL PortType tModels 
-	 * @throws WSDLException
-	 */
-	public Set<TModel> createWSDLPortTypeTModels(String wsdlURL, Map<QName,PortType> portTypes) throws WSDLException 
-	{
-		Set<TModel> tModels = new HashSet<TModel>();
-	    // Create a tModel for each portType
-	    for (QName qName : portTypes.keySet()) {
-	    	// Build the tModel
-	    	TModel tModel = new TModel();
-	    	String localpart = qName.getLocalPart();
-	    	String namespace = qName.getNamespaceURI();
-	    	// Set the Key
-	    	tModel.setTModelKey(keyDomainURI + localpart);
-	    	// Set the Name. The uddi:name element of the tModel MUST be the value of
-	    	// the name attribute of the wsdl:portType.
-	    	Name name = new Name();
-	    	name.setLang(lang);
-	    	name.setValue(localpart);
-	    	tModel.setName(name);
-	    	// Set the OverviewURL. The tModel MUST contain an overviewDoc with an 
-	    	// overviewURL containing the location of the WSDL document that 
-	    	// describes the wsdl:portType.
-	    	OverviewURL overviewURL = new OverviewURL();
-	    	overviewURL.setUseType(AccessPointType.WSDL_DEPLOYMENT.toString());
-	    	overviewURL.setValue(wsdlURL);
-	    	OverviewDoc overviewDoc = new OverviewDoc();
-	    	overviewDoc.setOverviewURL(overviewURL);
-	    	tModel.getOverviewDoc().add(overviewDoc);
-	    	// Create the categoryBag, The tModel MUST contain a categoryBag
-	    	CategoryBag categoryBag = new CategoryBag();
-	    	
-	    	// the categoryBag MUST contain a keyedReference with a tModelKey of the WSDL 
-	    	// Entity Type category system and a keyValue of "portType".
-	    	KeyedReference typesReference = newKeyedReference(
-	    			"uddi:uddi.org:wsdl:types", "uddi-org:wsdl:types", "portType");
-	    	categoryBag.getKeyedReference().add(typesReference);
-	    	
-	    	// If the wsdl:portType has a targetNamespace then the categoryBag MUST also contain an 
-			// additional keyedReference with a tModelKey of the XML Namespace category system and a 
-			// keyValue of the target namespace of the wsdl:definitions element that contains the 
-			// wsdl:portType. If the targetNamespace is absent from the portType, a categoryBag 
-			// MUST NOT contain a keyedReference to the XML Namespace category system.
-	    	if (namespace!=null && !"".equals(namespace)) {
-		    	KeyedReference namespaceReference = newKeyedReference(
-		    			"uddi:uddi.org:xml:namespace", "uddi-org:xml:namespace", namespace); 
-		    	categoryBag.getKeyedReference().add(namespaceReference);
-	    	}
-	    	
-	    	tModel.setCategoryBag(categoryBag);
-	    	tModels.add(tModel);
-	    }
-	    return tModels;
-	}
-	
-	protected static KeyedReference newKeyedReference(String tModelKey, String keyName, String value) 
-	{
-		KeyedReference typesReference = new KeyedReference();
-    	typesReference.setTModelKey(tModelKey);
-    	typesReference.setKeyName(keyName);
-    	typesReference.setKeyValue(value);
-    	return typesReference;
-	}
-	
-	/** Builds a finder to find the binding tModels for a portType.
-     * 
+
+    private static Log log = LogFactory.getLog(WSDL2UDDI.class);
+    private String keyDomainURI;
+    private String businessKey;
+    private String lang;
+    private UDDIClerk clerk = null;
+    private Properties properties = null;
+    private URLLocalizer urlLocalizer;
+
+    /**
+     * Required Properties are: businessName, for example: 'Apache' nodeName,
+     * for example: 'uddi.example.org_80' keyDomain, for example:
+     * juddi.apache.org
+     *
+     * Optional Properties are: lang: for example: 'nl'
+     *
+     * @param clerk - can be null if register/unregister methods are not used.
+     * @param urlLocalizer - A reference to an custom
+     * @param properties
+     * @throws ConfigurationException
+     */
+    public WSDL2UDDI(UDDIClerk clerk, URLLocalizer urlLocalizer, Properties properties) throws ConfigurationException {
+        super();
+
+        this.clerk = clerk;
+        this.urlLocalizer = urlLocalizer;
+        this.properties = properties;
+
+        if (clerk != null) {
+            if (!properties.containsKey("keyDomain")) {
+                throw new ConfigurationException("Property keyDomain is a required property when using WSDL2UDDI.");
+            }
+            if (!properties.containsKey("businessKey") && !properties.containsKey("businessName")) {
+                throw new ConfigurationException("Either property businessKey, or businessName, is a required property when using WSDL2UDDI.");
+            }
+            if (!properties.containsKey("nodeName")) {
+                if (properties.containsKey("serverName") && properties.containsKey("serverPort")) {
+                    String nodeName = properties.getProperty("serverName") + "_" + properties.getProperty("serverPort");
+                    properties.setProperty("nodeName", nodeName);
+                } else {
+                    throw new ConfigurationException("Property nodeName is not defined and is a required property when using WSDL2UDDI.");
+                }
+            }
+        }
+
+        //Obtaining values from the properties
+        this.keyDomainURI = "uddi:" + properties.getProperty("keyDomain") + ":";
+        if (properties.contains(Property.BUSINESS_KEY)) {
+            this.businessKey = properties.getProperty(Property.BUSINESS_KEY);
+        } else {
+            //using the BusinessKey Template, and the businessName to construct the key 
+            this.businessKey = UDDIKeyConvention.getBusinessKey(properties);
+        }
+        this.lang = properties.getProperty(Property.LANG, Property.DEFAULT_LANG);
+    }
+
+    public BusinessServices registerBusinessServices(Definition wsdlDefinition) throws RemoteException, ConfigurationException, TransportException, WSDLException {
+
+        BusinessServices businessServices = new BusinessServices();
+
+        for (Object serviceName : wsdlDefinition.getAllServices().keySet()) {
+            QName serviceQName = (QName) serviceName;
+            Service service = wsdlDefinition.getService(serviceQName);
+            BusinessService businessService = null;
+            //add service
+            URL serviceUrl = null;
+            if (service.getPorts() != null && service.getPorts().size() > 0) {
+                for (Object portName : service.getPorts().keySet()) {
+                    businessService = registerBusinessService(serviceQName, (String) portName, serviceUrl, wsdlDefinition).getBusinessService();
+                }
+            }
+            if (businessService != null) {
+                businessServices.getBusinessService().add(businessService);
+            }
+        }
+
+        return businessServices;
+
+    }
+
+    @SuppressWarnings("unchecked")
+    public ServiceRegistrationResponse registerBusinessService(QName serviceQName, String portName, URL serviceUrl, Definition wsdlDefinition) throws RemoteException, ConfigurationException, TransportException, WSDLException {
+
+        String genericWSDLURL = wsdlDefinition.getDocumentBaseURI();   //TODO maybe point to repository version
+        ServiceRegistrationResponse response = new ServiceRegistrationResponse();
+        String serviceKey = UDDIKeyConvention.getServiceKey(properties, serviceQName.getLocalPart());
+        BusinessService businessService = lookupService(serviceKey);
+        if (businessService == null) {
+            List<TModel> tModels = new ArrayList<TModel>();
+            // Create the PortType tModels
+            Map<QName, PortType> portTypes = (Map<QName, PortType>) wsdlDefinition.getAllPortTypes();
+            tModels.addAll(createWSDLPortTypeTModels(genericWSDLURL, portTypes));
+            // Create the Binding tModels
+            Map<QName, Binding> bindings = (Map<QName, Binding>) wsdlDefinition.getAllBindings();
+            tModels.addAll(createWSDLBindingTModels(genericWSDLURL, bindings));
+            // Register these tModels
+            for (TModel tModel : tModels) {
+                clerk.register(tModel);
+            }
+            // Service
+            businessService = createBusinessService(serviceQName, wsdlDefinition);
+            // Register this Service
+            clerk.register(businessService);
+        }
+        //Add the BindingTemplate to this Service
+        BindingTemplate binding = createWSDLBinding(serviceQName, portName, serviceUrl, wsdlDefinition);
+        // Register BindingTemplate
+        clerk.register(binding);
+        if (businessService.getBindingTemplates() == null) {
+            businessService.setBindingTemplates(new BindingTemplates());
+        }
+        businessService.getBindingTemplates().getBindingTemplate().add(binding);
+        response.setBindingKey(binding.getBindingKey());
+        response.setBusinessService(businessService);
+        return response;
+    }
+
+    public String[] unRegisterBusinessServices(Definition wsdlDefinition) throws RemoteException, ConfigurationException, TransportException, MalformedURLException {
+
+        String[] businessServices = new String[wsdlDefinition.getAllServices().size()];
+        int i = 0;
+        for (Object serviceName : wsdlDefinition.getAllServices().keySet()) {
+            QName serviceQName = (QName) serviceName;
+            Service service = wsdlDefinition.getService(serviceQName);
+            //unregister service
+            URL serviceUrl = null;
+            if (service.getPorts() != null && service.getPorts().size() > 0) {
+                for (Object portName : service.getPorts().keySet()) {
+                    //construct the accessURL
+                    serviceUrl = new URL(getBindingURL((Port) service.getPorts().get(portName)));
+                    businessServices[i++] = unRegisterBusinessService(serviceQName, (String) portName, serviceUrl);
+                }
+            }
+        }
+        return businessServices;
+    }
+
+    public String unRegisterBusinessService(QName serviceName, String portName, URL serviceUrl) throws RemoteException, ConfigurationException, TransportException {
+
+        String serviceKey = UDDIKeyConvention.getServiceKey(properties, serviceName.getLocalPart());
+        BusinessService service = lookupService(serviceKey);
+        boolean isRemoveServiceIfNoTemplates = true;
+        String bindingKey = UDDIKeyConvention.getBindingKey(properties, serviceName, portName, serviceUrl);
+        //check if this bindingKey is in the service's binding templates
+        for (BindingTemplate bindingTemplate : service.getBindingTemplates().getBindingTemplate()) {
+            if (bindingKey.equals(bindingTemplate.getBindingKey())) {
+                clerk.unRegisterBinding(bindingKey);
+                //if this is the last binding for this service, and 
+                if (service.getBindingTemplates().getBindingTemplate().size() == 1 && isRemoveServiceIfNoTemplates) {
+                    clerk.unRegisterService(serviceKey);
+                    if (bindingTemplate.getTModelInstanceDetails() != null
+                            && bindingTemplate.getTModelInstanceDetails().getTModelInstanceInfo() != null) {
+                        for (TModelInstanceInfo tModelInstanceInfo : bindingTemplate.getTModelInstanceDetails().getTModelInstanceInfo()) {
+                            String tModelKey = tModelInstanceInfo.getTModelKey();
+                            TModelDetail tModelDetail = clerk.getTModelDetail(tModelKey);
+                            //delete all tModels assuming they are the portType and Binding tModels.
+                            if (tModelDetail.getTModel() != null && tModelDetail.getTModel().size() > 0) {
+                                for (TModel tModel : tModelDetail.getTModel()) {
+                                    clerk.unRegisterTModel(tModel.getTModelKey());
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return serviceKey;
+    }
+
+    public String getKeyDomainURI() {
+        return keyDomainURI;
+    }
+
+    public void setKeyDomain(String keyDomainURI) {
+        this.keyDomainURI = keyDomainURI;
+    }
+
+    public String getLang() {
+        return lang;
+    }
+
+    public void setLang(String lang) {
+        this.lang = lang;
+    }
+
+    /**
+     * <h3>2.4.2 wsdl:binding -> uddi:tModel</h3>
+     *
+     * <p>A wsdl:binding MUST be modeled as a uddi:tModel. The minimum
+     * information that must be captured about a binding is its entity type, its
+     * local name, its namespace, the location of the WSDL document that defines
+     * the binding, the portType that it implements, its protocol, and,
+     * optionally, the transport information. Capturing the entity type enables
+     * users to search for tModels that represent binding artifacts. Capturing
+     * the local name, namespace, and WSDL location enables users to locate the
+     * definition of the specified binding artifact. The link to the portType
+     * enables users to search for bindings that implement a particular
+     * portType.</p>
+     *
+     * <p>A wsdl:binding corresponds to a WSDL service interface definition as
+     * defined by the mapping in the Version 1 Best Practice. To maintain
+     * compatibility with the previous mapping, the binding must also be
+     * characterized as type "wsdlSpec".</p>
+     *
+     * <p>The wsdl:binding information is captured as follows:</p>
+     *
+     * <p>The uddi:name element of the tModel MUST be the value of the name
+     * attribute of the wsdl:binding.</p>
+     *
+     * <p>The tModel MUST contain a categoryBag, and the categoryBag MUST
+     * contain at least the following keyedReference elements:</p> <ol> <li> A
+     * keyedReference with a tModelKey of the WSDL Entity Type category system
+     * and a keyValue of "binding".</li> <li> A keyedReference with a tModelKey
+     * of the WSDL portType Reference category system and a keyValue of the
+     * tModelKey that models the wsdl:portType to which the wsdl:binding
+     * relates.</li> <li> A keyedReference with a tModelKey of the UDDI Types
+     * category system and a keyValue of "wsdlSpec" for backward
+     * compatibility[1].</li> <li> One or two keyedReferences as required to
+     * capture the protocol and optionally the transport information refer to
+     * the next section.</li> </ol>
+     *
+     * <p>If the wsdl:binding has a targetNamespace then the categoryBag MUST
+     * also contain an additional keyedReference with a tModelKey of the XML
+     * Namespace category system and a keyValue of the target namespace of the
+     * wsdl:definitions element that contains the wsdl:binding. If the
+     * targetNamespace is absent from the binding, a categoryBag MUST NOT
+     * contain a keyedReference to the XML Namespace category system.</p>
+     *
+     * <p>The tModel MUST contain an overviewDoc with an overviewURL containing
+     * the location of the WSDL document that describes the wsdl:binding.</p>
+     *
+     * <h4>2.4.2.1 wsdl:binding Extensions</h4>
+     *
+     * <p>Information about the protocol and transport, if applicable, specified
+     * in an extension to the wsdl:binding is used to categorize the binding
+     * tModel as described in the following sections. This information is
+     * specified using two of the category systems defined in this Technical
+     * Note:</p> <ol> <li> Protocol Categorization</li> <li> Transport
+     * Categorization</li> </ol> <p>The valid values for the Protocol
+     * Categorization category system are tModelKeys of tModels that are
+     * categorized as protocol tModels. Similarly, the valid values for the
+     * Transport Categorization category system are tModelKeys of tModels that
+     * are categorized as transport tModels.</p> <p> The reason for having these
+     * two categorization schemes that take tModel keys as values is to allow
+     * other standard or proprietary protocols and transports to be defined and
+     * used in the same way as the standard SOAP and HTTP protocols and
+     * transport.</p>
+     *
+     * <h4>2.4.2.1.1 soap:binding</h4>
+     *
+     * <p>If the wsdl:binding contains a soap:binding extensibility element from
+     * the http://schemas.xmlsoap.org/wsdl/soap/ namespace then the categoryBag
+     * MUST include a keyedReference with a tModelKey of the Protocol
+     * Categorization category system and a keyValue of the tModelKey of the
+     * SOAP Protocol tModel.</p>
+     *
+     * <p>If the value of the transport attribute of the soap:binding element is
+     * http://schemas.xmlsoap.org/soap/http then the categoryBag MUST include a
+     * keyedReference with a tModelKey of the Transport Categorization category
+     * system and a keyValue of the tModelKey of the HTTP Transport tModel.</p>
+     *
+     * <p>If the value of the transport attribute is anything else, then the
+     * bindingTemplate MUST include an additional keyedReference with a
+     * tModelKey of the Transport Categorization category system and a keyValue
+     * of the tModelKey of an appropriate transport tModel.</p>
+     *
+     * <h4>2.4.2.1.2 http:binding</h4>
+     *
+     * <p>If the wsdl:binding contains an http:binding extensibility element
+     * from the http://schemas.xmlsoap.org/wsdl/http/ namespace then the
+     * categoryBag MUST include a keyedReference with a tModelKey of the
+     * Protocol Categorization category system and a keyValue of the tModelKey
+     * of the HTTP Protocol tModel.</p>
+     *
+     * <p>Note that this is a different tModel from the HTTP Transport tModel,
+     * and in this case there is no separate transport tModel, and therefore no
+     * keyedReference in the categoryBag from the Transport Categorization
+     * category system.</p>
+     *
+     * <h4>2.4.2.1.3 Other wsdl:binding Extensions</h4>
+     *
+     * <p>Other wsdl:binding extensibility elements are handled in a similar
+     * fashion. It is assumed that vendors who provide other bindings will
+     * provide the appropriate protocol and transport tModels.</p>
+     *
+     * Example Code
+     * <pre>
+     * URL url = new URL("http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl");
+     * String domain = url.getHost();
+     * ReadWSDL rw = new ReadWSDL();
+     * Definition wsdlDefinition = rw.readWSDL(url);
+     * properties.put("keyDomain", domain);
+     * properties.put("businessName", domain);
+     * properties.put("serverName", url.getHost());
+     * properties.put("serverPort", url.getPort());
+     * wsdlURL = wsdlDefinition.getDocumentBaseURI();
+     * WSDL2UDDI wsdl2UDDI = new WSDL2UDDI(null, new URLLocalizerDefaultImpl(), properties);
+     * Map allBindings = wsdlDefinition.getAllBindings();
+     * Set<TModel> createWSDLBindingTModels = wsdl2UDDI.createWSDLBindingTModels(url.toString(), allBindings);
+     * </pre>
+     * @param wsdlURL
+     * @param binding Map
+     * @return set of WSDL Binding tModels
+     * @throws WSDLException
+     */
+    public Set<TModel> createWSDLBindingTModels(String wsdlURL, Map<QName, Binding> bindings) throws WSDLException {
+
+        Set<TModel> tModels = new HashSet<TModel>();
+        //Register a tModel for each portType
+        for (QName qName : bindings.keySet()) {
+            String localpart = qName.getLocalPart();
+            String namespace = qName.getNamespaceURI();
+            // Build the tModel
+            TModel tModel = new TModel();
+            // Set the Key
+            tModel.setTModelKey(keyDomainURI + localpart);
+            // Set the Name
+            Name name = new Name();
+            name.setLang(lang);
+            name.setValue(localpart);
+            tModel.setName(name);
+            // Set the OverviewURL
+            OverviewURL overviewURL = new OverviewURL();
+            overviewURL.setUseType(AccessPointType.WSDL_DEPLOYMENT.toString());
+            overviewURL.setValue(wsdlURL);
+            OverviewDoc overviewDoc = new OverviewDoc();
+            overviewDoc.setOverviewURL(overviewURL);
+            tModel.getOverviewDoc().add(overviewDoc);
+            // Set the categoryBag
+            CategoryBag categoryBag = new CategoryBag();
+
+            if (namespace != null && !"".equals(namespace)) {
+                // A keyedReference with a tModelKey of the WSDL Entity Type category system and a keyValue of "binding".
+                KeyedReference namespaceReference = newKeyedReference(
+                        "uddi:uddi.org:xml:namespace", "uddi-org:xml:namespace", namespace);
+                categoryBag.getKeyedReference().add(namespaceReference);
+            }
+
+            // A keyedReference with a tModelKey of the WSDL Entity Type category system and a keyValue of "binding".
+            KeyedReference typesReference = newKeyedReference(
+                    "uddi:uddi.org:wsdl:types", "uddi-org:wsdl:types", "binding");
+            categoryBag.getKeyedReference().add(typesReference);
+
+            // A keyedReference with a tModelKey of the WSDL portType Reference category system and a keyValue 
+            // of the tModelKey that models the wsdl:portType to which the wsdl:binding relates.
+            Binding binding = bindings.get(qName);
+            String portTypeKey = keyDomainURI + binding.getPortType().getQName().getLocalPart();
+            KeyedReference namespaceReference = newKeyedReference(
+                    "uddi:uddi.org:wsdl:porttypereference", "uddi-org:wsdl:portTypeReference",
+                    portTypeKey);
+            categoryBag.getKeyedReference().add(namespaceReference);
+
+            //  A keyedReference with a tModelKey of the UDDI Types category system and a keyValue of 
+            // "wsdlSpec" for backward compatibility.
+            KeyedReference typesReferenceBackwardsCompatible = newKeyedReference(
+                    "uddi:uddi.org:categorization:types", "uddi-org:types", "wsdlSpec");
+            categoryBag.getKeyedReference().add(typesReferenceBackwardsCompatible);
+
+            // One or two keyedReferences as required to capture the protocol
+            for (Object object : binding.getExtensibilityElements()) {
+                if (SOAPBinding.class.isAssignableFrom(object.getClass())) {
+                    // If the wsdl:binding contains a soap:binding extensibility element from the 
+                    // 'http://schemas.xmlsoap.org/wsdl/soap/' namespace then the categoryBag MUST 
+                    //include a keyedReference with a tModelKey of the Protocol Categorization 
+                    // category system and a keyValue of the tModelKey of the SOAP Protocol tModel.
+                    SOAPBinding soapBinding = (SOAPBinding) object;
+                    KeyedReference soapProtocol = newKeyedReference(
+                            "uddi:uddi.org:wsdl:categorization:protocol", "uddi-org:protocol:soap", "uddi:uddi.org:protocol:soap");
+                    categoryBag.getKeyedReference().add(soapProtocol);
+                    // If the value of the transport attribute of the soap:binding element 
+                    // is 'http://schemas.xmlsoap.org/soap/http' then the categoryBag MUST 
+                    // include a keyedReference with a tModelKey of the Transport Categorization 
+                    // category system and a keyValue of the tModelKey of the HTTP Transport tModel.
+                    if ("http://schemas.xmlsoap.org/soap/http".equals(soapBinding.getTransportURI())) {
+                        KeyedReference httpTransport = newKeyedReference(
+                                "uddi:uddi.org:wsdl:categorization:transport", "uddi-org:http", "uddi:uddi.org:transport:http");
+                        categoryBag.getKeyedReference().add(httpTransport);
+                    } else if (soapBinding.getTransportURI() != null) {
+                        // TODO If the value of the transport attribute is anything else, 
+                        // then the bindingTemplate MUST include an additional keyedReference with a tModelKey 
+                        // of the Transport Categorization category system and a keyValue of the tModelKey of 
+                        // an appropriate transport tModel.
+                        log.warn("not implemented");
+                    }
+
+
+                } else if (object.getClass().isInstance(HTTPBinding.class)) {
+
+                    // If the wsdl:binding contains an http:binding extensibility element from the 
+                    // http://schemas.xmlsoap.org/wsdl/http/ namespace then the categoryBag MUST 
+                    // include a keyedReference with a tModelKey of the Protocol Categorization 
+                    // category system and a keyValue of the tModelKey of the HTTP Protocol tModel.
+                    KeyedReference soapProtocol = newKeyedReference(
+                            "uddi:uddi.org:wsdl:categorization:protocol", "uddi-org:protocol:http", "uddi:uddi.org:protocol:http");
+                    categoryBag.getKeyedReference().add(soapProtocol);
+                }
+            }
+
+
+            tModel.setCategoryBag(categoryBag);
+            tModels.add(tModel);
+        }
+        return tModels;
+    }
+
+    /**
+     * <h3>2.4.1 wsdl:portType -> uddi:tModel</h3>
+     *
+     * <p>A wsdl:portType MUST be modeled as a uddi:tModel.</p>
+     *
+     * <p>The minimum information that must be captured about a portType is its
+     * entity type, its local name, its namespace, and the location of the WSDL
+     * document that defines the portType. Capturing the entity type enables
+     * users to search for tModels that represent portType artifacts. Capturing
+     * the local name, namespace, and WSDL location enables users to locate the
+     * definition of the specified portType artifact.</p>
+     *
+     * <p>The wsdl:portType information is captured as follows:</p>
+     *
+     * <p>The uddi:name element of the tModel MUST be the value of the name
+     * attribute of the wsdl:portType.</p>
+     *
+     * <p>The tModel MUST contain a categoryBag, and the categoryBag MUST
+     * contain a keyedReference with a tModelKey of the WSDL Entity Type
+     * category system and a keyValue of "portType".</p>
+     *
+     * <p>If the wsdl:portType has a targetNamespace then the categoryBag MUST
+     * also contain an additional keyedReference with a tModelKey of the XML
+     * Namespace category system and a keyValue of the target namespace of the
+     * wsdl:definitions element that contains the wsdl:portType. If the
+     * targetNamespace is absent from the portType, a categoryBag MUST NOT
+     * contain a keyedReference to the XML Namespace category system.</p>
+     *
+     * <p>The tModel MUST contain an overviewDoc with an overviewURL containing
+     * the location of the WSDL document that describes the wsdl:portType.</p>
+     * Example Code
+     * <pre>
+     * URL url = new URL("http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl");
+     * String domain = url.getHost();
+     * ReadWSDL rw = new ReadWSDL();
+     * Definition wsdlDefinition = rw.readWSDL(url);
+     * properties.put("keyDomain", domain);
+     * properties.put("businessName", domain);
+     * properties.put("serverName", url.getHost());
+     * properties.put("serverPort", url.getPort());
+     * wsdlURL = wsdlDefinition.getDocumentBaseURI();
+     * WSDL2UDDI wsdl2UDDI = new WSDL2UDDI(null, new URLLocalizerDefaultImpl(), properties);
+     * Map<QName, PortType> portTypes = (Map<QName, PortType>) wsdlDefinition.getAllPortTypes();
+     * Set<TModel> portTypeTModels = wsdl2UDDI.createWSDLPortTypeTModels(wsdlURL, portTypes);
+     * </pre>
+     *
+     * @param wsdlURL This is used to set the Overview URL
+     * @param portType Map
+     * @return set of WSDL PortType tModels
+     * @throws WSDLException
+     */
+    public Set<TModel> createWSDLPortTypeTModels(String wsdlURL, Map<QName, PortType> portTypes) throws WSDLException {
+        Set<TModel> tModels = new HashSet<TModel>();
+        // Create a tModel for each portType
+        for (QName qName : portTypes.keySet()) {
+            // Build the tModel
+            TModel tModel = new TModel();
+            String localpart = qName.getLocalPart();
+            String namespace = qName.getNamespaceURI();
+            // Set the Key
+            tModel.setTModelKey(keyDomainURI + localpart);
+            // Set the Name. The uddi:name element of the tModel MUST be the value of
+            // the name attribute of the wsdl:portType.
+            Name name = new Name();
+            name.setLang(lang);
+            name.setValue(localpart);
+            tModel.setName(name);
+            // Set the OverviewURL. The tModel MUST contain an overviewDoc with an 
+            // overviewURL containing the location of the WSDL document that 
+            // describes the wsdl:portType.
+            OverviewURL overviewURL = new OverviewURL();
+            overviewURL.setUseType(AccessPointType.WSDL_DEPLOYMENT.toString());
+            overviewURL.setValue(wsdlURL);
+            OverviewDoc overviewDoc = new OverviewDoc();
+            overviewDoc.setOverviewURL(overviewURL);
+            tModel.getOverviewDoc().add(overviewDoc);
+            // Create the categoryBag, The tModel MUST contain a categoryBag
+            CategoryBag categoryBag = new CategoryBag();
+
+            // the categoryBag MUST contain a keyedReference with a tModelKey of the WSDL 
+            // Entity Type category system and a keyValue of "portType".
+            KeyedReference typesReference = newKeyedReference(
+                    "uddi:uddi.org:wsdl:types", "uddi-org:wsdl:types", "portType");
+            categoryBag.getKeyedReference().add(typesReference);
+
+            // If the wsdl:portType has a targetNamespace then the categoryBag MUST also contain an 
+            // additional keyedReference with a tModelKey of the XML Namespace category system and a 
+            // keyValue of the target namespace of the wsdl:definitions element that contains the 
+            // wsdl:portType. If the targetNamespace is absent from the portType, a categoryBag 
+            // MUST NOT contain a keyedReference to the XML Namespace category system.
+            if (namespace != null && !"".equals(namespace)) {
+                KeyedReference namespaceReference = newKeyedReference(
+                        "uddi:uddi.org:xml:namespace", "uddi-org:xml:namespace", namespace);
+                categoryBag.getKeyedReference().add(namespaceReference);
+            }
+
+            tModel.setCategoryBag(categoryBag);
+            tModels.add(tModel);
+        }
+        return tModels;
+    }
+
+    protected static KeyedReference newKeyedReference(String tModelKey, String keyName, String value) {
+        KeyedReference typesReference = new KeyedReference();
+        typesReference.setTModelKey(tModelKey);
+        typesReference.setKeyName(keyName);
+        typesReference.setKeyValue(value);
+        return typesReference;
+    }
+
+    /**
+     * Builds a finder to find the binding tModels for a portType.
+     *
      * @param processName
      * @return
      */
-    public static FindTModel createFindBindingTModelForPortType (String portType, String namespace) {
-    	
-    	FindTModel findTModel = new FindTModel();
-    	CategoryBag categoryBag = new CategoryBag();
-    
-    	if (namespace!=null && namespace.length()!=0) {
-    		KeyedReference namespaceReference = newKeyedReference(
-    			"uddi:uddi.org:xml:namespace", "uddi-org:xml:namespace", namespace);
-    		categoryBag.getKeyedReference().add(namespaceReference);
-    	}
-    	KeyedReference bindingReference = newKeyedReference(
-    			"uddi:uddi.org:wsdl:types", "uddi-org:wsdl:types", "binding");
-    	categoryBag.getKeyedReference().add(bindingReference);
-    	
-    	KeyedReference portTypeReference = newKeyedReference(
-    			"uddi:uddi.org:wsdl:porttypereference", "uddi-org:wsdl:portTypeReference", portType);
-    	categoryBag.getKeyedReference().add(portTypeReference);
-    	
-    	findTModel.setCategoryBag(categoryBag);
-    	
-    	if (log.isDebugEnabled()) {
-    		log.debug(new PrintUDDI<FindTModel>().print(findTModel));
-    	}
-    	return findTModel;
-    }
-    
-	/** Builds a finder to find the portType tModels for a portType.
-     * 
+    public static FindTModel createFindBindingTModelForPortType(String portType, String namespace) {
+
+        FindTModel findTModel = new FindTModel();
+        CategoryBag categoryBag = new CategoryBag();
+
+        if (namespace != null && namespace.length() != 0) {
+            KeyedReference namespaceReference = newKeyedReference(
+                    "uddi:uddi.org:xml:namespace", "uddi-org:xml:namespace", namespace);
+            categoryBag.getKeyedReference().add(namespaceReference);
+        }
+        KeyedReference bindingReference = newKeyedReference(
+                "uddi:uddi.org:wsdl:types", "uddi-org:wsdl:types", "binding");
+        categoryBag.getKeyedReference().add(bindingReference);
+
+        KeyedReference portTypeReference = newKeyedReference(
+                "uddi:uddi.org:wsdl:porttypereference", "uddi-org:wsdl:portTypeReference", portType);
+        categoryBag.getKeyedReference().add(portTypeReference);
+
+        findTModel.setCategoryBag(categoryBag);
+
+        if (log.isDebugEnabled()) {
+            log.debug(new PrintUDDI<FindTModel>().print(findTModel));
+        }
+        return findTModel;
+    }
+
+    /**
+     * Builds a finder to find the portType tModels for a portType.
+     *
      * @param processName
      * @return
      */
-    public static FindTModel createFindPortTypeTModelForPortType (String portTypeName, String namespace) {
-    	
-    	FindTModel findTModel = new FindTModel();
-    	Name name = new Name();
-    	name.setLang("en");
-    	name.setValue(portTypeName);
-    	findTModel.setName(name);
-    	
-    	CategoryBag categoryBag = new CategoryBag();
-    	if (namespace!=null && namespace.length()!=0) {
-    		KeyedReference namespaceReference = newKeyedReference(
-    			"uddi:uddi.org:xml:namespace", "uddi-org:xml:namespace", namespace);
-    		categoryBag.getKeyedReference().add(namespaceReference);
-    	}
-    	KeyedReference bindingReference = newKeyedReference(
-    			"uddi:uddi.org:wsdl:types", "uddi-org:wsdl:types", "portType");
-    	categoryBag.getKeyedReference().add(bindingReference);
-    	
-    	findTModel.setCategoryBag(categoryBag);
-    	
-    	if (log.isDebugEnabled()) {
-    		log.debug(new PrintUDDI<FindTModel>().print(findTModel));
-    	}
-    	return findTModel;
+    public static FindTModel createFindPortTypeTModelForPortType(String portTypeName, String namespace) {
+
+        FindTModel findTModel = new FindTModel();
+        Name name = new Name();
+        name.setLang("en");
+        name.setValue(portTypeName);
+        findTModel.setName(name);
+
+        CategoryBag categoryBag = new CategoryBag();
+        if (namespace != null && namespace.length() != 0) {
+            KeyedReference namespaceReference = newKeyedReference(
+                    "uddi:uddi.org:xml:namespace", "uddi-org:xml:namespace", namespace);
+            categoryBag.getKeyedReference().add(namespaceReference);
+        }
+        KeyedReference bindingReference = newKeyedReference(
+                "uddi:uddi.org:wsdl:types", "uddi-org:wsdl:types", "portType");
+        categoryBag.getKeyedReference().add(bindingReference);
+
+        findTModel.setCategoryBag(categoryBag);
+
+        if (log.isDebugEnabled()) {
+            log.debug(new PrintUDDI<FindTModel>().print(findTModel));
+        }
+        return findTModel;
     }
-    
+
     /**
-	 * Perform a lookup by serviceKey, and will return null if not found.
-	 * @param serviceKey
-	 * @return
-	 * @throws RemoteException
-	 * @throws ConfigurationException
-	 * @throws TransportException
-	 */
+     * Perform a lookup by serviceKey, and will return null if not found.
+     *
+     * @param serviceKey
+     * @return
+     * @throws RemoteException
+     * @throws ConfigurationException
+     * @throws TransportException
+     */
     private BusinessService lookupService(String serviceKey) throws RemoteException, ConfigurationException, TransportException {
-		
-		//Checking if this serviceKey already exist
-		BusinessService service = clerk.findService(serviceKey);
-		return service;
-	}
-	
+
+        //Checking if this serviceKey already exist
+        BusinessService service = clerk.findService(serviceKey);
+        return service;
+    }
+
+    /**
+     * Creates a business service based off of a WSDL definition<Br>No changes are made to the UDDI
+     * endpoints using this method
+     *<br>
+     * Example Code:
+     * <pre>
+     * URL url = new URL("http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl");
+     * String domain = url.getHost();
+     * ReadWSDL rw = new ReadWSDL();
+     * Definition wsdlDefinition = rw.readWSDL(url);
+     * properties.put("keyDomain", domain);
+     * properties.put("businessName", domain);
+     * properties.put("serverName", url.getHost());
+     * properties.put("serverPort", url.getPort());
+     * wsdlURL = wsdlDefinition.getDocumentBaseURI();
+     * WSDL2UDDI wsdl2UDDI = new WSDL2UDDI(null, new URLLocalizerDefaultImpl(), properties);
+     * BusinessServices businessServices = wsdl2UDDI.createBusinessServices(wsdlDefinition);
+     * </pre>
+     * @param wsdlDefinition must not be null
+     * @return a business service
+     * @throws IllegalArgumentException if the wsdlDefinition is null
+     */
     public BusinessServices createBusinessServices(Definition wsdlDefinition) {
-		BusinessServices businessServices = new BusinessServices();
-		for (Object serviceName : wsdlDefinition.getAllServices().keySet()) {
-			QName serviceQName = (QName) serviceName;
-			Service service = wsdlDefinition.getService(serviceQName);
-			BusinessService businessService = createBusinessService(serviceQName, wsdlDefinition);
-			//service.getExtensibilityElements().
-			//add the bindingTemplates
-			URL serviceUrl = null;
-			if (service.getPorts()!=null && service.getPorts().size()>0) {
-				businessService.setBindingTemplates(new BindingTemplates());
-				for (Object portName : service.getPorts().keySet()) {
-					BindingTemplate bindingTemplate = createWSDLBinding(serviceQName, (String) portName, serviceUrl, wsdlDefinition);
-					businessService.getBindingTemplates().getBindingTemplate().add(bindingTemplate);
-				}
-			}
-			businessServices.getBusinessService().add(businessService);
-		}
-		
-		return businessServices;
-	}
-	/**
-	 * Creates a UDDI Business Service.
-	 * 
-	 * @param serviceName
-	 * @param wsldDefinition
-	 * @return
-	 */
+        if (wsdlDefinition == null) {
+            throw new IllegalArgumentException();
+        }
+        BusinessServices businessServices = new BusinessServices();
+        for (Object serviceName : wsdlDefinition.getAllServices().keySet()) {
+            QName serviceQName = (QName) serviceName;
+            Service service = wsdlDefinition.getService(serviceQName);
+            BusinessService businessService = createBusinessService(serviceQName, wsdlDefinition);
+            //service.getExtensibilityElements().
+            //add the bindingTemplates
+            URL serviceUrl = null;
+            if (service.getPorts() != null && service.getPorts().size() > 0) {
+                businessService.setBindingTemplates(new BindingTemplates());
+                for (Object portName : service.getPorts().keySet()) {
+                    BindingTemplate bindingTemplate = createWSDLBinding(serviceQName, (String) portName, serviceUrl, wsdlDefinition);
+                    businessService.getBindingTemplates().getBindingTemplate().add(bindingTemplate);
+                }
+            }
+            businessServices.getBusinessService().add(businessService);
+        }
+
+        return businessServices;
+    }
+
+    /**
+     * Creates a UDDI Business Service.
+     *
+     * @param serviceName
+     * @param wsldDefinition
+     * @return
+     */
     protected BusinessService createBusinessService(QName serviceQName, Definition wsdlDefinition) {
-		
-		log.debug("Constructing Service UDDI Information for " + serviceQName);
-		BusinessService service = new BusinessService();
-		// BusinessKey
-		service.setBusinessKey(businessKey);
-		// ServiceKey
-		service.setServiceKey(UDDIKeyConvention.getServiceKey(properties, serviceQName.getLocalPart()));
-		// Description
-		String serviceDescription = properties.getProperty(Property.SERVICE_DESCRIPTION, Property.DEFAULT_SERVICE_DESCRIPTION);
-		// Override with the service description from the WSDL if present
-		if (wsdlDefinition.getService(serviceQName) !=null) {
-			Element docElement = wsdlDefinition.getService(serviceQName).getDocumentationElement();
-			if (docElement!=null && docElement.getTextContent()!=null) {
-				serviceDescription = docElement.getTextContent();
-			}
-		}
-		Description description = new Description();
-		description.setLang(lang);
-		description.setValue(serviceDescription);
-		service.getDescription().add(description);
-		// Service name
-		Name sName = new Name();
-		sName.setLang(lang);
-		sName.setValue(serviceQName.getLocalPart());
-		service.getName().add(sName);
-		
-		CategoryBag categoryBag = new CategoryBag();
-		
-		String namespace = serviceQName.getNamespaceURI();
-		if (namespace!=null && namespace!="") {
-    		KeyedReference namespaceReference = newKeyedReference(
-    			"uddi:uddi.org:xml:namespace", "uddi-org:xml:namespace", namespace);
-    		categoryBag.getKeyedReference().add(namespaceReference);
-    	}
-		
-		KeyedReference serviceReference = newKeyedReference(
-    			"uddi:uddi.org:wsdl:types", "uddi-org:wsdl:types", "service");
-    	categoryBag.getKeyedReference().add(serviceReference);
-    	
-    	KeyedReference localNameReference = newKeyedReference(
-    			"uddi:uddi.org:xml:localname", "uddi-org:xml:localName", serviceQName.getLocalPart());
-    	categoryBag.getKeyedReference().add(localNameReference);
-    	
-		service.setCategoryBag(categoryBag);
-    	
-		return service;
-	}
-	
-	protected BindingTemplate createWSDLBinding(QName serviceQName, String portName, URL serviceUrl, Definition wsdlDefinition) {
-			
-    	BindingTemplate bindingTemplate = new BindingTemplate();
-		// Set BusinessService Key
-		bindingTemplate.setServiceKey(UDDIKeyConvention.getServiceKey(properties, serviceQName.getLocalPart()));
-		
-		if (serviceUrl!=null) {
-			// Set AccessPoint
-			AccessPoint accessPoint = new AccessPoint();
-			accessPoint.setUseType(AccessPointType.END_POINT.toString());
-			accessPoint.setValue(urlLocalizer.rewrite(serviceUrl));
-			bindingTemplate.setAccessPoint(accessPoint);
-			// Set Binding Key
-			String bindingKey = UDDIKeyConvention.getBindingKey(properties, serviceQName, portName, serviceUrl);
-			bindingTemplate.setBindingKey(bindingKey);
-		}
-		
-		Service service =  wsdlDefinition.getService(serviceQName);
-		if (service!=null) {
-			TModelInstanceDetails tModelInstanceDetails = new TModelInstanceDetails();
-			
-			Port port = service.getPort(portName);
-			if (port!=null) {
-				if (serviceUrl==null) {
-					for (Object element: port.getExtensibilityElements()) {
-						if (element instanceof SOAPAddress) {
-							SOAPAddress address = (SOAPAddress) element;
-							URL locationURI;
-							try {
-								locationURI = new URL(address.getLocationURI());
-								if (locationURI!=null) {
-									AccessPoint accessPoint = new AccessPoint();
-									accessPoint.setUseType(AccessPointType.END_POINT.toString());
-									accessPoint.setValue(urlLocalizer.rewrite(locationURI));
-									bindingTemplate.setAccessPoint(accessPoint);
-									// Set Binding Key
-									String bindingKey = UDDIKeyConvention.getBindingKey(properties, serviceQName, portName, locationURI);
-									bindingTemplate.setBindingKey(bindingKey);
-								}
-								break;
-							} catch (MalformedURLException e) {
-								log.error(e.getMessage());
-							}
-						}
-					}
-					
-				}
-				Binding binding = port.getBinding();
-				// Set the Binding Description
-				String bindingDescription = properties.getProperty(Property.BINDING_DESCRIPTION, Property.DEFAULT_BINDING_DESCRIPTION);
-				// Override with the service description from the WSDL if present
-				Element docElement = binding.getDocumentationElement();
-				if (docElement!=null && docElement.getTextContent()!=null) {
-					bindingDescription = docElement.getTextContent();
-				}
-				Description description = new Description();
-				description.setLang(lang);
-				description.setValue(bindingDescription);
-				bindingTemplate.getDescription().add(description);
-				
-				// reference wsdl:binding tModel
-				TModelInstanceInfo tModelInstanceInfoBinding = new TModelInstanceInfo();
-				tModelInstanceInfoBinding.setTModelKey(keyDomainURI + binding.getQName().getLocalPart());
-				InstanceDetails instanceDetails = new InstanceDetails();
-				instanceDetails.setInstanceParms(portName);  
-				tModelInstanceInfoBinding.setInstanceDetails(instanceDetails);
-				Description descriptionB = new Description();
-				descriptionB.setLang(lang);
-				descriptionB.setValue("The wsdl:binding that this wsdl:port implements. " + bindingDescription +
-						" The instanceParms specifies the port local name.");
-				tModelInstanceInfoBinding.getDescription().add(descriptionB);
-				tModelInstanceDetails.getTModelInstanceInfo().add(tModelInstanceInfoBinding);
-				
-				// reference wsdl:portType tModel
-				PortType portType = binding.getPortType();
-				TModelInstanceInfo tModelInstanceInfoPortType = new TModelInstanceInfo();
-				tModelInstanceInfoPortType.setTModelKey(keyDomainURI + portType.getQName().getLocalPart());
-				String portTypeDescription = "";
-				docElement = portType.getDocumentationElement();
-				if (docElement!=null && docElement.getTextContent()!=null) {
-					portTypeDescription = docElement.getTextContent();
-				}
-				Description descriptionPT = new Description();
-				descriptionPT.setLang(lang);
-				descriptionPT.setValue("The wsdl:portType that this wsdl:port implements." + portTypeDescription );
-				tModelInstanceInfoPortType.getDescription().add(descriptionPT);
-				tModelInstanceDetails.getTModelInstanceInfo().add(tModelInstanceInfoPortType);
-				
-				bindingTemplate.setTModelInstanceDetails(tModelInstanceDetails);
-			} else {
-				log.error("Could not find Port with portName: " + portName);
-			}
-		} else {
-			log.error("Could not find Service with serviceName: " + serviceQName.getLocalPart());
-		}
-		
-		return bindingTemplate;
-	}
-	/**
-	 * Obtains the accessUrl from the WSDL
-	 * @param port
-	 * @return
-	 * @throws MalformedURLException
-	 */
-	private String getBindingURL(Port port) throws MalformedURLException {
-		
-		String bindingUrl = null;
-		for (Object element: port.getExtensibilityElements()) {
-			if (element instanceof SOAPAddress) {
-				SOAPAddress address = (SOAPAddress) element;
-				URL locationURI = new URL(address.getLocationURI());
-				if (locationURI!=null) {
-					bindingUrl = urlLocalizer.rewrite(locationURI);
-					break;
-				}
-			}
-		}
-		return bindingUrl;
-	}
-	
+
+        log.debug("Constructing Service UDDI Information for " + serviceQName);
+        BusinessService service = new BusinessService();
+        // BusinessKey
+        service.setBusinessKey(businessKey);
+        // ServiceKey
+        service.setServiceKey(UDDIKeyConvention.getServiceKey(properties, serviceQName.getLocalPart()));
+        // Description
+        String serviceDescription = properties.getProperty(Property.SERVICE_DESCRIPTION, Property.DEFAULT_SERVICE_DESCRIPTION);
+        // Override with the service description from the WSDL if present
+        if (wsdlDefinition.getService(serviceQName) != null) {
+            Element docElement = wsdlDefinition.getService(serviceQName).getDocumentationElement();
+            if (docElement != null && docElement.getTextContent() != null) {
+                serviceDescription = docElement.getTextContent();
+            }
+        }
+        Description description = new Description();
+        description.setLang(lang);
+        description.setValue(serviceDescription);
+        service.getDescription().add(description);
+        // Service name
+        Name sName = new Name();
+        sName.setLang(lang);
+        sName.setValue(serviceQName.getLocalPart());
+        service.getName().add(sName);
+
+        CategoryBag categoryBag = new CategoryBag();
+
+        String namespace = serviceQName.getNamespaceURI();
+        if (namespace != null && namespace != "") {
+            KeyedReference namespaceReference = newKeyedReference(
+                    "uddi:uddi.org:xml:namespace", "uddi-org:xml:namespace", namespace);
+            categoryBag.getKeyedReference().add(namespaceReference);
+        }
+
+        KeyedReference serviceReference = newKeyedReference(
+                "uddi:uddi.org:wsdl:types", "uddi-org:wsdl:types", "service");
+        categoryBag.getKeyedReference().add(serviceReference);
+
+        KeyedReference localNameReference = newKeyedReference(
+                "uddi:uddi.org:xml:localname", "uddi-org:xml:localName", serviceQName.getLocalPart());
+        categoryBag.getKeyedReference().add(localNameReference);
+
+        service.setCategoryBag(categoryBag);
+
+        return service;
+    }
+
+    protected BindingTemplate createWSDLBinding(QName serviceQName, String portName, URL serviceUrl, Definition wsdlDefinition) {
+
+        BindingTemplate bindingTemplate = new BindingTemplate();
+        // Set BusinessService Key
+        bindingTemplate.setServiceKey(UDDIKeyConvention.getServiceKey(properties, serviceQName.getLocalPart()));
+
+        if (serviceUrl != null) {
+            // Set AccessPoint
+            AccessPoint accessPoint = new AccessPoint();
+            accessPoint.setUseType(AccessPointType.END_POINT.toString());
+            accessPoint.setValue(urlLocalizer.rewrite(serviceUrl));
+            bindingTemplate.setAccessPoint(accessPoint);
+            // Set Binding Key
+            String bindingKey = UDDIKeyConvention.getBindingKey(properties, serviceQName, portName, serviceUrl);
+            bindingTemplate.setBindingKey(bindingKey);
+        }
+
+        Service service = wsdlDefinition.getService(serviceQName);
+        if (service != null) {
+            TModelInstanceDetails tModelInstanceDetails = new TModelInstanceDetails();
+
+            Port port = service.getPort(portName);
+            if (port != null) {
+                if (serviceUrl == null) {
+                    for (Object element : port.getExtensibilityElements()) {
+                        if (element instanceof SOAPAddress) {
+                            SOAPAddress address = (SOAPAddress) element;
+                            URL locationURI;
+                            try {
+                                locationURI = new URL(address.getLocationURI());
+                                if (locationURI != null) {
+                                    AccessPoint accessPoint = new AccessPoint();
+                                    accessPoint.setUseType(AccessPointType.END_POINT.toString());
+                                    accessPoint.setValue(urlLocalizer.rewrite(locationURI));
+                                    bindingTemplate.setAccessPoint(accessPoint);
+                                    // Set Binding Key
+                                    String bindingKey = UDDIKeyConvention.getBindingKey(properties, serviceQName, portName, locationURI);
+                                    bindingTemplate.setBindingKey(bindingKey);
+                                }
+                                break;
+                            } catch (MalformedURLException e) {
+                                log.error(e.getMessage());
+                            }
+                        }
+                    }
+
+                }
+                Binding binding = port.getBinding();
+                // Set the Binding Description
+                String bindingDescription = properties.getProperty(Property.BINDING_DESCRIPTION, Property.DEFAULT_BINDING_DESCRIPTION);
+                // Override with the service description from the WSDL if present
+                Element docElement = binding.getDocumentationElement();
+                if (docElement != null && docElement.getTextContent() != null) {
+                    bindingDescription = docElement.getTextContent();
+                }
+                Description description = new Description();
+                description.setLang(lang);
+                description.setValue(bindingDescription);
+                bindingTemplate.getDescription().add(description);
+
+                // reference wsdl:binding tModel
+                TModelInstanceInfo tModelInstanceInfoBinding = new TModelInstanceInfo();
+                tModelInstanceInfoBinding.setTModelKey(keyDomainURI + binding.getQName().getLocalPart());
+                InstanceDetails instanceDetails = new InstanceDetails();
+                instanceDetails.setInstanceParms(portName);
+                tModelInstanceInfoBinding.setInstanceDetails(instanceDetails);
+                Description descriptionB = new Description();
+                descriptionB.setLang(lang);
+                descriptionB.setValue("The wsdl:binding that this wsdl:port implements. " + bindingDescription
+                        + " The instanceParms specifies the port local name.");
+                tModelInstanceInfoBinding.getDescription().add(descriptionB);
+                tModelInstanceDetails.getTModelInstanceInfo().add(tModelInstanceInfoBinding);
+
+                // reference wsdl:portType tModel
+                PortType portType = binding.getPortType();
+                TModelInstanceInfo tModelInstanceInfoPortType = new TModelInstanceInfo();
+                tModelInstanceInfoPortType.setTModelKey(keyDomainURI + portType.getQName().getLocalPart());
+                String portTypeDescription = "";
+                docElement = portType.getDocumentationElement();
+                if (docElement != null && docElement.getTextContent() != null) {
+                    portTypeDescription = docElement.getTextContent();
+                }
+                Description descriptionPT = new Description();
+                descriptionPT.setLang(lang);
+                descriptionPT.setValue("The wsdl:portType that this wsdl:port implements." + portTypeDescription);
+                tModelInstanceInfoPortType.getDescription().add(descriptionPT);
+                tModelInstanceDetails.getTModelInstanceInfo().add(tModelInstanceInfoPortType);
+
+                bindingTemplate.setTModelInstanceDetails(tModelInstanceDetails);
+            } else {
+                log.error("Could not find Port with portName: " + portName);
+            }
+        } else {
+            log.error("Could not find Service with serviceName: " + serviceQName.getLocalPart());
+        }
+
+        return bindingTemplate;
+    }
+
+    /**
+     * Obtains the accessUrl from the WSDL
+     *
+     * @param port
+     * @return
+     * @throws MalformedURLException
+     */
+    private String getBindingURL(Port port) throws MalformedURLException {
+
+        String bindingUrl = null;
+        for (Object element : port.getExtensibilityElements()) {
+            if (element instanceof SOAPAddress) {
+                SOAPAddress address = (SOAPAddress) element;
+                URL locationURI = new URL(address.getLocationURI());
+                if (locationURI != null) {
+                    bindingUrl = urlLocalizer.rewrite(locationURI);
+                    break;
+                }
+            }
+        }
+        return bindingUrl;
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@juddi.apache.org
For additional commands, e-mail: commits-help@juddi.apache.org