diff options
Diffstat (limited to 'sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingListenerServlet.java')
-rw-r--r-- | sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingListenerServlet.java | 229 |
1 files changed, 116 insertions, 113 deletions
diff --git a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingListenerServlet.java b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingListenerServlet.java index 6612ca8df6..7e9b9af293 100644 --- a/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingListenerServlet.java +++ b/sca-java-2.x/trunk/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingListenerServlet.java @@ -39,6 +39,7 @@ import org.apache.tuscany.sca.common.http.HTTPCacheContext; import org.apache.tuscany.sca.common.http.HTTPContentTypeMapper; import org.apache.tuscany.sca.common.http.HTTPContext; import org.apache.tuscany.sca.common.http.HTTPHeader; +import org.apache.tuscany.sca.common.http.ThreadHTTPContext; import org.apache.tuscany.sca.common.http.cors.CORSHeaderProcessor; import org.apache.tuscany.sca.invocation.Invoker; import org.apache.tuscany.sca.invocation.Message; @@ -72,62 +73,68 @@ public class RESTBindingListenerServlet extends HttpServlet { * Constructs a new RESTServiceListenerServlet. */ public RESTBindingListenerServlet(Binding binding, Invoker bindingInvoker, MessageFactory messageFactory) { - this.binding = (RESTBinding) binding; + this.binding = (RESTBinding)binding; this.bindingInvoker = bindingInvoker; this.messageFactory = messageFactory; } @Override - protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, + IOException { if (binding.isCORS()) { CORSHeaderProcessor.processCORS(binding.getCORSConfiguration(), request, response); } - if( binding.getOperationSelector() != null || binding.getRequestWireFormat() != null) { - HTTPContext bindingContext = new HTTPContext(); - bindingContext.setHttpRequest(request); - bindingContext.setHttpResponse(response); + HTTPContext bindingContext = new HTTPContext(); + bindingContext.setHttpRequest(request); + bindingContext.setHttpResponse(response); + ThreadHTTPContext.setHTTPContext(bindingContext); - // Dispatch the service interaction to the service invoker - Message requestMessage = messageFactory.createMessage(); - requestMessage.setBindingContext(bindingContext); + try { - requestMessage.setBody(new Object[] {request.getInputStream()}); + if (binding.getOperationSelector() != null || binding.getRequestWireFormat() != null) { + // Dispatch the service interaction to the service invoker + Message requestMessage = messageFactory.createMessage(); + requestMessage.setBindingContext(bindingContext); - Message responseMessage = bindingInvoker.invoke(requestMessage); + requestMessage.setBody(new Object[] {request.getInputStream()}); - // return response to client - if (responseMessage.isFault()) { - // Turn a fault into an exception - Throwable e = (Throwable)responseMessage.getBody(); - response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString()); - } else { + Message responseMessage = bindingInvoker.invoke(requestMessage); + + // return response to client + if (responseMessage.isFault()) { + // Turn a fault into an exception + Throwable e = (Throwable)responseMessage.getBody(); + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString()); + } else { - for(HTTPHeader header : binding.getHttpHeaders()) { - //treat special headers that need to be calculated - if(header.getName().equalsIgnoreCase("Expires")) { - GregorianCalendar calendar = new GregorianCalendar(); - calendar.setTime(new Date()); + for (HTTPHeader header : binding.getHttpHeaders()) { + //treat special headers that need to be calculated + if (header.getName().equalsIgnoreCase("Expires")) { + GregorianCalendar calendar = new GregorianCalendar(); + calendar.setTime(new Date()); - calendar.add(Calendar.HOUR, Integer.parseInt(header.getValue())); + calendar.add(Calendar.HOUR, Integer.parseInt(header.getValue())); + + response.setHeader("Expires", HTTPCacheContext.RFC822DateFormat.format(calendar.getTime())); + } else { + //default behaviour to pass the header value to HTTP response + response.setHeader(header.getName(), header.getValue()); + } - response.setHeader("Expires", HTTPCacheContext.RFC822DateFormat.format( calendar.getTime() )); - } else { - //default behaviour to pass the header value to HTTP response - response.setHeader(header.getName(), header.getValue()); } + //handle void operations + write(response.getOutputStream(), responseMessage.getBody()); + response.getOutputStream().flush(); + response.getOutputStream().close(); } - - //handle void operations - write(response.getOutputStream(), responseMessage.getBody()); - response.getOutputStream().flush(); - response.getOutputStream().close(); + } else { + super.service(request, response); } - } else { - super.service(request, response); + } finally { + ThreadHTTPContext.removeHTTPContext(); } - } @Override @@ -156,8 +163,8 @@ public class RESTBindingListenerServlet extends HttpServlet { } // Route message based on availability of cache info and cache methods - if (( cacheContext != null ) && (cacheContext.isEnabled()) && (conditionalGetInvoker != null )) { - if(id != null && id.length() > 0) { + if ((cacheContext != null) && (cacheContext.isEnabled()) && (conditionalGetInvoker != null)) { + if (id != null && id.length() > 0) { requestMessage.setBody(new Object[] {id, cacheContext}); } else { requestMessage.setBody(new Object[] {cacheContext}); @@ -165,7 +172,7 @@ public class RESTBindingListenerServlet extends HttpServlet { responseMessage = conditionalGetInvoker.invoke(requestMessage); } else { - if(id != null && id.length() > 0) { + if (id != null && id.length() > 0) { requestMessage.setBody(new Object[] {id}); } else { //requestMessage.setBody(new Object[] {id}); @@ -178,18 +185,18 @@ public class RESTBindingListenerServlet extends HttpServlet { Object body = responseMessage.getBody(); int index = -1; - if ( -1 < (index = body.getClass().getName().indexOf( "NotModifiedException")) ) { - if ( index > -1 ) { - response.sendError( HttpServletResponse.SC_NOT_MODIFIED, body.toString().substring( index )); + if (-1 < (index = body.getClass().getName().indexOf("NotModifiedException"))) { + if (index > -1) { + response.sendError(HttpServletResponse.SC_NOT_MODIFIED, body.toString().substring(index)); } else { - response.sendError( HttpServletResponse.SC_NOT_MODIFIED ); + response.sendError(HttpServletResponse.SC_NOT_MODIFIED); } return; - } else if ( -1 < (index = body.getClass().getName().indexOf( "PreconditionFailedException")) ) { - if ( index > -1 ) { - response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED, body.toString().substring( index )); + } else if (-1 < (index = body.getClass().getName().indexOf("PreconditionFailedException"))) { + if (index > -1) { + response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED, body.toString().substring(index)); } else { - response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED ); + response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED); } return; } @@ -197,10 +204,10 @@ public class RESTBindingListenerServlet extends HttpServlet { throw new ServletException((Throwable)responseMessage.getBody()); } - if(response.getContentType() == null || response.getContentType().length() == 0){ + if (response.getContentType() == null || response.getContentType().length() == 0) { // Calculate content-type based on extension String contentType = HTTPContentTypeMapper.getContentType(id); - if(contentType != null && contentType.length() >0) { + if (contentType != null && contentType.length() > 0) { response.setContentType(contentType); } } @@ -221,10 +228,11 @@ public class RESTBindingListenerServlet extends HttpServlet { } @Override - protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, + IOException { // Get the request path String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8"); - if (path.length() ==0) { + if (path.length() == 0) { // Redirect to a URL ending with / to make relative hrefs work // relative to the served resource. response.sendRedirect(request.getRequestURL().append('/').toString()); @@ -243,7 +251,7 @@ public class RESTBindingListenerServlet extends HttpServlet { } // Route message based on availability of cache info and cache methods - if (( cacheContext != null ) && (cacheContext.isEnabled()) && (conditionalDeleteInvoker != null )) { + if ((cacheContext != null) && (cacheContext.isEnabled()) && (conditionalDeleteInvoker != null)) { requestMessage.setBody(new Object[] {id, cacheContext}); responseMessage = conditionalDeleteInvoker.invoke(requestMessage); } else { @@ -254,18 +262,18 @@ public class RESTBindingListenerServlet extends HttpServlet { Object body = responseMessage.getBody(); int index = -1; - if ( -1 < (index = body.getClass().getName().indexOf( "NotModifiedException")) ) { - if ( index > -1 ) { - response.sendError( HttpServletResponse.SC_NOT_MODIFIED, body.toString().substring( index )); + if (-1 < (index = body.getClass().getName().indexOf("NotModifiedException"))) { + if (index > -1) { + response.sendError(HttpServletResponse.SC_NOT_MODIFIED, body.toString().substring(index)); } else { - response.sendError( HttpServletResponse.SC_NOT_MODIFIED ); + response.sendError(HttpServletResponse.SC_NOT_MODIFIED); } return; - } else if ( -1 < (index = body.getClass().getName().indexOf( "PreconditionFailedException")) ) { - if ( index > -1 ) { - response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED, body.toString().substring( index )); + } else if (-1 < (index = body.getClass().getName().indexOf("PreconditionFailedException"))) { + if (index > -1) { + response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED, body.toString().substring(index)); } else { - response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED ); + response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED); } return; } @@ -292,7 +300,7 @@ public class RESTBindingListenerServlet extends HttpServlet { protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Get the request path String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8"); - if (path.length() ==0) { + if (path.length() == 0) { // Redirect to a URL ending with / to make relative hrefs work // relative to the served resource. response.sendRedirect(request.getRequestURL().append('/').toString()); @@ -311,7 +319,7 @@ public class RESTBindingListenerServlet extends HttpServlet { } // Route message based on availability of cache info and cache methods - if (( cacheContext != null ) && (cacheContext.isEnabled()) && (conditionalPutInvoker != null )) { + if ((cacheContext != null) && (cacheContext.isEnabled()) && (conditionalPutInvoker != null)) { requestMessage.setBody(new Object[] {id, cacheContext}); responseMessage = conditionalPutInvoker.invoke(requestMessage); } else { @@ -322,18 +330,18 @@ public class RESTBindingListenerServlet extends HttpServlet { Object body = responseMessage.getBody(); int index = -1; - if ( -1 < (index = body.getClass().getName().indexOf( "NotModifiedException")) ) { - if ( index > -1 ) { - response.sendError( HttpServletResponse.SC_NOT_MODIFIED, body.toString().substring( index )); + if (-1 < (index = body.getClass().getName().indexOf("NotModifiedException"))) { + if (index > -1) { + response.sendError(HttpServletResponse.SC_NOT_MODIFIED, body.toString().substring(index)); } else { - response.sendError( HttpServletResponse.SC_NOT_MODIFIED ); + response.sendError(HttpServletResponse.SC_NOT_MODIFIED); } return; - } else if ( -1 < (index = body.getClass().getName().indexOf( "PreconditionFailedException")) ) { - if ( index > -1 ) { - response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED, body.toString().substring( index )); + } else if (-1 < (index = body.getClass().getName().indexOf("PreconditionFailedException"))) { + if (index > -1) { + response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED, body.toString().substring(index)); } else { - response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED ); + response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED); } return; } @@ -357,10 +365,11 @@ public class RESTBindingListenerServlet extends HttpServlet { } @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, + IOException { // Get the request path String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8"); - if (path.length() ==0) { + if (path.length() == 0) { // Redirect to a URL ending with / to make relative hrefs work // relative to the served resource. response.sendRedirect(request.getRequestURL().append('/').toString()); @@ -374,59 +383,57 @@ public class RESTBindingListenerServlet extends HttpServlet { Message responseMessage = null; HTTPCacheContext cacheContext = null; try { - cacheContext = HTTPCacheContext.createCacheContextFromRequest(request); + cacheContext = HTTPCacheContext.createCacheContextFromRequest(request); } catch (ParseException e) { } // Route message based on availability of cache info and cache methods - if (( cacheContext != null ) && (cacheContext.isEnabled()) && (conditionalPostInvoker != null )) { - requestMessage.setBody(new Object[] {cacheContext}); - responseMessage = conditionalPostInvoker.invoke(requestMessage); + if ((cacheContext != null) && (cacheContext.isEnabled()) && (conditionalPostInvoker != null)) { + requestMessage.setBody(new Object[] {cacheContext}); + responseMessage = conditionalPostInvoker.invoke(requestMessage); } else { - requestMessage.setBody(new Object[] {}); - responseMessage = postInvoker.invoke(requestMessage); + requestMessage.setBody(new Object[] {}); + responseMessage = postInvoker.invoke(requestMessage); } if (responseMessage.isFault()) { - Object body = responseMessage.getBody(); - - int index = -1; - if ( -1 < (index = body.getClass().getName().indexOf( "NotModifiedException")) ) { - if ( index > -1 ) - response.sendError( HttpServletResponse.SC_NOT_MODIFIED, body.toString().substring( index )); - else - response.sendError( HttpServletResponse.SC_NOT_MODIFIED ); - return; - } else if ( -1 < (index = body.getClass().getName().indexOf( "PreconditionFailedException")) ) { - if ( index > -1 ) - response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED, body.toString().substring( index )); - else - response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED ); - return; + Object body = responseMessage.getBody(); + + int index = -1; + if (-1 < (index = body.getClass().getName().indexOf("NotModifiedException"))) { + if (index > -1) + response.sendError(HttpServletResponse.SC_NOT_MODIFIED, body.toString().substring(index)); + else + response.sendError(HttpServletResponse.SC_NOT_MODIFIED); + return; + } else if (-1 < (index = body.getClass().getName().indexOf("PreconditionFailedException"))) { + if (index > -1) + response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED, body.toString().substring(index)); + else + response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED); + return; } throw new ServletException((Throwable)responseMessage.getBody()); } - // Test if the ETag and LastModified are returned as a cache context. - Object body = responseMessage.getBody(); - if ( body.getClass() == HTTPCacheContext.class ) { - // Transfer to header if so. - HTTPCacheContext cc = (HTTPCacheContext)responseMessage.getBody(); - if (( cc != null ) && ( cc.isEnabled() )) { - String eTag = cc.getETag(); - if ( eTag != null ) { - response.setHeader( "ETag", cc.getETag() ); - } - String lastModified = cc.getLastModified(); - if ( lastModified != null) { - response.setHeader( "LastModified", cc.getLastModified() ); - } - } - } + Object body = responseMessage.getBody(); + if (body.getClass() == HTTPCacheContext.class) { + // Transfer to header if so. + HTTPCacheContext cc = (HTTPCacheContext)responseMessage.getBody(); + if ((cc != null) && (cc.isEnabled())) { + String eTag = cc.getETag(); + if (eTag != null) { + response.setHeader("ETag", cc.getETag()); + } + String lastModified = cc.getLastModified(); + if (lastModified != null) { + response.setHeader("LastModified", cc.getLastModified()); + } + } + } } - public void setInvoker(Invoker invoker) { this.invoker = invoker; } @@ -435,7 +442,6 @@ public class RESTBindingListenerServlet extends HttpServlet { return invoker; } - /** * @return the getInvoker */ @@ -554,8 +560,6 @@ public class RESTBindingListenerServlet extends HttpServlet { * */ - - private void write(OutputStream out, Object obj) throws IOException { if (obj == null) { return; @@ -579,5 +583,4 @@ public class RESTBindingListenerServlet extends HttpServlet { } } - } |