[jbossws-dev] [Design of JBoss Web Services] - ESB / WS integration issue on AS5

alessio.soldano@jboss.com do-not-reply at jboss.com
Thu Apr 16 06:48:32 EDT 2009


Daniel Bevenius wrote:

Hi Alession,

hope you don't mind me emailing directly. Kevin Conner gave me your email address and I'd like to ask your advice an issue I'm having.

Background
In the ESB you can specify that a service should be exposed as a WS. Upon deploying the service a web-app will get generated
and deployed. As part of this process a number of files get generated, like the webservice implementation, jaxws handler chain, wsdl file.
In JBoss AS 4.x this was done by actually creating a .war file on the local filesystem, but in AS5 it is done by using a
number of deployers.

This is what I want to achive:
1.  Generate a wsdl and add that wsdl to a deployment unit so that it will be available to other deployers, mainly the WS deployer(s).
I'm trying to to add the wsdl to an in-memory VFS, and then add that as a metadata location to the deploymentunit. This is done by the following deployer:
http://anonsvn.jboss.org/repos/labs/labs/jbossesb/workspace/dbevenius/jbossas5/product/rosetta/src/org/jboss/soa/esb/listeners/deployers/mc/EsbWsdlDeployer.java
I'm currently adding this to the Deployment units metadata locations using deploymentUnit.appendMetaDataLocation(dynamicRoot.getRoot()) which I was advised on doing by Ales. I have previously adding it to the classpath but the classpath gets ignored by the tomcat deployer which can be seen in server.log.

3. Generate a ws provider which sets the 'wsdlLocation' attribute to the wsld generated above. This is done by the following deployer:
http://anonsvn.jboss.org/repos/labs/labs/jbossesb/workspace/dbevenius/jbossas5/product/rosetta/src/org/jboss/soa/esb/listeners/deployers/mc/EsbWebServiceDeployer.java


Upon deployment the following error message is displayed:

  | Caused by: java.io.IOException: Child not found WEB-INF/wsdl/ESBServiceSample/HelloWorldPubService.wsdl for
  | DelegatingHandler at 18297205[path=Quickstart_publish_as_webservice.esb context=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/ real=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/Quickstart_publish_as_webservice.esb], available children:
  | [ZipEntryHandler at 32154980[path=Quickstart_publish_as_webservice.esb/.classpath context=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/ real=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/Quickstart_publish_as_webservice.esb/.classpath],
  | ZipEntryHandler at 1067582[path=Quickstart_publish_as_webservice.esb/.project context=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/ real=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/Quickstart_publish_as_webservice.esb/.project],
  | ZipEntryHandler at 24788458[path=Quickstart_publish_as_webservice.esb/META-INF context=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/ real=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/Quickstart_publish_as_webservice.esb/META-INF],
  | ZipEntryHandler at 7797905[path=Quickstart_publish_as_webservice.esb/fault.xsd context=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/ real=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/Quickstart_publish_as_webservice.esb/fault.xsd],
  | ZipEntryHandler at 29339526[path=Quickstart_publish_as_webservice.esb/jbmq-queue-service.xml context=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/ real=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/Quickstart_publish_as_webservice.esb/jbmq-queue-service.xml],
  | ZipEntryHandler at 27043349[path=Quickstart_publish_as_webservice.esb/org context=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/ real=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/Quickstart_publish_as_webservice.esb/org],
  | ZipEntryHandler at 22800383[path=Quickstart_publish_as_webservice.esb/request.xsd context=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/ real=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/Quickstart_publish_as_webservice.esb/request.xsd],
  | ZipEntryHandler at 14430122[path=Quickstart_publish_as_webservice.esb/response.xsd context=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/ real=file:/opt/jboss/as/jboss-5.0.1.GA/server/default/deploy/Quickstart_publish_as_webservice.esb/response.xsd]]
  |   at org.jboss.virtual.VirtualFile.findChild(VirtualFile.java:461)
  |   at org.jboss.metadata.serviceref.VirtualFileAdaptor.findChild(VirtualFileAdaptor.java:99)
  |   at org.jboss.wsf.framework.deployment.ArchiveDeploymentImpl.getMetaDataFileURL(ArchiveDeploymentImpl.java:97)
  |   at org.jboss.ws.metadata.builder.jaxws.JAXWSProviderMetaDataBuilder.buildProviderMetaData(JAXWSProviderMetaDataBuilder.java:125)
  |   at org.jboss.ws.metadata.builder.jaxws.JAXWSServerMetaDataBuilder.setupProviderOrWebService(JAXWSServerMetaDataBuilder.java:55)
  |   at org.jboss.ws.metadata.builder.jaxws.JAXWSMetaDataBuilderJSE.buildMetaData(JAXWSMetaDataBuilderJSE.java:61)
  |   ... 24 more
  | 

As far as I can tell the WS deployers do not use the metadata location on the deployment unit. I can't see that deployment unit's metadata location is used when JAXWSProviderMetaDataBuilder tries to locate the wsdl.

When a org.jboss.wsf.framework.deployment.ArchiveDeploymentImpl is created by newDeployment(DeploymentUnit) in AbstractDeployerHook, only the deployment unit's simpleName and classloader are used.
ArchiveDeployerHook which extends AbstractDeployerHook attaches the deployment unit (to the ArchiveDeployment), so it would be available to JAXWSProviderMetaDataBuilder and could potentially be used to search for a wsdl set by an earlier deployer. This would require a code modification though.

In JAXWSProviderMetaDataBuilder, line 121

  | // Process WSDL
  | String wsdlLocation = anWebServiceProvider.wsdlLocation();
  | if (wsdlLocation.length() > 0)
  | {
  |    URL wsdlURL = dep.getMetaDataFileURL(wsdlLocation);
  |    serviceMetaData.setWsdlLocation(wsdlURL); // This is line 125 if you are following the above stacktrace
  | }
  | 

The field dep is an instance of ArchiveDeplomentImpl and its getMetaDataFileUrl looks like this:

  | public URL getMetaDataFileURL(String resourcePath) throws IOException
  | {
  | URL resourceURL = null;
  | if (resourcePath != null && resourcePath.length() > 0)
  | {
  |    if (resourcePath.startsWith("/"))
  |       resourcePath = resourcePath.substring(1);
  | 
  |    try
  |    {
  |       // assign an absolute URL
  |       resourceURL = new URL(resourcePath);
  |    }
  |    catch (MalformedURLException ex)
  |    {
  |       // ignore
  |    }
  | 
  |    if (resourceURL == null && getRootFile() != null)
  |    {
  |       UnifiedVirtualFile vfResource = getRootFile().findChild(resourcePath);
  |       resourceURL = vfResource.toURL();
  |    }
  | }
  | 
  |    return resourceURL;
  | }
  | 

If I modify JAXWSProviderMetaDataBuilder, to something like this (pardon the ugly code here):


  | // Process WSDL
  |      String wsdlLocation = anWebServiceProvider.wsdlLocation();
  |      if (wsdlLocation.length() > 0)
  |      {
  |         URL wsdlURL = null;
  |                DeploymentUnit deploymentUnit = dep.getAttachment(DeploymentUnit.class);
  |         if (deploymentUnit instanceof VFSDeploymentUnit)
  |         {
  |             VFSDeploymentUnit vfsunit = (VFSDeploymentUnit) deploymentUnit;
  |             VirtualFile metaDataFile = vfsunit.getMetaDataFile(wsdlLocation);
  |             if (metaDataFile != null)
  |             {
  |                try
  |                {
  |                    wsdlURL = metaDataFile.toURL();
  |                }
  |                catch (URISyntaxException e)
  |                {
  |                    e.printStackTrace();
  |                }
  |             }
  |         }
  |                if (wsdlURL == null)
  |         {
  |             wsdlURL = dep.getMetaDataFileURL(wsdlLocation);
  |         }
  |                serviceMetaData.setWsdlLocation(wsdlURL);
  |      }
  | 

I updated the jbossws-native-3.0.5.GA/modules/core/pom.xml, but adding the two following dependencies to get the above code to build:

  | <dependency>
  |      <groupId>org.jboss.deployers</groupId>
  |      <artifactId>jboss-deployers-structure-spi</artifactId>
  |      <version>2.0.5.GA</version>
  |      <scope>provided</scope>
  |    </dependency>
  |    <dependency>
  |      <groupId>org.jboss.deployers</groupId>
  |      <artifactId>jboss-deployers-vfs-spi</artifactId>
  |      <version>2.0.5.GA</version>
  |      <scope>provided</scope>
  | </dependency>
  | 

Using this it works for me but this is sort of a hack and perhaps I'm going about this in the wrong way. Is there a better/different way of achiving this?


Thanks,

/Daniel 

View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4225871#4225871

Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4225871



More information about the jbossws-dev mailing list