[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