0 Replies Latest reply on Oct 23, 2008 2:24 PM by a a

    WS Endpoints :: WSDL rendered dynamically

    a a Newbie

      Hi 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?



      <xs:schema version='1.0' targetNamespace="http://www.jboss.org/sayHi"
       xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault="qualified"
       <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:element name="person" type="Q1:person" minOccurs="1"></xs:element>

      <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'
       <xs:complexType name='person'>
       <xs:element name='name' type='xs:string' />
       <xs:element name='surname' type='xs:string' />

      public class JBoss4ESBDeployer extends SubDeployerSupport
       implements SubDeployer, JBoss4ESBDeployerMBean
       public void init(DeploymentInfo di) throws DeploymentException {
       Thread.currentThread().setContextClassLoader(di.localCl) ;
       warFile = createWebserviceWars(di, jbossEsb, deploymentName, publishers) ;
       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
       return bytes;