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

    WS Endpoints :: WSDL rendered dynamically

      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?

      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;
       }