CXF-8235 Handle null continuation in AsyncResponseImpl instead of throwing a NullPointerException (#649)
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java
index ef167d2..5ea5419 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java
@@ -304,6 +304,11 @@
     private void initContinuation() {
         ContinuationProvider provider = 
             (ContinuationProvider)inMessage.get(ContinuationProvider.class.getName());
+        if (provider == null) {
+            throw new IllegalArgumentException(
+                "Continuation not supported. " 
+                + "Please ensure that all servlets and servlet filters support async operations");
+        }
         cont = provider.getContinuation();
         initialSuspend = true;
     }
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/AsyncResponseImplTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/AsyncResponseImplTest.java
index bcce816..9e5c768 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/AsyncResponseImplTest.java
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/AsyncResponseImplTest.java
@@ -159,4 +159,31 @@
         assertEquals("AsynchResponse.isSuspended() returned a different response after canceling a second time", 
                      isSuspended, impl.isSuspended());
     }
+    
+    /**
+     * Test that creatinging an AsyncResponse with a null continuation throws
+     * an IllegalArgumentException instead of a NullPointer Exception.
+     */
+    @Test
+    public void testNullContinutaion() {
+        HttpServletRequest req = control.createMock(HttpServletRequest.class);
+        AsyncContext asyncCtx = control.createMock(AsyncContext.class);
+        Message msg = new MessageImpl();
+        msg.setExchange(new ExchangeImpl());
+
+        req.startAsync();
+        EasyMock.expectLastCall().andReturn(asyncCtx);
+        control.replay();
+
+        AsyncResponse impl;
+        try {
+            impl = new AsyncResponseImpl(msg);
+        } catch (IllegalArgumentException e) {
+            assertEquals("Continuation not supported. " 
+                             + "Please ensure that all servlets and servlet filters support async operations",
+                         e.getMessage());
+            return;
+        }
+        Assert.fail("Expected IllegalArgumentException, but instead got valid AsyncResponse, " + impl);
+    }
 }