You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cxf.apache.org by Sergey Beryozkin <sb...@gmail.com> on 2011/03/23 11:58:40 UTC
Re: svn commit: r1084534 - in /cxf/trunk/rt/transports:
http-osgi/src/main/java/org/apache/cxf/transport/http_osgi/
http-osgi/src/test/java/org/apache/cxf/transport/http_osgi/
http/src/main/java/org/apache/cxf/transport/servlet/ http/src/test/java/or
Hi Christian
On Wed, Mar 23, 2011 at 10:50 AM, <cs...@apache.org> wrote:
> Author: cschneider
> Date: Wed Mar 23 10:50:20 2011
> New Revision: 1084534
>
> URL: http://svn.apache.org/viewvc?rev=1084534&view=rev
> Log:
> Make servlet and osgi transports more alike. There is one failing test in
> jax-rs. Trying to fix that later
>
Why postpone fixing the failing test? Can it get fixed now ?
What is the idea behind introducing CXFSpringServlet ?
thanks, Sergey
>
> Added:
>
> cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/CXFSpringServlet.java
> Modified:
>
> cxf/trunk/rt/transports/http-osgi/src/main/java/org/apache/cxf/transport/http_osgi/OsgiServletController.java
>
> cxf/trunk/rt/transports/http-osgi/src/test/java/org/apache/cxf/transport/http_osgi/OsgiServletTest.java
>
> cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletController.java
>
> cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/servlet/ServletControllerTest.java
>
> 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=1084534&r1=1084533&r2=1084534&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
> Wed Mar 23 10:50:20 2011
> @@ -50,18 +50,18 @@ public class OsgiServletController exten
>
> public void invoke(HttpServletRequest request, HttpServletResponse res)
> throws ServletException {
> try {
> - String address = request.getPathInfo() == null ? "" :
> request.getPathInfo();
> - AbstractHTTPDestination d =
> destinationRegistry.getDestinationForPath(address);
> + String pathInfo = request.getPathInfo() == null ? "" :
> request.getPathInfo();
> + AbstractHTTPDestination d =
> destinationRegistry.getDestinationForPath(pathInfo, true);
>
> if (d == null) {
> if (!isHideServiceList &&
> (request.getRequestURI().endsWith(serviceListRelativePath)
> - ||
> request.getRequestURI().endsWith(serviceListRelativePath + "/"))
> - || StringUtils.isEmpty(request.getPathInfo())
> - || "/".equals(request.getPathInfo())) {
> + ||
> request.getRequestURI().endsWith(serviceListRelativePath + "/")
> + || StringUtils.isEmpty(pathInfo)
> + || "/".equals(pathInfo))) {
> updateDests(request, true);
> serviceListGenerator.service(request, res);
> } else {
> - d = destinationRegistry.checkRestfulRequest(address);
> + d = destinationRegistry.checkRestfulRequest(pathInfo);
> if (d == null || d.getMessageObserver() == null) {
> LOG.warning("Can't find the the request for "
> + request.getRequestURL() + "'s
> Observer ");
> @@ -104,7 +104,7 @@ public class OsgiServletController exten
> respondUsingQueryHandler(selectedHandler, res,
> ei, ctxUri, baseUri);
> return;
> }
> - } else if ("/".equals(address) || address.length() ==
> 0) {
> + } else if ("/".equals(pathInfo) || pathInfo.length()
> == 0) {
> updateDests(request);
> }
> invokeDestination(request, res, d);
>
> Modified:
> cxf/trunk/rt/transports/http-osgi/src/test/java/org/apache/cxf/transport/http_osgi/OsgiServletTest.java
> URL:
> http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http-osgi/src/test/java/org/apache/cxf/transport/http_osgi/OsgiServletTest.java?rev=1084534&r1=1084533&r2=1084534&view=diff
>
> ==============================================================================
> ---
> cxf/trunk/rt/transports/http-osgi/src/test/java/org/apache/cxf/transport/http_osgi/OsgiServletTest.java
> (original)
> +++
> cxf/trunk/rt/transports/http-osgi/src/test/java/org/apache/cxf/transport/http_osgi/OsgiServletTest.java
> Wed Mar 23 10:50:20 2011
> @@ -203,9 +203,7 @@ public class OsgiServletTest extends Ass
> EasyMock.expect(request.getContextPath()).andReturn("");
> EasyMock.expect(request.getServletPath()).andReturn("/cxf");
> paths.add(PATH);
> - // TODO How can the registry first return null then destination
> for the same path?
> -
> EasyMock.expect(registry.getDestinationForPath(PATH)).andReturn(null);
> -
> EasyMock.expect(registry.getDestinationForPath(PATH)).andReturn(destination);
> +
> EasyMock.expect(registry.getDestinationForPath(PATH)).andReturn(destination).anyTimes();
>
> EasyMock.expect(registry.checkRestfulRequest(EasyMock.isA(String.class))).andReturn(destination);
>
> EasyMock.expect(destination.getMessageObserver()).andReturn(observer);
> endpoint.addExtensor(extensor);
> @@ -233,7 +231,7 @@ public class OsgiServletTest extends Ass
> ? path
> : PATH).anyTimes();
> if (path != null) {
> -
> EasyMock.expect(registry.getDestinationForPath(path)).andReturn(destination);
> + EasyMock.expect(registry.getDestinationForPath(path,
> true)).andReturn(destination);
> }
>
> if (destinationCount == -1) {
>
> Added:
> cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/CXFSpringServlet.java
> URL:
> http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/CXFSpringServlet.java?rev=1084534&view=auto
>
> ==============================================================================
> ---
> cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/CXFSpringServlet.java
> (added)
> +++
> cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/CXFSpringServlet.java
> Wed Mar 23 10:50:20 2011
> @@ -0,0 +1,78 @@
> +/**
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements. See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership. The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied. See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + */
> +package org.apache.cxf.transport.servlet;
> +
> +import java.io.IOException;
> +
> +import javax.servlet.ServletConfig;
> +import javax.servlet.ServletException;
> +import javax.servlet.http.HttpServlet;
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.http.HttpServletResponse;
> +
> +import org.apache.cxf.Bus;
> +import org.apache.cxf.BusFactory;
> +import
> org.apache.cxf.transport.servlet.servicelist.ServiceListGeneratorServlet;
> +import org.springframework.web.context.WebApplicationContext;
> +import org.springframework.web.context.support.WebApplicationContextUtils;
> +
> +public class CXFSpringServlet extends HttpServlet {
> +
> + private ServletTransportFactory servletTransportFactory;
> + private Bus bus;
> + private ServletController controller;
> +
> + public CXFSpringServlet() {
> + }
> +
> + @Override
> + public void init(ServletConfig sc) throws ServletException {
> + super.init(sc);
> + WebApplicationContext wac = WebApplicationContextUtils.
> + getRequiredWebApplicationContext(sc.getServletContext());
> + this.bus = wac.getBean("cxf", Bus.class);
> + this.servletTransportFactory =
> wac.getBean(ServletTransportFactory.class);
> + this.controller = createServletController(sc);
> + }
> +
> + private ServletController createServletController(ServletConfig
> servletConfig) {
> + HttpServlet serviceListGeneratorServlet =
> + new
> ServiceListGeneratorServlet(servletTransportFactory.getRegistry(), bus);
> + ServletController newController =
> + new ServletController(servletTransportFactory.getRegistry(),
> + servletConfig,
> + serviceListGeneratorServlet);
> + return newController;
> + }
> +
> + public void handleRequest(HttpServletRequest request,
> HttpServletResponse response)
> + throws ServletException, IOException {
> + try {
> + BusFactory.setThreadDefaultBus(bus);
> + controller.invoke(request, response);
> + } finally {
> + BusFactory.setThreadDefaultBus(null);
> + }
> + }
> +
> + public void setBus(Bus bus) {
> + this.bus = bus;
> + }
> +
> +}
>
> 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=1084534&r1=1084533&r2=1084534&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
> Wed Mar 23 10:50:20 2011
> @@ -19,8 +19,6 @@
> package org.apache.cxf.transport.servlet;
>
> import java.io.IOException;
> -import java.io.OutputStream;
> -import java.util.logging.Level;
> import java.util.logging.Logger;
>
> import javax.servlet.ServletConfig;
> @@ -32,7 +30,7 @@ import javax.servlet.http.HttpServletRes
> import org.apache.cxf.Bus;
> import org.apache.cxf.common.logging.LogUtils;
> import org.apache.cxf.common.util.StringUtils;
> -import org.apache.cxf.interceptor.Fault;
> +import org.apache.cxf.resource.ResourceManager;
> import org.apache.cxf.service.model.EndpointInfo;
> import org.apache.cxf.transport.http.AbstractHTTPDestination;
> import org.apache.cxf.transport.http.DestinationRegistry;
> @@ -40,24 +38,20 @@ import org.apache.cxf.transports.http.Qu
> import org.apache.cxf.transports.http.QueryHandlerRegistry;
>
> public class ServletController extends AbstractServletController {
> -
> - private static final Logger LOG =
> LogUtils.getL7dLogger(ServletController.class);
> -
> - public ServletController(DestinationRegistry destinationRegistry,
> - ServletConfig config,
> - HttpServlet serviceListGeneratorServlet) {
> - super(config, destinationRegistry, serviceListGeneratorServlet);
> + private static final Logger LOG =
> LogUtils.getL7dLogger(ServletController.class);
> +
> + public ServletController(DestinationRegistry destinationRegistry,
> + ServletConfig config,
> + HttpServlet serviceListGenerator) {
> + super(config, destinationRegistry, serviceListGenerator);
> }
> -
> - public void invoke(HttpServletRequest request, HttpServletResponse
> res)
> - throws ServletException {
> +
> +
> + public void invoke(HttpServletRequest request, HttpServletResponse
> res) throws ServletException {
> try {
> - EndpointInfo ei = new EndpointInfo();
> -
> String pathInfo = request.getPathInfo() == null ? "" :
> request.getPathInfo();
> - ei.setAddress(pathInfo);
> -
> - AbstractHTTPDestination d =
> destinationRegistry.getDestinationForPath(ei.getAddress(), true);
> + AbstractHTTPDestination d =
> destinationRegistry.getDestinationForPath(pathInfo, true);
> +
> if (d == null) {
> if (!isHideServiceList &&
> (request.getRequestURI().endsWith(serviceListRelativePath)
> ||
> request.getRequestURI().endsWith(serviceListRelativePath + "/")
> @@ -67,8 +61,8 @@ public class ServletController extends A
> serviceListGenerator.service(request, res);
> } else {
> d = destinationRegistry.checkRestfulRequest(pathInfo);
> - if (d == null) {
> - LOG.warning("Can't find the request for "
> + if (d == null || d.getMessageObserver() == null) {
> + LOG.warning("Can't find the the request for "
> + request.getRequestURL() + "'s
> Observer ");
> generateNotFound(request, res);
> } else { // the request should be a restful service
> request
> @@ -77,52 +71,51 @@ public class ServletController extends A
> }
> }
> } else {
> - ei = d.getEndpointInfo();
> + EndpointInfo ei = d.getEndpointInfo();
> Bus bus = d.getBus();
> - if ("GET".equals(request.getMethod())
> - && null != request.getQueryString()
> - && request.getQueryString().length() > 0
> - && bus.getExtension(QueryHandlerRegistry.class) !=
> null) {
> -
> - String ctxUri = request.getPathInfo();
> - String baseUri = request.getRequestURL().toString()
> - + "?" + request.getQueryString();
> - // update the EndPoint Address with request url
> - updateDests(request);
> -
> - for (QueryHandler qh :
> bus.getExtension(QueryHandlerRegistry.class).getHandlers()) {
> - if (qh.isRecognizedQuery(baseUri, ctxUri, ei)) {
> -
> -
> res.setContentType(qh.getResponseContentType(baseUri, ctxUri));
> - OutputStream out = res.getOutputStream();
> - try {
> - qh.writeResponse(baseUri, ctxUri, ei,
> out);
> - } catch (Exception e) {
> - LogUtils.log(LOG, Level.WARNING,
> - qh.getClass().getName()
> - + " Exception caught writing
> response.",
> - e);
> - throw new ServletException(e);
> - }
> - out.flush();
> + ClassLoader orig =
> Thread.currentThread().getContextClassLoader();
> + try {
> + ResourceManager manager =
> bus.getExtension(ResourceManager.class);
> + if (manager != null) {
> + ClassLoader loader = manager.resolveResource("",
> ClassLoader.class);
> + if (loader != null) {
> + //need to set the context classloader to the
> loader of the bundle
> +
> Thread.currentThread().setContextClassLoader(loader);
> + }
> + }
> + QueryHandlerRegistry queryHandlerRegistry =
> bus.getExtension(QueryHandlerRegistry.class);
> +
> + if (!StringUtils.isEmpty(request.getQueryString()) &&
> queryHandlerRegistry != null) {
> +
> + // update the EndPoint Address with request url
> + if ("GET".equals(request.getMethod())) {
> + updateDests(request);
> + }
> +
> + String ctxUri = request.getPathInfo();
> + String baseUri =
> request.getRequestURL().toString()
> + + "?" + request.getQueryString();
> +
> + QueryHandler selectedHandler =
> + findQueryHandler(queryHandlerRegistry, ei,
> ctxUri, baseUri);
> +
> + if (selectedHandler != null) {
> + respondUsingQueryHandler(selectedHandler, res,
> ei, ctxUri, baseUri);
> return;
> - }
> + }
> + } else if ("/".equals(pathInfo) || pathInfo.length()
> == 0) {
> + updateDests(request);
> }
> - } else {
> - updateDests(request);
> + invokeDestination(request, res, d);
> + } finally {
> + Thread.currentThread().setContextClassLoader(orig);
> }
>
> - invokeDestination(request, res, d);
> - }
> - } catch (Fault ex) {
> - if (ex.getCause() instanceof RuntimeException) {
> - throw (RuntimeException)ex.getCause();
> - } else {
> - throw new ServletException(ex.getCause());
> }
> } catch (IOException e) {
> throw new ServletException(e);
> - }
> + }
> }
>
> +
> }
>
> 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=1084534&r1=1084533&r2=1084534&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
> Wed Mar 23 10:50:20 2011
> @@ -26,6 +26,7 @@ import javax.servlet.http.HttpServlet;
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletResponse;
>
> +import org.apache.cxf.transport.MessageObserver;
> import org.apache.cxf.transport.http.AbstractHTTPDestination;
> import org.apache.cxf.transport.http.DestinationRegistry;
> import org.easymock.classextension.EasyMock;
> @@ -130,10 +131,12 @@ public class ServletControllerTest exten
> AbstractHTTPDestination dest =
> EasyMock.createMock(AbstractHTTPDestination.class);
> registry.checkRestfulRequest("");
> EasyMock.expectLastCall().andReturn(dest).atLeastOnce();
> + dest.getMessageObserver();
> +
> EasyMock.expectLastCall().andReturn(EasyMock.createMock(MessageObserver.class)).atLeastOnce();
>
> expectServiceListGeneratorNotCalled();
>
> - EasyMock.replay(req, registry, serviceListGenerator);
> + EasyMock.replay(req, registry, serviceListGenerator, dest);
> TestServletController sc = new TestServletController(registry,
> serviceListGenerator);
> sc.setHideServiceList(true);
> sc.invoke(req, res);
>
>
>
--
Sergey Beryozkin
Application Integration Division of Talend <http://www.talend.com>
http://sberyozkin.blogspot.com
Re: svn commit: r1084534 - in /cxf/trunk/rt/transports:
http-osgi/src/main/java/org/apache/cxf/transport/http_osgi/
http-osgi/src/test/java/org/apache/cxf/transport/http_osgi/
http/src/main/java/org/apache/cxf/transport/servlet/ http/src/test/java/or
Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi Christian
On Wed, Mar 23, 2011 at 10:58 AM, Sergey Beryozkin <sb...@gmail.com>wrote:
> Hi Christian
>
> On Wed, Mar 23, 2011 at 10:50 AM, <cs...@apache.org> wrote:
>
>> Author: cschneider
>> Date: Wed Mar 23 10:50:20 2011
>> New Revision: 1084534
>>
>> URL: http://svn.apache.org/viewvc?rev=1084534&view=rev
>> Log:
>> Make servlet and osgi transports more alike. There is one failing test in
>> jax-rs. Trying to fix that later
>>
>
> Why postpone fixing the failing test? Can it get fixed now ?
>
thanks for independently confirming that the unconditional updateDests in
one of the ServletController.invoke branches fixes the test. I just
committed the fix - I'm working on some sensitive refactoring of
ProviderFactory so I'd just like to see the JAX-RS tests passing :-).
thanks, Sergey