Author: alessio.soldano(a)jboss.com
Date: 2009-07-31 13:53:40 -0400 (Fri, 31 Jul 2009)
New Revision: 10440
Added:
stack/cxf/trunk/modules/server/src/main/java/org/jboss/wsf/stack/cxf/SoapTransportFactoryExt.java
Modified:
stack/cxf/trunk/modules/server/src/main/java/org/jboss/wsf/stack/cxf/CXFServletExt.java
Log:
[JBWS-2707] Modifying CXFServletExt for using CXF > 2.2.2
[JBWS-1655] Providing custom SoapTransportFactory for controlling soap:address rewrite
(WIP)
Modified:
stack/cxf/trunk/modules/server/src/main/java/org/jboss/wsf/stack/cxf/CXFServletExt.java
===================================================================
---
stack/cxf/trunk/modules/server/src/main/java/org/jboss/wsf/stack/cxf/CXFServletExt.java 2009-07-31
17:43:17 UTC (rev 10439)
+++
stack/cxf/trunk/modules/server/src/main/java/org/jboss/wsf/stack/cxf/CXFServletExt.java 2009-07-31
17:53:40 UTC (rev 10440)
@@ -34,10 +34,13 @@
import javax.xml.ws.WebServiceException;
import org.apache.cxf.BusFactory;
+import org.apache.cxf.transport.DestinationFactory;
+import org.apache.cxf.transport.DestinationFactoryManager;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.apache.cxf.transport.servlet.ServletController;
import org.apache.cxf.transport.servlet.ServletTransportFactory;
import org.jboss.logging.Logger;
+import org.jboss.ws.Constants;
import org.jboss.wsf.common.ObjectNameFactory;
import org.jboss.wsf.spi.SPIProvider;
import org.jboss.wsf.spi.SPIProviderResolver;
@@ -98,6 +101,12 @@
ServletContext svCtx = getServletContext();
ApplicationContext appCtx =
(ApplicationContext)svCtx.getAttribute("org.springframework.web.context.WebApplicationContext.ROOT");
+ //Install our SoapTransportFactory to allow for proper soap address rewrite
+ DestinationFactoryManager dfm =
getBus().getExtension(DestinationFactoryManager.class);
+ DestinationFactory factory = new SoapTransportFactoryExt();
+ dfm.registerDestinationFactory(Constants.NS_SOAP11, factory);
+ dfm.registerDestinationFactory(Constants.NS_SOAP12, factory);
+
loadAdditionalConfigExt(appCtx, servletConfig);
}
@@ -125,6 +134,7 @@
}
}
+ //required up to CXF 2.2.2
@Override
public void service(HttpServletRequest req, HttpServletResponse res) throws
ServletException, IOException
{
@@ -141,6 +151,28 @@
BusFactory.setThreadDefaultBus(null);
}
}
+
+ //required for CXF 2.2.3 or greater
+ @Override
+ protected void invoke(HttpServletRequest req, HttpServletResponse res) throws
ServletException
+ {
+ try
+ {
+ BusFactory.setThreadDefaultBus(getBus());
+ EndpointAssociation.setEndpoint(endpoint);
+ RequestHandler requestHandler = (RequestHandler)endpoint.getRequestHandler();
+ requestHandler.handleHttpRequest(endpoint, req, res, getServletContext());
+ }
+ catch (IOException ioe)
+ {
+ throw new ServletException(ioe);
+ }
+ finally
+ {
+ EndpointAssociation.removeEndpoint();
+ BusFactory.setThreadDefaultBus(null);
+ }
+ }
@Override
public void destroy()
Added:
stack/cxf/trunk/modules/server/src/main/java/org/jboss/wsf/stack/cxf/SoapTransportFactoryExt.java
===================================================================
---
stack/cxf/trunk/modules/server/src/main/java/org/jboss/wsf/stack/cxf/SoapTransportFactoryExt.java
(rev 0)
+++
stack/cxf/trunk/modules/server/src/main/java/org/jboss/wsf/stack/cxf/SoapTransportFactoryExt.java 2009-07-31
17:53:40 UTC (rev 10440)
@@ -0,0 +1,160 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.jboss.wsf.stack.cxf;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.wsdl.Port;
+
+import org.apache.cxf.binding.soap.SoapTransportFactory;
+import org.apache.cxf.binding.soap.model.SoapBindingInfo;
+import org.apache.cxf.service.model.BindingInfo;
+import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.cxf.tools.common.extensions.soap.SoapAddress;
+import org.apache.cxf.tools.util.SOAPBindingUtil;
+import org.jboss.logging.Logger;
+import org.jboss.wsf.spi.SPIProvider;
+import org.jboss.wsf.spi.SPIProviderResolver;
+import org.jboss.wsf.spi.management.ServerConfig;
+import org.jboss.wsf.spi.management.ServerConfigFactory;
+
+/**
+ * A SoapTransportFactory extending @see
org.apache.cxf.binding.soap.SoapTransportFactory.
+ * It overrides the EndpointInfo creation method to allow for the soap:address extension
+ * of the wsdl to be overwritten according to the JBossWS configuration.
+ *
+ * @author alessio.soldano(a)jboss.com
+ * @since 31-Jul-2009
+ *
+ */
+public class SoapTransportFactoryExt extends SoapTransportFactory
+{
+ private static Logger log = Logger.getLogger(SoapTransportFactoryExt.class);
+ private ServerConfig serverConfig;
+
+ public EndpointInfo createEndpointInfo(ServiceInfo serviceInfo, BindingInfo b, Port
port)
+ {
+ String transportURI = "http://schemas.xmlsoap.org/wsdl/soap/";
+ if (b instanceof SoapBindingInfo)
+ {
+ SoapBindingInfo sbi = (SoapBindingInfo)b;
+ transportURI = sbi.getTransportURI();
+ }
+ ServerConfig config = getServerConfig();
+ EndpointInfo info = new CustomSoapEndpointInfo(serviceInfo, transportURI, config !=
null && config.isModifySOAPAddress());
+ if (port != null)
+ {
+ List ees = port.getExtensibilityElements();
+ for (Iterator itr = ees.iterator(); itr.hasNext();)
+ {
+ Object extensor = itr.next();
+
+ if (SOAPBindingUtil.isSOAPAddress(extensor))
+ {
+ final SoapAddress sa = SOAPBindingUtil.getSoapAddress(extensor);
+
+ info.addExtensor(sa);
+ info.setAddress(sa.getLocationURI());
+ }
+ else
+ {
+ info.addExtensor(extensor);
+ }
+ }
+ }
+ return info;
+ }
+
+ private ServerConfig getServerConfig()
+ {
+ if (serverConfig == null)
+ {
+ SPIProvider spiProvider = SPIProviderResolver.getInstance().getProvider();
+ serverConfig = spiProvider.getSPI(ServerConfigFactory.class).getServerConfig();
+ }
+ return serverConfig;
+ }
+
+ /**
+ * A custom EndpointInfo that updates the SoapAddress extension
+ * coming from the wsdl definition according to the JBossWS
+ * soap address rewrite rules.
+ *
+ */
+ private class CustomSoapEndpointInfo extends EndpointInfo
+ {
+ boolean alwaysModifyWsdl;
+ SoapAddress saddress;
+
+ CustomSoapEndpointInfo(ServiceInfo serv, String trans, boolean alwaysModifyWsdl)
+ {
+ super(serv, trans);
+ this.alwaysModifyWsdl = alwaysModifyWsdl;
+ }
+
+ public void setAddress(String s)
+ {
+ boolean currentInvalid = isCurrentAddressInvalid();
+ super.setAddress(s);
+ if (alwaysModifyWsdl || currentInvalid)
+ {
+ log.info("Setting new address: " + s);
+ if (saddress != null)
+ {
+ saddress.setLocationURI(s);
+ }
+ }
+ }
+
+ public void addExtensor(Object el)
+ {
+ super.addExtensor(el);
+ if (el instanceof SoapAddress)
+ {
+ saddress = (SoapAddress)el;
+ }
+ }
+
+ private boolean isCurrentAddressInvalid()
+ {
+ String address = super.getAddress();
+ if (address != null)
+ {
+ try
+ {
+ new URL(address);
+ }
+ catch (MalformedURLException e)
+ {
+ log.info("Forcing rewrite of invalid address: " + address);
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+}
Property changes on:
stack/cxf/trunk/modules/server/src/main/java/org/jboss/wsf/stack/cxf/SoapTransportFactoryExt.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF