You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juddi.apache.org by ks...@apache.org on 2011/05/23 19:01:01 UTC

svn commit: r1126583 - in /juddi/trunk/juddi-client/src: main/java/org/apache/juddi/v3/client/mapping/WSDL2UDDI.java test/java/org/apache/juddi/v3/client/mapping/WSDL2UDDITest.java

Author: kstam
Date: Mon May 23 17:01:01 2011
New Revision: 1126583

URL: http://svn.apache.org/viewvc?rev=1126583&view=rev
Log:
JUDDI-377 adding support for proper WSDL service registration

Modified:
    juddi/trunk/juddi-client/src/main/java/org/apache/juddi/v3/client/mapping/WSDL2UDDI.java
    juddi/trunk/juddi-client/src/test/java/org/apache/juddi/v3/client/mapping/WSDL2UDDITest.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=1126583&r1=1126582&r2=1126583&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 Mon May 23 17:01:01 2011
@@ -16,31 +16,52 @@
  */
 package org.apache.juddi.v3.client.mapping;
 
+import java.net.URL;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
 import javax.wsdl.Binding;
 import javax.wsdl.Definition;
+import javax.wsdl.Port;
 import javax.wsdl.PortType;
+import javax.wsdl.Service;
 import javax.wsdl.WSDLException;
 import javax.wsdl.extensions.http.HTTPBinding;
 import javax.wsdl.extensions.soap.SOAPBinding;
 import javax.xml.namespace.QName;
 
+import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.juddi.api_v3.AccessPointType;
 import org.apache.juddi.jaxb.PrintUDDI;
 import org.apache.juddi.v3.client.config.Property;
+import org.apache.juddi.v3.client.config.UDDIClerk;
+import org.apache.juddi.v3.client.transport.TransportException;
+import org.uddi.api_v3.AccessPoint;
+import org.uddi.api_v3.BindingTemplate;
+import org.uddi.api_v3.BusinessService;
 import org.uddi.api_v3.CategoryBag;
+import org.uddi.api_v3.Description;
 import org.uddi.api_v3.FindTModel;
+import org.uddi.api_v3.GetTModelDetail;
+import org.uddi.api_v3.InstanceDetails;
 import org.uddi.api_v3.KeyedReference;
 import org.uddi.api_v3.Name;
 import org.uddi.api_v3.OverviewDoc;
 import org.uddi.api_v3.OverviewURL;
 import org.uddi.api_v3.TModel;
+import org.uddi.api_v3.TModelDetail;
+import org.uddi.api_v3.TModelInfo;
+import org.uddi.api_v3.TModelInstanceDetails;
+import org.uddi.api_v3.TModelInstanceInfo;
+import org.uddi.api_v3.TModelList;
+import org.w3c.dom.Element;
 
 
 /**
@@ -65,15 +86,86 @@ public class WSDL2UDDI {
 	private String keyDomainURI;
 	private String businessKey;
 	private String lang;
+	private UDDIClerk clerk = null;
+	private Properties properties = null;
+	private URLLocalizer urlLocalizer;
 	
-	public WSDL2UDDI(Properties properties) {
+	public WSDL2UDDI(UDDIClerk clerk, URLLocalizer urlLocalizer, Properties properties) {
 		super();
+		
+		this.clerk = clerk;
+		this.urlLocalizer = urlLocalizer;
+		this.properties = properties;
+		
 		//Obtaining values from the properties
 		this.keyDomainURI =  "uddi:" + properties.getProperty("keyDomain") + ":";
 		this.businessKey = Property.getBusinessKey(properties);
 		this.lang = properties.getProperty(Property.LANG,Property.DEFAULT_LANG);
 	}
 	
+	@SuppressWarnings("unchecked")
+	public BindingTemplate register(QName serviceQName, String portName, URL serviceUrl, Definition wsdlDefinition) throws RemoteException, ConfigurationException, TransportException, WSDLException {
+		
+		String genericWSDLURL  = wsdlDefinition.getDocumentBaseURI();   //TODO maybe point to repository version
+		
+		String serviceKey = Property.getServiceKey(properties, serviceQName);
+		BusinessService service = lookupService(serviceKey);
+		if (service==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
+		    service = createBusinessService(serviceQName, wsdlDefinition);
+		    // Register this Service
+		    clerk.register(service);
+		}
+		//Add the BindingTemplate to this Service
+		BindingTemplate binding = createWSDLBinding(serviceQName, portName, serviceUrl, wsdlDefinition);
+		// Register BindingTemplate
+		clerk.register(binding);
+		return binding;
+	}
+	
+	public String unRegister(QName serviceName, String portName, URL serviceUrl) throws RemoteException, ConfigurationException, TransportException {
+		
+		String serviceKey = Property.getServiceKey(properties, serviceName);
+		BusinessService service = lookupService(serviceKey);
+		boolean isRemoveServiceIfNoTemplates = true; 
+		String bindingKey = Property.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;
 	}
@@ -89,26 +181,6 @@ public class WSDL2UDDI {
 		this.lang = lang;
 	}
 
-	public void register(Definition wsdlDefinition) throws WSDLException 
-	{
-	    Set<TModel> tModels = new HashSet<TModel>();
-	    String wsdlURL = ""; //TODO get the updated version of the wsdlURL
-	    
-	    //WSDL PortType tModels
-	    @SuppressWarnings("unchecked")
-		Map<QName,PortType> portTypes = (Map<QName,PortType>) wsdlDefinition.getAllPortTypes();
-	    Set<TModel> portTypeTModels = createWSDLPortTypeTModels(wsdlURL, portTypes);
-	    tModels.addAll(portTypeTModels);
-	    
-	    //WSDL Binding tModels
-	    @SuppressWarnings("unchecked")
-	    Map<QName,Binding> bindings = (Map<QName,Binding>) wsdlDefinition.getAllBindings();
-	    Set<TModel> bindingTModels = createWSDLBindingTModels(wsdlURL, bindings);
-	    tModels.addAll(bindingTModels);
-	    
-	    //Service.
-	   
-	}
 	/**
 	 * <h3>2.4.2 wsdl:binding -> uddi:tModel</h3>
 
@@ -135,7 +207,7 @@ public class WSDL2UDDI {
 		   <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>
+		      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 
@@ -408,8 +480,7 @@ public class WSDL2UDDI {
 		return super.toString();
 	}
 	
-	 /** Finds and returns ALL the tModels related to the process, so that i.e. they
-     * can be removed on undeployment of the service.
+	/** Builds a finder to find the binding tModels for a portType.
      * 
      * @param processName
      * @return
@@ -439,7 +510,181 @@ public class WSDL2UDDI {
     	}
     	return findTModel;
     }
-	    
-  
+    
+	/** Builds a finder to find the portType tModels for a portType.
+     * 
+     * @param processName
+     * @return
+     */
+    public FindTModel createFindPortTypeTModelForPortType (String portType, String namespace) {
+    	
+    	FindTModel findTModel = new FindTModel();
+    	Name name = new Name();
+    	name.setLang(lang);
+    	name.setValue(portType);
+    	findTModel.setName(name);
+    	
+    	CategoryBag categoryBag = new CategoryBag();
+    	if (namespace!=null && namespace!="") {
+    		KeyedReference namespaceReference = newKeyedReference(
+    			"uddi:uddi.org:xml:namespace", namespace);
+    		categoryBag.getKeyedReference().add(namespaceReference);
+    	}
+    	KeyedReference bindingReference = newKeyedReference(
+    			"uddi:uddi.org:wsdl:types", "portType");
+    	categoryBag.getKeyedReference().add(bindingReference);
+    	
+    	KeyedReference portTypeReference = newKeyedReference(
+    			"uddi:uddi.org:wsdl:porttypereference", portType);
+    	categoryBag.getKeyedReference().add(portTypeReference);
+    	
+    	findTModel.setCategoryBag(categoryBag);
+    	
+    	if (log.isInfoEnabled()) {
+    		System.out.println(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
+	 */
+	public BusinessService lookupService(String serviceKey) throws RemoteException, ConfigurationException, TransportException {
+		
+		//Checking if this serviceKey already exist
+		BusinessService service = clerk.findService(serviceKey);
+		return service;
+	}
+	
+	/**
+	 * Creates a UDDI Business Service.
+	 * 
+	 * @param serviceName
+	 * @param wsldDefinition
+	 * @return
+	 */
+	public 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(Property.getServiceKey(properties, serviceQName));
+		// Description
+		String serviceDescription = properties.getProperty(Property.SERVICE_DESCRIPTION, Property.DEFAULT_SERVICE_DESCRIPTION);
+		// Override with the service description from the WSDL if present
+		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", "service namespace", namespace);
+    		categoryBag.getKeyedReference().add(namespaceReference);
+    	}
+		
+		KeyedReference serviceReference = newKeyedReference(
+    			"uddi:uddi.org:wsdl:types", "WSDL type", "service");
+    	categoryBag.getKeyedReference().add(serviceReference);
+    	
+    	KeyedReference localNameReference = newKeyedReference(
+    			"uddi:uddi.org:xml:localname", "service local name", serviceQName.getLocalPart());
+    	categoryBag.getKeyedReference().add(localNameReference);
+    	
+		service.setCategoryBag(categoryBag);
+    	
+		return service;
+	}
+	
+	public BindingTemplate createWSDLBinding(QName serviceName, String portName, URL serviceUrl, Definition wsdlDefinition) {
+			
+    	BindingTemplate bindingTemplate = new BindingTemplate();
+		// Set BusinessService Key
+		bindingTemplate.setServiceKey(Property.getServiceKey(properties, serviceName));
+		// Set Binding Key
+		String bindingKey = Property.getBindingKey(properties, serviceName, portName, serviceUrl);
+		bindingTemplate.setBindingKey(bindingKey);
+		// Set AccessPoint
+		AccessPoint accessPoint = new AccessPoint();
+		accessPoint.setUseType(AccessPointType.END_POINT.toString());
+		accessPoint.setValue(urlLocalizer.rewrite(serviceUrl));
+		bindingTemplate.setAccessPoint(accessPoint);
+		
+		Service service =  wsdlDefinition.getService(serviceName);
+		if (service!=null) {
+			TModelInstanceDetails tModelInstanceDetails = new TModelInstanceDetails();
+			
+			Port port = service.getPort(portName);
+			if (port!=null) {
+				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: " + serviceName.getLocalPart());
+		}
+		
+		return bindingTemplate;
+	}
 	
 }

Modified: juddi/trunk/juddi-client/src/test/java/org/apache/juddi/v3/client/mapping/WSDL2UDDITest.java
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-client/src/test/java/org/apache/juddi/v3/client/mapping/WSDL2UDDITest.java?rev=1126583&r1=1126582&r2=1126583&view=diff
==============================================================================
--- juddi/trunk/juddi-client/src/test/java/org/apache/juddi/v3/client/mapping/WSDL2UDDITest.java (original)
+++ juddi/trunk/juddi-client/src/test/java/org/apache/juddi/v3/client/mapping/WSDL2UDDITest.java Mon May 23 17:01:01 2011
@@ -48,7 +48,7 @@ public class WSDL2UDDITest {
 		
 		Properties properties = new Properties();
 		properties.put("keyDomain", "juddi.apache.org");
-		WSDL2UDDI wsdl2UDDI = new WSDL2UDDI(properties);
+		WSDL2UDDI wsdl2UDDI = new WSDL2UDDI(null, new URLLocalizerImpl(), properties);
 		Set<TModel> tModels = new HashSet<TModel>();
 	    @SuppressWarnings("unchecked")
 		Map<QName,PortType> portTypes = (Map<QName,PortType>) wsdlDefinition.getAllPortTypes();
@@ -71,7 +71,7 @@ public class WSDL2UDDITest {
 		
 		Properties properties = new Properties();
 		properties.put("keyDomain", "juddi.apache.org");
-		WSDL2UDDI wsdl2UDDI = new WSDL2UDDI(properties);
+		WSDL2UDDI wsdl2UDDI = new WSDL2UDDI(null, new URLLocalizerImpl(), properties);
 		Set<TModel> tModels = new HashSet<TModel>();
 	    @SuppressWarnings("unchecked")
 		Map<QName,Binding> bindings= (Map<QName,Binding>) wsdlDefinition.getAllBindings();



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