Bug 779977 (SOA-2337)

Summary: CXF wsdl parsing must resolve schemas/dtds locally
Product: [JBoss] JBoss Enterprise SOA Platform 5 Reporter: Kevin Conner <kevin.conner>
Component: JBossWSAssignee: Kevin Conner <kevin.conner>
Status: CLOSED NEXTRELEASE QA Contact:
Severity: urgent Docs Contact:
Priority: urgent    
Version: 5.1.0.ER1CC: darran.lofthouse
Target Milestone: ---   
Target Release: 5.1.0 GA   
Hardware: Unspecified   
OS: Unspecified   
URL: http://jira.jboss.org/jira/browse/SOA-2337
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2011-02-11 04:07:40 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Attachments:
Description Flags
juddiv3.war.new
none
XMLCatalog.jar none

Description Kevin Conner 2010-09-22 05:30:43 UTC
project_key: SOA

Initially I thought this was a regression of a SOA 5 issue, where we needed to add the xmldsig-core-schema.xsd to the local resolver, however it would appear to be worse as there are requests being made for other files.

I deployed the juddiv3.war to a SOA server configured with CXF and snooped the network accesses while requesting a single service wsdl, this resulted in network requests for xmldsig-core-schema.xsd, XMLSchema.dtd, datatypes.xsd and xml.xsd.

A quick count of the GET requests suggests that there are about 84 remote requests being made to resolve the above files.

Comment 1 Kevin Conner 2010-09-22 05:31:16 UTC
juddiv3.war file being deployed

Comment 2 Kevin Conner 2010-09-22 05:31:16 UTC
Attachment: Added: juddiv3.war.new


Comment 3 Kevin Conner 2010-09-22 05:31:55 UTC
WSDL being requested in this test was http://127.0.0.1:8080/juddiv3/services/replication?wsdl


Comment 4 Kevin Conner 2010-09-22 05:32:51 UTC
Stack showing a remote access

Daemon Thread [http-127.0.0.1-8080-1] (Suspended)	
	java.net.PlainSocketImpl.socketConnect(java.net.InetAddress, int, int) line: not available [native method]	
	java.net.SocksSocketImpl(java.net.PlainSocketImpl).doConnect(java.net.InetAddress, int, int) line: 333	
	java.net.SocksSocketImpl(java.net.PlainSocketImpl).connectToAddress(java.net.InetAddress, int, int) line: 195	
	java.net.SocksSocketImpl(java.net.PlainSocketImpl).connect(java.net.SocketAddress, int) line: 182	
	java.net.SocksSocketImpl.connect(java.net.SocketAddress, int) line: 366	
	java.net.Socket.connect(java.net.SocketAddress, int) line: 525	
	sun.net.www.http.HttpClient(sun.net.NetworkClient).doConnect(java.lang.String, int) line: 158	
	sun.net.www.http.HttpClient.openServer(java.lang.String, int) line: 394	
	sun.net.www.http.HttpClient.openServer() line: 529	
	sun.net.www.http.HttpClient.<init>(java.net.URL, java.net.Proxy, int) line: 233	
	sun.net.www.http.HttpClient.New(java.net.URL, java.net.Proxy, int, boolean) line: 306	
	sun.net.www.http.HttpClient.New(java.net.URL, java.net.Proxy, int) line: 323	
	sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(java.net.URL, java.net.Proxy, int) line: 860	
	sun.net.www.protocol.http.HttpURLConnection.plainConnect() line: 801	
	sun.net.www.protocol.http.HttpURLConnection.connect() line: 726	
	sun.net.www.protocol.http.HttpURLConnection.getInputStream() line: 1049	
	sun.net.www.protocol.http.HttpURLConnection(java.net.HttpURLConnection).getResponseCode() line: 373	
	org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal() line: 2110	
	org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse() line: 2087	
	org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close() line: 1985	
	org.apache.cxf.transport.http.HTTPConduit(org.apache.cxf.transport.AbstractConduit).close(org.apache.cxf.message.Message) line: 66	
	org.apache.cxf.transport.http.HTTPConduit.close(org.apache.cxf.message.Message) line: 640	
	org.apache.cxf.transport.TransportURIResolver.resolve(java.lang.String, java.lang.String) line: 112	
	org.apache.cxf.catalog.CatalogWSDLLocator.getImportInputSource(java.lang.String, java.lang.String) line: 118	
	org.apache.cxf.wsdl11.ResourceManagerWSDLLocator(org.apache.cxf.wsdl11.AbstractWrapperWSDLLocator).getImportInputSource(java.lang.String, java.lang.String) line: 85	
	com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(java.lang.Class, org.w3c.dom.Element, javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry) line: 752	
	com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(java.lang.Class, org.w3c.dom.Element, javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry) line: 842	
	com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(java.lang.Class, org.w3c.dom.Element, javax.wsdl.Definition) line: 632	
	com.ibm.wsdl.xml.WSDLReaderImpl.parseTypes(org.w3c.dom.Element, javax.wsdl.Definition) line: 593	
	com.ibm.wsdl.xml.WSDLReaderImpl.parseDefinitions(java.lang.String, org.w3c.dom.Element, java.util.Map) line: 305	
	com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(java.lang.String, org.w3c.dom.Element, java.util.Map) line: 2265	
	com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(javax.wsdl.xml.WSDLLocator, org.w3c.dom.Element) line: 2251	
	org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(java.lang.String) line: 230	
	org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(java.lang.String) line: 179	
	org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(org.apache.cxf.Bus, java.lang.String, javax.xml.namespace.QName) line: 91	
	org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean(org.apache.cxf.service.factory.ReflectionServiceFactoryBean).buildServiceFromWSDL(java.lang.String) line: 403	
	org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean(org.apache.cxf.service.factory.ReflectionServiceFactoryBean).initializeServiceModel() line: 528	
	org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean(org.apache.cxf.service.factory.ReflectionServiceFactoryBean).create() line: 278	
	org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create() line: 178	
	org.apache.cxf.jaxws.JaxWsServerFactoryBean(org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory).createEndpoint() line: 100	
	org.apache.cxf.jaxws.JaxWsServerFactoryBean(org.apache.cxf.frontend.ServerFactoryBean).create() line: 105	
	org.apache.cxf.jaxws.JaxWsServerFactoryBean.create() line: 167	
	org.apache.cxf.jaxws.spring.EndpointDefinitionParser$SpringEndpointImpl(org.apache.cxf.jaxws.EndpointImpl).getServer(java.lang.String) line: 346	
	org.apache.cxf.jaxws.spring.EndpointDefinitionParser$SpringEndpointImpl(org.apache.cxf.jaxws.EndpointImpl).doPublish(java.lang.String) line: 259	
	org.apache.cxf.jaxws.spring.EndpointDefinitionParser$SpringEndpointImpl(org.apache.cxf.jaxws.EndpointImpl).publish(java.lang.String) line: 209	
	org.apache.cxf.jaxws.spring.EndpointDefinitionParser$SpringEndpointImpl(org.apache.cxf.jaxws.EndpointImpl).publish() line: 404	
	sun.reflect.GeneratedMethodAccessor367.invoke(java.lang.Object, java.lang.Object[]) line: not available	
	sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) line: 25	
	java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object...) line: 597	
	org.springframework.beans.factory.support.DefaultListableBeanFactory(org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory).invokeCustomInitMethod(java.lang.String, java.lang.Object, java.lang.String, boolean) line: 1414	
	org.springframework.beans.factory.support.DefaultListableBeanFactory(org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory).invokeInitMethods(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition) line: 1375	
	org.springframework.beans.factory.support.DefaultListableBeanFactory(org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory).initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition) line: 1335	
	org.springframework.beans.factory.support.DefaultListableBeanFactory(org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory).doCreateBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[]) line: 473	
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run() line: 409	
	java.security.AccessController.doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext) line: not available [native method]	
	org.springframework.beans.factory.support.DefaultListableBeanFactory(org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory).createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[]) line: 380	
	org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject() line: 264	
	org.springframework.beans.factory.support.DefaultListableBeanFactory(org.springframework.beans.factory.support.DefaultSingletonBeanRegistry).getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory) line: 222	
	org.springframework.beans.factory.support.DefaultListableBeanFactory(org.springframework.beans.factory.support.AbstractBeanFactory).doGetBean(java.lang.String, java.lang.Class, java.lang.Object[], boolean) line: 261	
	org.springframework.beans.factory.support.DefaultListableBeanFactory(org.springframework.beans.factory.support.AbstractBeanFactory).getBean(java.lang.String, java.lang.Class, java.lang.Object[]) line: 185	
	org.springframework.beans.factory.support.DefaultListableBeanFactory(org.springframework.beans.factory.support.AbstractBeanFactory).getBean(java.lang.String) line: 164	
	org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons() line: 429	
	org.springframework.context.support.GenericApplicationContext(org.springframework.context.support.AbstractApplicationContext).finishBeanFactoryInitialization(org.springframework.beans.factory.config.ConfigurableListableBeanFactory) line: 728	
	org.springframework.context.support.GenericApplicationContext(org.springframework.context.support.AbstractApplicationContext).refresh() line: 380	
	org.jboss.wsf.stack.cxf.CXFServletExt.loadAdditionalConfigExt(org.springframework.context.ApplicationContext, javax.servlet.ServletConfig) line: 151	
	org.jboss.wsf.stack.cxf.CXFServletExt.loadBus(javax.servlet.ServletConfig) line: 109	
	org.jboss.wsf.stack.cxf.CXFServletExt(org.apache.cxf.transport.servlet.AbstractCXFServlet).init(javax.servlet.ServletConfig) line: 78	
	org.jboss.wsf.stack.cxf.CXFServletExt.init(javax.servlet.ServletConfig) line: 79	
	org.apache.catalina.core.StandardWrapper.loadServlet() line: 1048	
	org.apache.catalina.core.StandardWrapper.allocate() line: 777	
	org.apache.catalina.core.StandardWrapperValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) line: 129	
	org.apache.catalina.core.StandardContextValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) line: 191	
	org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) line: 183	
	org.jboss.web.tomcat.security.JaccContextValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) line: 95	
	org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response, org.jboss.servlet.http.HttpEvent) line: 126	
	org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) line: 70	
	org.apache.catalina.core.StandardHostValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) line: 127	
	org.apache.catalina.valves.ErrorReportValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) line: 102	
	org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) line: 158	
	org.apache.catalina.core.StandardEngineValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) line: 109	
	org.apache.catalina.connector.CoyoteAdapter.service(org.apache.coyote.Request, org.apache.coyote.Response) line: 330	
	org.apache.coyote.http11.Http11Processor.process(java.net.Socket) line: 829	
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(java.net.Socket) line: 598	
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run() line: 451	
	java.lang.Thread.run() line: 619	


Comment 5 Darran Lofthouse 2010-09-24 16:09:53 UTC
I think I have found a valid solution however there appears to be a bug in configuring the solution.

The Apache CXF implementation should be supporting the definition of an XML catalog within the deployment, this specifically addresses the problem we regularly see when schemas are used which are not known to JBossWS - the catalog needs to be defined in META-INF/jax-ws-catalog.xml of the deployment and can reference how to locate any required schema locally.

For some reason this is not being picked up for an exploded war deployment but I suspect this could be due to attempting to locate the META-INF on the classpath which of course it would not be for a war.

Comment 6 Darran Lofthouse 2010-09-24 17:20:01 UTC
Tracing the network calls there are actually two schemas being downloaded and two dtds.

I have a packaging so that the schemas can now be resolved locally, the dtd resolution is slightly different so continuing to investigate.


Comment 9 Darran Lofthouse 2010-10-18 12:19:58 UTC
Attaching a catalog which addresses the issue of remote access for the schemas.


Comment 10 Darran Lofthouse 2010-10-18 12:19:58 UTC
Attachment: Added: XMLCatalog.jar


Comment 11 Darran Lofthouse 2010-10-18 12:29:36 UTC
Kevin - just passing this back your way as the creator of the issue but this will most likely need to go to Trevor / Julian to be implemented as this becomes a packaging issue for the platform.

It is not feasible for a web services stack to be aware of all schemas that can be referenced by the deployments deployed to them, for this reason the JAX-WS 2.1 specification includes a catalog mechanism to allow additional schemas to be registered without requiring the schemas that use them to import them.

Attached to this Jira issue is an XMLCatalog.jar that contains such a definition, this should be placed in: -
  {jboss.home}/server/default/deploy/juddiv3.war/WEB-INF/lib

The jax-ws-catalog.xml contains the required definitions for xmldsig-core-schema.xsd and xml.xsd

The DOCTYPE at the top of the xmldsig-core-schema.xsd has also been changed from PUBLIC to SYSTEM to reference a local copy of XMLSchema.dtd.  This change was required as the xmldsig-core-schema.xsd is parsed using a DocumentBuilder that we have no option to set an EntityResolver.

Finally datatypes.dtd is also indirectly referenced so needs to be included in the jar.

Once this jar is in place no breakpoints are hit initialising the endpoint establishing socket connections.


Comment 12 Kevin Conner 2010-10-22 09:23:35 UTC
Link: Added: This issue depends JBESB-3518


Comment 13 Kevin Conner 2010-10-22 09:26:00 UTC
The jax-ws catalog has been added into the juddi webservices war and tested on both CXF and native.

Comment 15 Dana Mison 2011-01-05 00:14:40 UTC
Writer: Added: dlesage


Comment 16 David Le Sage 2011-02-11 04:04:55 UTC
Temporarily reopening to update release note info.

Comment 17 David Le Sage 2011-02-11 04:07:08 UTC
Release Notes Docs Status: Added: Documented as Resolved Issue
Release Notes Text: Added: https://issues.jboss.org/browse/JBESB-3518

The CXF integration required an XML catalogue to be specified as it would otherwise try to resolve the schemas remotely. To fix this problem, a jax-ws catalog for juddi webservices has been added.