[jboss-svn-commits] JBL Code SVN: r32984 - in labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta: src/org/jboss/soa/esb/listeners/config and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu May 20 08:46:53 EDT 2010


Author: kevin.conner at jboss.com
Date: 2010-05-20 08:46:51 -0400 (Thu, 20 May 2010)
New Revision: 32984

Added:
   labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/requestType.xsd
Modified:
   labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/internal/soa/esb/webservice/ESBContractGenerator.java
   labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/soa/esb/listeners/config/JBoss4ESBDeployer.java
   labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/soa/esb/listeners/deployers/mc/EsbWsdlDeployer.java
   labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/ESBContractGeneratorUnitTest.java
   labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/request.xsd
Log:
Support nested schema locations: JBESB-3322

Modified: labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/internal/soa/esb/webservice/ESBContractGenerator.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/internal/soa/esb/webservice/ESBContractGenerator.java	2010-05-20 12:10:56 UTC (rev 32983)
+++ labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/internal/soa/esb/webservice/ESBContractGenerator.java	2010-05-20 12:46:51 UTC (rev 32984)
@@ -67,7 +67,6 @@
 import org.jboss.soa.esb.Service;
 import org.jboss.soa.esb.dom.YADOMUtil;
 import org.jboss.soa.esb.listeners.config.WebserviceInfo;
-import org.jboss.soa.esb.util.ClassUtil;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -82,7 +81,18 @@
 import com.ibm.wsdl.extensions.soap.SOAPOperationImpl;
 
 public class ESBContractGenerator {
-	private static final QName XSD_QN = new QName("http://www.w3.org/2001/XMLSchema", "schema");
+	private static final String SCHEMA_NAMESPACE = "http://www.w3.org/2001/XMLSchema" ;
+	private static final String SCHEMA_NAME = "schema" ;
+	private static final String SCHEMA_PREFIX = "xs" ;
+	private static final String SCHEMA_ELEMENT = SCHEMA_PREFIX + ':' + SCHEMA_NAME ;
+	private static final String SCHEMA_TARGETNAMESPACE_ATTRIBUTE = "targetNamespace" ;
+	private static final String SCHEMA_VERSION_ATTRIBUTE = "version" ;
+	private static final String SCHEMA_VERSION_VALUE = "1.0" ;
+	
+	private static final String SCHEMA_INCLUDE_ELEMENT = SCHEMA_PREFIX + ":include" ;
+	private static final String IMPORT_SCHEMA_LOCATION_ATTRIBUTE = "schemaLocation" ;
+	
+	private static final QName XSD_QN = new QName(SCHEMA_NAMESPACE, SCHEMA_NAME);
 	private static final String WSDL_NAMESPACE = "http://schemas.xmlsoap.org/wsdl/" ;
 	private static final String WSDL_REQUIRED = "required" ;
 	private static final String WSAW_NAMESPACE = "http://www.w3.org/2006/05/addressing/wsdl" ;
@@ -91,10 +101,6 @@
 	private static final QName WSAW_USING_ADDRESSING_QN = new QName(WSAW_NAMESPACE, "UsingAddressing", WSAW_PREFIX) ;
 	private static WSDLFactory wsdlFactory ;
 	
-	public static String generateWSDL(final WebserviceInfo serviceConfig, final ESBServiceEndpointInfo serviceInfo) throws ConfigurationException {
-	    return generateWSDL(serviceConfig, serviceInfo, null);
-	}
-	
 	public static String generateWSDL(final WebserviceInfo serviceConfig, final ESBServiceEndpointInfo serviceInfo, final ClassLoader classLoader) throws ConfigurationException {
 		final Definition def = getWSDLFactory().newDefinition() ;
 		final String namespace = serviceInfo.getNamespace() ;
@@ -123,45 +129,34 @@
 
 		int nsSuffixCounter = 0 ;
 		if (inXsd != null) {
-			try {
-				Document doc = YADOMUtil.parseStream(getResourceAsStream(inXsd, classLoader), false, false);
-				if (doc != null) {
-					reqMessage = addMessage(def, doc.getDocumentElement(),
-							serviceInfo.getRequestName(), "in", ++nsSuffixCounter, schemasAdded);
-				}
-			} catch (Exception e) {
-				throw new ConfigurationException("File defined in inXsd attribute '" + inXsd + "' not found in classpath.", e);
+			final QName[] elementNames = getElementNames(inXsd, classLoader, schemasAdded, def, ++nsSuffixCounter) ;
+			if ((elementNames == null) || (elementNames.length == 0)) {
+				throw new ConfigurationException("File defined in inXsd attribute '" + inXsd + "' not found in classpath or contains no elements.");
+			} else {
+				reqMessage = addMessage(def, elementNames[0], serviceInfo.getRequestName(), "in");
 			} 
 		}
 
 		if (outXsd != null) {
-			try {
-				Document doc = YADOMUtil.parseStream(getResourceAsStream(outXsd, classLoader), false, false);
-				if (doc != null) {
-					resMessage = addMessage(def, doc.getDocumentElement(),
-						serviceInfo.getResponseName(), "out", ++nsSuffixCounter, schemasAdded);
-				}
-			} catch (Exception e) {
-				throw new ConfigurationException("File defined in outXsd attribute '" + outXsd + "' not found in classpath.", e);
+			final QName[] elementNames = getElementNames(outXsd, classLoader, schemasAdded, def, ++nsSuffixCounter) ;
+			if ((elementNames == null) || (elementNames.length == 0)) {
+				throw new ConfigurationException("File defined in outXsd attribute '" + outXsd + "' not found in classpath or contains no elements.");
+			} else {
+				resMessage = addMessage(def, elementNames[0], serviceInfo.getResponseName(), "out");
 			} 
-
 		}
 
 		if ((faultXsd != null) && !serviceInfo.isOneWay()) {
-			try {
-				final String[] xsds = faultXsd.split(",") ;
-				faultMessages = new ArrayList<Message>();
-				for(String xsd: xsds) {
-					Document doc = YADOMUtil.parseStream(getResourceAsStream(xsd, classLoader), false, false);
-					if (doc != null) {
-						addFaultMessage(faultMessages, def, doc.getDocumentElement(),
-							serviceInfo.getFaultName(), "fault", ++nsSuffixCounter, schemasAdded);
-					}
+			final String[] xsds = faultXsd.split(",") ;
+			faultMessages = new ArrayList<Message>();
+			for(String xsd: xsds) {
+				final QName[] elementNames = getElementNames(xsd, classLoader, schemasAdded, def, ++nsSuffixCounter) ;
+				if ((elementNames == null) || (elementNames.length == 0)) {
+					throw new ConfigurationException("File defined in faultXsd attribute '" + xsd + "' not found in classpath or contains no elements.");
+				} else {
+					addFaultMessage(faultMessages, def, elementNames, serviceInfo.getFaultName(), "fault");
 				}
-			} catch (Exception e) {
-				throw new ConfigurationException("File defined in faultXsd attribute '" + faultXsd + "' not found in classpath.", e);
-			} 
-
+			}
 		}
 
 		PortType portType = addPortType(def, serviceInfo, reqMessage,
@@ -178,28 +173,92 @@
 		return sw.toString();
 	}
 	
-	private static void addSchema(Types types, Element xsdElement, Set<String> schemasAdded) throws SAXException, IOException, TransformerException, ParserConfigurationException {
-	    if (add(xsdElement, schemasAdded))
-	    {
-    		SchemaImpl schemaImpl = new SchemaImpl();
-    		schemaImpl.setElement(xsdElement);
-    		schemaImpl.setElementType(XSD_QN);
-    		types.addExtensibilityElement(schemaImpl);
-	    }
+	private static QName[] getElementNames(final String resource, final ClassLoader classLoader, final Set<String> schemasAdded,
+		Definition def, int nsSuffixCounter) throws ConfigurationException
+	{
+		final String schemaLocation = getRelativeResource(resource) ;
+		final InputStream is = getResourceAsStream(schemaLocation, classLoader) ;
+		if (is == null)
+		{
+			return null ;
+		}
+		final Document doc ;
+		try
+		{
+			try
+			{
+				doc = YADOMUtil.parseStream(is, false, false);
+			}
+			finally
+			{
+				is.close() ;
+			}
+		}
+		catch (final Exception ex)
+		{
+			throw new ConfigurationException("Unexpected exception parsing schema resource: " + schemaLocation, ex) ;
+		}
+		final Element schemaElement = doc.getDocumentElement() ;
+		final String targetNamespace = YADOMUtil.getAttribute(schemaElement, SCHEMA_TARGETNAMESPACE_ATTRIBUTE, "") ;
+		final boolean added ;
+		try
+		{
+			added = add(schemaElement, schemasAdded) ;
+		}
+		catch (final Exception ex)
+		{
+			throw new ConfigurationException("Unexpected exception adding schema to known resources: " + schemaLocation, ex) ;
+		}
+		if (added)
+		{
+			if (def.getNamespace(targetNamespace) == null)
+			{
+				def.addNamespace("esbns" + nsSuffixCounter, targetNamespace) ;
+			}
+			final Types types = def.getTypes() ;
+			SchemaImpl schemaImpl = new SchemaImpl();
+			final Document schemaDoc = YADOMUtil.createDocument() ;
+			final Element xsdElement = schemaDoc.createElementNS(SCHEMA_NAMESPACE, SCHEMA_ELEMENT) ;
+			xsdElement.setAttribute(SCHEMA_TARGETNAMESPACE_ATTRIBUTE, targetNamespace) ;
+			xsdElement.setAttribute(SCHEMA_VERSION_ATTRIBUTE, SCHEMA_VERSION_VALUE) ;
+			final Element xsdInclude = schemaDoc.createElementNS(SCHEMA_NAMESPACE, SCHEMA_INCLUDE_ELEMENT) ;
+			xsdInclude.setAttribute(IMPORT_SCHEMA_LOCATION_ATTRIBUTE, schemaLocation) ;
+			xsdElement.appendChild(xsdInclude) ;
+			schemaImpl.setElement(xsdElement) ;
+			schemaImpl.setElementType(XSD_QN);
+			types.addExtensibilityElement(schemaImpl);
+		}
+		final NodeList nodes = YADOMUtil.getNodeList(schemaElement, "/schema/element") ;
+		final int numNodes = nodes.getLength() ;
+		final QName[] result = new QName[numNodes] ;
+		for (int count = 0 ; count < numNodes ; count++)
+		{
+			final Node node = nodes.item(count) ;
+			result[count] = new QName(targetNamespace, YADOMUtil.getAttribute((Element) node, "name", "")) ;
+		}
+		return result ;
 	}
 	
+	private static String getRelativeResource(final String resource)
+	{
+		final int length = resource.length() ;
+		for(int count = 0 ; count < length ; count++)
+		{
+			if (resource.charAt(count) != '/')
+			{
+				return resource.substring(count) ;
+			}
+		}
+		return "" ;
+	}
+
 	private static InputStream getResourceAsStream(final String resource, final ClassLoader classLoader)
 	{
-	    if (classLoader != null)
-	    {
-	        final InputStream in = classLoader.getResourceAsStream(resource);
-	        if (in !=null )
-	        {
-	            return in;
-	        }
-	    }
-	    // Fallback to using the class's clasloader.
-		return ClassUtil.getResourceAsStream(resource, ESBContractGenerator.class);
+		if (classLoader != null)
+		{
+			return classLoader.getResourceAsStream(resource) ;
+		}
+		return null ;
 	}
 
 	private static boolean add(final Element schemaElement, final Set<String> schemasAdded) throws SAXException, IOException, TransformerException, ParserConfigurationException
@@ -234,49 +293,32 @@
         return false;
     }
 
-    private static Message addMessage(Definition def, Element element, String msgName, String partName, int nsSuffixCounter, Set<String> schemasAdded) throws SAXException, IOException, TransformerException, ParserConfigurationException {
-		String schemaNs = YADOMUtil
-				.getAttribute(element, "targetNamespace", "");
-		addSchema(def.getTypes(), element, schemasAdded);
-		if (def.getNamespace(schemaNs) == null) {
-			def.addNamespace("ns" + nsSuffixCounter, schemaNs);
-		}
+	private static Message addMessage(Definition def, QName elementName, String msgName, String partName) {
 		// add request message
-		Node node = YADOMUtil.getNode(element, "/schema/element");
 		Message msg = def.createMessage();
 		msg.setQName(new QName(def.getTargetNamespace(), msgName));
 		msg.setUndefined(false);
 		Part part = def.createPart();
 		part.setName(partName);
-		part.setElementName(new QName(schemaNs, YADOMUtil.getAttribute(
-				(Element) node, "name", "")));
+		part.setElementName(elementName) ;
 		msg.addPart(part);
 		def.addMessage(msg);
 		return msg;
 	}
 
 	private static void addFaultMessage(final List<Message> faultMessages,
-			Definition def, Element element, String msgName, String partName,
-			int nsSuffixCounter, Set<String> schemasAdded) throws SAXException, IOException, TransformerException, ParserConfigurationException {
-		String schemaNs = YADOMUtil
-				.getAttribute(element, "targetNamespace", "");
-		addSchema(def.getTypes(), element, schemasAdded);
-		if (def.getNamespace(schemaNs) == null) {
-			def.addNamespace("ns" + nsSuffixCounter, schemaNs);
-		}
+			Definition def, QName[] elementNames, String msgName, String partName) {
 		// add request message
-		NodeList nodes = YADOMUtil.getNodeList(element, "/schema/element");
-		for (int i = 0; i < nodes.getLength(); i++) {
+		final int numElements = (elementNames == null ? 0 : elementNames.length) ;
+		for (int i = 0; i < numElements; i++) {
 			final int nameIndex = i + 1;
-			Node node = nodes.item(0);
 			Message msg = def.createMessage();
 			msg.setQName(new QName(def.getTargetNamespace(), msgName
 					+ nameIndex));
 			msg.setUndefined(false);
 			Part part = def.createPart();
 			part.setName(partName + nameIndex);
-			part.setElementName(new QName(schemaNs, YADOMUtil.getAttribute(
-					(Element) node, "name", "")));
+			part.setElementName(elementNames[i]);
 			msg.addPart(part);
 			def.addMessage(msg);
 			faultMessages.add(msg);

Modified: labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/soa/esb/listeners/config/JBoss4ESBDeployer.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/soa/esb/listeners/config/JBoss4ESBDeployer.java	2010-05-20 12:10:56 UTC (rev 32983)
+++ labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/soa/esb/listeners/config/JBoss4ESBDeployer.java	2010-05-20 12:46:51 UTC (rev 32984)
@@ -456,7 +456,7 @@
                        }
                        
                        final ESBServiceEndpointInfo serviceInfo = new ESBServiceEndpointInfo(webserviceInfo) ;
-                       final String wsdl = ESBContractGenerator.generateWSDL(webserviceInfo, serviceInfo) ;
+                       final String wsdl = ESBContractGenerator.generateWSDL(webserviceInfo, serviceInfo, di.localCl) ;
                        webDeployment.addEntry(serviceInfo.getWSDLFileName(), wsdl.getBytes("UTF-8"));
 
                        final String handlers = JBossDeployerUtil.getHandlers(serviceInfo) ;

Modified: labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/soa/esb/listeners/deployers/mc/EsbWsdlDeployer.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/soa/esb/listeners/deployers/mc/EsbWsdlDeployer.java	2010-05-20 12:10:56 UTC (rev 32983)
+++ labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/soa/esb/listeners/deployers/mc/EsbWsdlDeployer.java	2010-05-20 12:46:51 UTC (rev 32984)
@@ -122,21 +122,24 @@
                 
                 final List<URL> wsdls = new ArrayList<URL>();
                 
-                for (WebserviceInfo wsInfo : webServices)
+                if (webServices.size() > 0)
                 {
-                    // Generate the wsdl for the web service.
-                    final ESBServiceEndpointInfo serviceInfo = new ESBServiceEndpointInfo(wsInfo);
-                    final String wsdl = ESBContractGenerator.generateWSDL(wsInfo, serviceInfo, unit.getClassLoader());
-                    final URL wsdlUrl = VfsUtil.createInMemUrl(inMemRootUrl, serviceInfo.getWSDLFileName());
-                    log.info("Generating wsdl url : " + wsdlUrl);
+                    for (WebserviceInfo wsInfo : webServices)
+                    {
+                        // Generate the wsdl for the web service.
+                        final ESBServiceEndpointInfo serviceInfo = new ESBServiceEndpointInfo(wsInfo);
+                        final String wsdl = ESBContractGenerator.generateWSDL(wsInfo, serviceInfo, unit.getClassLoader());
+                        final URL wsdlUrl = VfsUtil.createInMemUrl(inMemRootUrl, serviceInfo.getWSDLFileName());
+                        log.info("Generating wsdl url : " + wsdlUrl);
+                        
+                        // Add the wsdl in the virtual file system
+                        VirtualFile wsdlFile = VfsUtil.addFile(inMemRootUrl, serviceInfo.getWSDLFileName(), wsdl.getBytes());
+                        wsdls.add(wsdlUrl);
+                        
+                        // Add any additional schemas in the deployment unit to the in-memory vfs.
+                        addSchemasToVfs(getSchemas(unit.getRoot()), wsdlFile.getParent(), esbMetaData.getArchiveName());
+                    }
                     
-                    // Add the wsdl in the virtual file system
-                    VirtualFile wsdlFile = VfsUtil.addFile(inMemRootUrl, serviceInfo.getWSDLFileName(), wsdl.getBytes());
-                    wsdls.add(wsdlUrl);
-                    
-                    // Add any additional schemas in the deployment unit to the in-memory vfs.
-                    addSchemasToVfs(getSchemas(unit.getRoot()), wsdlFile.getParent(), esbMetaData.getArchiveName());
-                    
                     // Add the root of the virtual file system as a meta data location.
                     unit.appendMetaDataLocation(inMemRootDir);
                 }

Modified: labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/ESBContractGeneratorUnitTest.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/ESBContractGeneratorUnitTest.java	2010-05-20 12:10:56 UTC (rev 32983)
+++ labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/ESBContractGeneratorUnitTest.java	2010-05-20 12:46:51 UTC (rev 32984)
@@ -23,6 +23,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
+import java.net.URL;
 import java.util.List;
 
 import javax.wsdl.Binding;
@@ -145,10 +146,18 @@
         List<WebserviceInfo> services = generator.getModel().getWebserviceServices();
         final WebserviceInfo service = services.get(0) ;
         final ESBServiceEndpointInfo endpointInfo = new ESBServiceEndpointInfo(service) ;
-        String wsdl = ESBContractGenerator.generateWSDL(service, endpointInfo);
+        String wsdl = ESBContractGenerator.generateWSDL(service, endpointInfo, ESBContractGenerator.class.getClassLoader());
+        
+        final URL resourceURL = getClass().getResource("request.xsd") ;
+        assertNotNull("Resource location", resourceURL) ;
+        final String resourceLocation = resourceURL.toString() ;
+        final int orgIndex = resourceLocation.lastIndexOf("/org/") ;
+        assertTrue("org package index", orgIndex >= 0) ;
+        final String wsdlLocation = resourceLocation.substring(0, orgIndex) + "/tmp.wsdl" ;
+        
         java.io.StringReader strReader = new java.io.StringReader(wsdl);
         InputSource inputSource = new InputSource(strReader);
-        Definition def = WSDLFactory.newInstance().newWSDLReader().readWSDL("file://tmp.wsdl", inputSource);
+        Definition def = WSDLFactory.newInstance().newWSDLReader().readWSDL(wsdlLocation, inputSource);
         assertNotNull("Failed to generate wsdl file" , def);
 
         return def;

Modified: labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/request.xsd
===================================================================
--- labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/request.xsd	2010-05-20 12:10:56 UTC (rev 32983)
+++ labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/request.xsd	2010-05-20 12:46:51 UTC (rev 32984)
@@ -1,8 +1,4 @@
-<xs:schema version="1.0" targetNamespace="http://www.jboss.org/sayHi" xmlns:x1="http://www.jboss.org/sayHi"  xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+<xs:schema version="1.0" targetNamespace="http://www.jboss.org/sayHi" xmlns:x1="http://www.jboss.org/sayHiType"  xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+  <xs:import namespace="http://www.jboss.org/sayHiType" schemaLocation="requestType.xsd"/>
   <xs:element name="sayHi" type="x1:sayHi"/>
-  <xs:complexType name="sayHi">
-    <xs:sequence>
-      <xs:element name="arg0" type="xs:string" minOccurs="0"/>
-    </xs:sequence>
-  </xs:complexType>
 </xs:schema>

Added: labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/requestType.xsd
===================================================================
--- labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/requestType.xsd	                        (rev 0)
+++ labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/requestType.xsd	2010-05-20 12:46:51 UTC (rev 32984)
@@ -0,0 +1,7 @@
+<xs:schema version="1.0" targetNamespace="http://www.jboss.org/sayHiType" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+  <xs:complexType name="sayHi">
+    <xs:sequence>
+      <xs:element name="arg0" type="xs:string" minOccurs="0"/>
+    </xs:sequence>
+  </xs:complexType>
+</xs:schema>


Property changes on: labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/tests/src/org/jboss/internal/soa/esb/webservice/requestType.xsd
___________________________________________________________________
Name: svn:mime-type
   + text/xml
Name: svn:keywords
   + Rev Date
Name: svn:eol-style
   + native



More information about the jboss-svn-commits mailing list