You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2011/02/22 17:30:29 UTC
svn commit: r1073389 - in /cxf/trunk:
rt/transports/http-osgi/src/main/java/org/apache/cxf/transport/http_osgi/
rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/
rt/transports/http/src/test/java/org/apache/cxf/transport/servlet/ systes...
Author: sergeyb
Date: Tue Feb 22 16:30:28 2011
New Revision: 1073389
URL: http://svn.apache.org/viewvc?rev=1073389&view=rev
Log:
[CXF-3357] Improving ServletController updateDests method for multiple endpoints sharing the same servlet path be supported
Modified:
cxf/trunk/rt/transports/http-osgi/src/main/java/org/apache/cxf/transport/http_osgi/OsgiServletController.java
cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractCXFServlet.java
cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractServletController.java
cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletController.java
cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletTransportFactory.java
cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/servlet/ServletControllerTest.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSAtomBookTest.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_atom_book_json3.txt
cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_atom/WEB-INF/beans.xml
Modified: cxf/trunk/rt/transports/http-osgi/src/main/java/org/apache/cxf/transport/http_osgi/OsgiServletController.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http-osgi/src/main/java/org/apache/cxf/transport/http_osgi/OsgiServletController.java?rev=1073389&r1=1073388&r2=1073389&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http-osgi/src/main/java/org/apache/cxf/transport/http_osgi/OsgiServletController.java (original)
+++ cxf/trunk/rt/transports/http-osgi/src/main/java/org/apache/cxf/transport/http_osgi/OsgiServletController.java Tue Feb 22 16:30:28 2011
@@ -19,7 +19,6 @@
package org.apache.cxf.transport.http_osgi;
import java.io.IOException;
-import java.util.Set;
import java.util.logging.Logger;
import javax.servlet.ServletConfig;
@@ -38,7 +37,6 @@ import org.apache.cxf.transport.http.Des
import org.apache.cxf.transport.servlet.AbstractServletController;
import org.apache.cxf.transports.http.QueryHandler;
import org.apache.cxf.transports.http.QueryHandlerRegistry;
-import org.apache.cxf.wsdl.http.AddressType;
public class OsgiServletController extends AbstractServletController {
private static final Logger LOG = LogUtils.getL7dLogger(OsgiServletController.class);
@@ -49,25 +47,7 @@ public class OsgiServletController exten
super(config, destinationRegistry, serviceListGenerator);
}
- private synchronized void updateDests(HttpServletRequest request) {
- if (disableAddressUpdates) {
- return;
- }
- String base = forcedBaseAddress == null ? getBaseURL(request) : forcedBaseAddress;
-
- Set<String> paths = destinationRegistry.getDestinationsPaths();
- for (String path : paths) {
- AbstractHTTPDestination d2 = destinationRegistry.getDestinationForPath(path);
- String ad = d2.getEndpointInfo().getAddress();
- if (ad.equals(path)) {
- d2.getEndpointInfo().setAddress(base + path);
- if (d2.getEndpointInfo().getExtensor(AddressType.class) != null) {
- d2.getEndpointInfo().getExtensor(AddressType.class).setLocation(base + path);
- }
- }
- }
- }
-
+
public void invoke(HttpServletRequest request, HttpServletResponse res) throws ServletException {
try {
String address = request.getPathInfo() == null ? "" : request.getPathInfo();
@@ -78,7 +58,7 @@ public class OsgiServletController exten
|| request.getRequestURI().endsWith(serviceListRelativePath + "/"))
|| StringUtils.isEmpty(request.getPathInfo())
|| "/".equals(request.getPathInfo())) {
- updateDests(request);
+ updateDests(request, true);
serviceListGenerator.service(request, res);
} else {
d = destinationRegistry.checkRestfulRequest(address);
Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractCXFServlet.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractCXFServlet.java?rev=1073389&r1=1073388&r2=1073389&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractCXFServlet.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractCXFServlet.java Tue Feb 22 16:30:28 2011
@@ -61,7 +61,6 @@ public abstract class AbstractCXFServlet
new ServletController(servletTransportFactory.getRegistry(),
servletConfig,
serviceListGeneratorServlet);
- servletTransportFactory.setServletController(newController);
if (servletConfig.getInitParameter("disable-address-updates") == null) {
newController.setDisableAddressUpdates(disableAddressUpdates);
}
Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractServletController.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractServletController.java?rev=1073389&r1=1073388&r2=1073389&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractServletController.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractServletController.java Tue Feb 22 16:30:28 2011
@@ -21,6 +21,7 @@ package org.apache.cxf.transport.servlet
import java.io.IOException;
import java.io.OutputStream;
+import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -38,6 +39,8 @@ import org.apache.cxf.transport.http.Abs
import org.apache.cxf.transport.http.DestinationRegistry;
import org.apache.cxf.transports.http.QueryHandler;
import org.apache.cxf.transports.http.QueryHandlerRegistry;
+import org.apache.cxf.wsdl.WSDLLibrary;
+import org.apache.cxf.wsdl.http.AddressType;
public abstract class AbstractServletController {
protected static final String DEFAULT_LISTINGS_CLASSIFIER = "/services";
@@ -83,6 +86,50 @@ public abstract class AbstractServletCon
title = t;
}
+ protected synchronized void updateDests(HttpServletRequest request) {
+ updateDests(request, false);
+ }
+
+ protected synchronized void updateDests(HttpServletRequest request, boolean force) {
+
+ String base = forcedBaseAddress == null ? getBaseURL(request) : forcedBaseAddress;
+
+ String pathInfo = request.getPathInfo();
+ if (pathInfo == null) {
+ pathInfo = "/";
+ }
+
+ Set<String> paths = destinationRegistry.getDestinationsPaths();
+ for (String path : paths) {
+ if (!force && pathInfo != null && !pathInfo.startsWith(path)) {
+ continue;
+ }
+ AbstractHTTPDestination d2 = destinationRegistry.getDestinationForPath(path);
+ String ad = d2.getEndpointInfo().getAddress();
+ if (ad == null
+ && d2.getAddress() != null
+ && d2.getAddress().getAddress() != null) {
+ ad = d2.getAddress().getAddress().getValue();
+ if (ad == null) {
+ ad = "/";
+ }
+ }
+ if (ad != null
+ && (ad.equals(path))) {
+ if (disableAddressUpdates) {
+ request.setAttribute("org.apache.cxf.transport.endpoint.address",
+ base + path);
+ } else {
+ d2.getEndpointInfo().setAddress(base + path);
+ if (WSDLLibrary.isAvailable()
+ && d2.getEndpointInfo().getExtensor(AddressType.class) != null) {
+ d2.getEndpointInfo().getExtensor(AddressType.class).setLocation(base + path);
+ }
+ }
+ }
+ }
+ }
+
private void init() {
if (servletConfig == null) {
return;
Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletController.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletController.java?rev=1073389&r1=1073388&r2=1073389&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletController.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletController.java Tue Feb 22 16:30:28 2011
@@ -20,7 +20,6 @@ package org.apache.cxf.transport.servlet
import java.io.IOException;
import java.io.OutputStream;
-import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -39,13 +38,10 @@ import org.apache.cxf.transport.http.Abs
import org.apache.cxf.transport.http.DestinationRegistry;
import org.apache.cxf.transports.http.QueryHandler;
import org.apache.cxf.transports.http.QueryHandlerRegistry;
-import org.apache.cxf.wsdl.WSDLLibrary;
-import org.apache.cxf.wsdl.http.AddressType;
public class ServletController extends AbstractServletController {
private static final Logger LOG = LogUtils.getL7dLogger(ServletController.class);
- private volatile String lastBase = "";
public ServletController(DestinationRegistry destinationRegistry,
ServletConfig config,
@@ -53,67 +49,24 @@ public class ServletController extends A
super(config, destinationRegistry, serviceListGeneratorServlet);
}
- String getLastBaseURL() {
- return lastBase;
- }
-
- protected synchronized void updateDests(HttpServletRequest request) {
-
- String base = forcedBaseAddress == null ? getBaseURL(request) : forcedBaseAddress;
-
- if (base.equals(lastBase)) {
- return;
- }
- Set<String> paths = destinationRegistry.getDestinationsPaths();
- for (String path : paths) {
- AbstractHTTPDestination d2 = destinationRegistry.getDestinationForPath(path);
- String ad = d2.getEndpointInfo().getAddress();
- if (ad == null
- && d2.getAddress() != null
- && d2.getAddress().getAddress() != null) {
- ad = d2.getAddress().getAddress().getValue();
- if (ad == null) {
- ad = "/";
- }
- }
- if (ad != null
- && (ad.equals(path)
- || ad.equals(lastBase + path))) {
- if (disableAddressUpdates) {
- request.setAttribute("org.apache.cxf.transport.endpoint.address", base + path);
- } else {
- d2.getEndpointInfo().setAddress(base + path);
- if (WSDLLibrary.isAvailable()
- && d2.getEndpointInfo().getExtensor(AddressType.class) != null) {
- d2.getEndpointInfo().getExtensor(AddressType.class).setLocation(base + path);
- }
- }
- }
- }
- if (disableAddressUpdates) {
- return;
- }
- lastBase = base;
- }
-
public void invoke(HttpServletRequest request, HttpServletResponse res)
throws ServletException {
try {
EndpointInfo ei = new EndpointInfo();
- String address = request.getPathInfo() == null ? "" : request.getPathInfo();
- ei.setAddress(address);
+ String pathInfo = request.getPathInfo() == null ? "" : request.getPathInfo();
+ ei.setAddress(pathInfo);
AbstractHTTPDestination d = destinationRegistry.getDestinationForPath(ei.getAddress(), true);
if (d == null) {
if (!isHideServiceList && (request.getRequestURI().endsWith(serviceListRelativePath)
|| request.getRequestURI().endsWith(serviceListRelativePath + "/")
- || StringUtils.isEmpty(request.getPathInfo())
- || "/".equals(request.getPathInfo()))) {
- updateDests(request);
+ || StringUtils.isEmpty(pathInfo)
+ || "/".equals(pathInfo))) {
+ updateDests(request, true);
serviceListGenerator.service(request, res);
} else {
- d = destinationRegistry.checkRestfulRequest(address);
+ d = destinationRegistry.checkRestfulRequest(pathInfo);
if (d == null) {
LOG.warning("Can't find the request for "
+ request.getRequestURL() + "'s Observer ");
Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletTransportFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletTransportFactory.java?rev=1073389&r1=1073388&r2=1073389&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletTransportFactory.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletTransportFactory.java Tue Feb 22 16:30:28 2011
@@ -27,19 +27,15 @@ import java.util.List;
import javax.annotation.Resource;
import org.apache.cxf.Bus;
-import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.service.model.EndpointInfo;
import org.apache.cxf.transport.Destination;
import org.apache.cxf.transport.DestinationFactory;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
import org.apache.cxf.transport.http.AbstractHTTPTransportFactory;
-import org.apache.cxf.wsdl.http.AddressType;
public class ServletTransportFactory extends AbstractHTTPTransportFactory
implements DestinationFactory {
- private ServletController controller;
-
public ServletTransportFactory(Bus b) {
super.setBus(b);
List<String> ids = Arrays.asList(new String[] {
@@ -54,10 +50,6 @@ public class ServletTransportFactory ext
public ServletTransportFactory() {
}
- public void setServletController(ServletController c) {
- controller = c;
- }
-
@Resource(name = "cxf")
public void setBus(Bus b) {
super.setBus(b);
@@ -70,20 +62,6 @@ public class ServletTransportFactory ext
String path = registry.getTrimmedPath(endpointInfo.getAddress());
d = new ServletDestination(getBus(), registry, endpointInfo, path);
registry.addDestination(path, d);
-
- if (controller != null
- && !StringUtils.isEmpty(controller.getLastBaseURL())) {
- String ad = d.getEndpointInfo().getAddress();
- if (ad != null
- && (ad.equals(path)
- || ad.equals(controller.getLastBaseURL() + path))) {
- d.getEndpointInfo().setAddress(controller.getLastBaseURL() + path);
- if (d.getEndpointInfo().getExtensor(AddressType.class) != null) {
- d.getEndpointInfo().getExtensor(AddressType.class)
- .setLocation(controller.getLastBaseURL() + path);
- }
- }
- }
}
return d;
}
Modified: cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/servlet/ServletControllerTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/servlet/ServletControllerTest.java?rev=1073389&r1=1073388&r2=1073389&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/servlet/ServletControllerTest.java (original)
+++ cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/servlet/ServletControllerTest.java Tue Feb 22 16:30:28 2011
@@ -19,6 +19,7 @@
package org.apache.cxf.transport.servlet;
import java.io.IOException;
+import java.util.Collections;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
@@ -50,13 +51,19 @@ public class ServletControllerTest exten
private void setReq(String pathInfo, String requestUri, String styleSheet, String formatted) {
req.getPathInfo();
- EasyMock.expectLastCall().andReturn(pathInfo);
+ EasyMock.expectLastCall().andReturn(pathInfo).anyTimes();
req.getRequestURI();
EasyMock.expectLastCall().andReturn(requestUri);
req.getParameter("stylesheet");
EasyMock.expectLastCall().andReturn(styleSheet);
req.getParameter("formatted");
EasyMock.expectLastCall().andReturn(formatted);
+ req.getRequestURL();
+ EasyMock.expectLastCall().andReturn(new StringBuffer("http://localhost:8080" + requestUri));
+ registry.getDestinationsPaths();
+ EasyMock.expectLastCall().andReturn(Collections.emptySet()).atLeastOnce();
+ registry.getDestinationForPath("", true);
+ EasyMock.expectLastCall().andReturn(null).anyTimes();
}
private void expectServiceListGeneratorCalled() throws ServletException, IOException {
@@ -72,7 +79,7 @@ public class ServletControllerTest exten
public void testGenerateServiceListing() throws Exception {
setReq(null, "/services", null, "true");
expectServiceListGeneratorCalled();
- EasyMock.replay(req, serviceListGenerator);
+ EasyMock.replay(req, registry, serviceListGenerator);
TestServletController sc = new TestServletController(registry, serviceListGenerator);
sc.invoke(req, res);
assertFalse(sc.invokeDestinationCalled());
@@ -81,16 +88,22 @@ public class ServletControllerTest exten
@Test
public void testGenerateUnformattedServiceListing() throws Exception {
req.getPathInfo();
- EasyMock.expectLastCall().andReturn(null);
+ EasyMock.expectLastCall().andReturn(null).anyTimes();
req.getRequestURI();
EasyMock.expectLastCall().andReturn("/services");
req.getParameter("stylesheet");
EasyMock.expectLastCall().andReturn(null);
req.getParameter("formatted");
EasyMock.expectLastCall().andReturn("false");
+ req.getRequestURL();
+ EasyMock.expectLastCall().andReturn(new StringBuffer("http://localhost:8080/services"));
+ registry.getDestinationsPaths();
+ EasyMock.expectLastCall().andReturn(Collections.emptySet()).atLeastOnce();
+ registry.getDestinationForPath("", true);
+ EasyMock.expectLastCall().andReturn(null).anyTimes();
expectServiceListGeneratorCalled();
- EasyMock.replay(req, serviceListGenerator);
+ EasyMock.replay(req, registry, serviceListGenerator);
TestServletController sc = new TestServletController(registry, serviceListGenerator);
sc.invoke(req, res);
@@ -121,7 +134,7 @@ public class ServletControllerTest exten
public void testDifferentServiceListPath() throws Exception {
setReq(null, "/listing", null, "true");
expectServiceListGeneratorCalled();
- EasyMock.replay(req, serviceListGenerator);
+ EasyMock.replay(req, registry, serviceListGenerator);
TestServletController sc = new TestServletController(registry, serviceListGenerator);
sc.setServiceListRelativePath("/listing");
sc.invoke(req, res);
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSAtomBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSAtomBookTest.java?rev=1073389&r1=1073388&r2=1073389&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSAtomBookTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSAtomBookTest.java Tue Feb 22 16:30:28 2011
@@ -50,7 +50,7 @@ public class JAXRSAtomBookTest extends A
@BeforeClass
public static void startServers() throws Exception {
assertTrue("server did not launch correctly",
- launchServer(AtomBookServer.class));
+ launchServer(AtomBookServer.class, true));
}
@Test
@@ -145,7 +145,7 @@ public class JAXRSAtomBookTest extends A
@Test
public void testGetBooks3() throws Exception {
- getAndCompareJson("http://localhost:" + PORT + "/atom/atom/books/entries/123.json",
+ getAndCompareJson("http://localhost:" + PORT + "/atom/atomservice3/atom/books/entries/123.json",
"resources/expected_atom_book_json3.txt",
"*/*");
}
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_atom_book_json3.txt
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_atom_book_json3.txt?rev=1073389&r1=1073388&r2=1073389&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_atom_book_json3.txt (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/expected_atom_book_json3.txt Tue Feb 22 16:30:28 2011
@@ -9,6 +9,6 @@
]
},
"attributes":{
- "xml:base":"http://localhost:9080/atom/atom/books/entries/123"
+ "xml:base":"http://localhost:9080/atom/atomservice3/atom/books/entries/123"
}
}
\ No newline at end of file
Modified: cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_atom/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_atom/WEB-INF/beans.xml?rev=1073389&r1=1073388&r2=1073389&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_atom/WEB-INF/beans.xml (original)
+++ cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_atom/WEB-INF/beans.xml Tue Feb 22 16:30:28 2011
@@ -69,7 +69,7 @@ http://cxf.apache.org/schemas/jaxrs.xsd"
</jaxrs:server>
<jaxrs:server id="atomservice3"
- address="/">
+ address="/atomservice3">
<jaxrs:serviceBeans>
<ref bean="atomstore3"/>
</jaxrs:serviceBeans>