WS Endpoints :: WSDL rendered dynamically
atemple Oct 23, 2008 2:24 PMHi all,
I've checkout the jbossesb-4.4.GACP from SVN and took a look in publish_as_webservice sample.
After some tests I realized that when I import some xsd into main xsd something goes wrong. Exploring the generated artifacts from JBossAS I saw that imported xsd was not copied into deployed services (tmp directory) and here is the problem.
So I got the source code from JBoss4ESBDeployer and did a few changes.
Below is the snippets from xsd and source code.
I think it's a good idea to include something like this in JBossESB new release, since we always have a complex xsd structure and could expose it as a service in the bus.
What do you think?
tks.
request.xsd
<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" xmlns:Q1="http://www.jboss.org/standard"> <xs:import schemaLocation="standard.xsd" namespace="http://www.jboss.org/standard"></xs:import> <xs:include schemaLocation="standard.xsd"></xs:include> <xs:element name="sayHi" type="x1:sayHi"/> <xs:complexType name="sayHi"> <xs:sequence> <xs:element name="person" type="Q1:person" minOccurs="1"></xs:element> </xs:sequence> </xs:complexType> </xs:schema>
standard.xsd
<xs:schema version='1.0' targetNamespace="http://www.jboss.org/standard" xmlns:tns='http://www.jboss.org/standard' xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault="qualified"> <xs:complexType name='person'> <xs:sequence> <xs:element name='name' type='xs:string' /> <xs:element name='surname' type='xs:string' /> </xs:sequence> </xs:complexType> </xs:schema>
org.jboss.soa.esb.listeners.config.JBoss4ESBDeployer.java
public class JBoss4ESBDeployer extends SubDeployerSupport implements SubDeployer, JBoss4ESBDeployerMBean ... public void init(DeploymentInfo di) throws DeploymentException { ... try { Thread.currentThread().setContextClassLoader(di.localCl) ; warFile = createWebserviceWars(di, jbossEsb, deploymentName, publishers) ; } finally { Thread.currentThread().setContextClassLoader(origCL) ; } ... } private File createWebserviceWars(final DeploymentInfo di, final Jbossesb jbossEsb, final String deploymentName, final List<ContractReferencePublisher> publishers) throws DeploymentException { ... for(Service service: endpointServices) { final ESBServiceEndpointInfo serviceInfo = new ESBServiceEndpointInfo(service) ; final String wsdl = ESBContractGenerator.generateWSDL(service, serviceInfo) ; addFile(zos, serviceInfo.getWSDLFileName(), wsdl) ; ZipFile file = new ZipFile(di.url.getFile()); Enumeration xsdFiles = file.entries(); if (xsdFiles != null) { while (xsdFiles.hasMoreElements()) { ZipEntry xsdFile = (ZipEntry) xsdFiles.nextElement(); if (xsdFile.getName().indexOf("xsd") > 0) { String xsdFileName = "WEB-INF/wsdl/" + service.getCategory().replace('/', '_') + "/" + xsdFile.getName(); addFile(zos, xsdFileName, getBytesFromFile( di.localCl.getResourceAsStream(xsdFile.getName()), xsdFile.getSize(), xsdFile.getName())); } } } ... } private byte[] getBytesFromFile(InputStream is, long length, String fileName) throws IOException { if (length > Integer.MAX_VALUE) { // File is too large } // Create the byte array to hold the data byte[] bytes = new byte[(int)length]; // Read in the bytes int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { offset += numRead; } // Ensure all the bytes have been read in if (offset < bytes.length) { throw new IOException("Could not completely read file "+ fileName); } // Close the input stream and return bytes is.close(); return bytes; }