You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by mr...@apache.org on 2009/01/30 23:33:28 UTC

svn commit: r739438 - in /ode/sandbox/simpel/src: main/java/org/apache/ode/embed/messaging/MessageExchangeContextImpl.java main/java/org/apache/ode/rest/ProcessWebResource.java test/java/org/apache/ode/rest/RestfulSimPELTest.java

Author: mriou
Date: Fri Jan 30 22:33:28 2009
New Revision: 739438

URL: http://svn.apache.org/viewvc?rev=739438&view=rev
Log:
Better fault and failure handling when calling the outside world.

Modified:
    ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/MessageExchangeContextImpl.java
    ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java
    ode/sandbox/simpel/src/test/java/org/apache/ode/rest/RestfulSimPELTest.java

Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/MessageExchangeContextImpl.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/MessageExchangeContextImpl.java?rev=739438&r1=739437&r2=739438&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/MessageExchangeContextImpl.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/MessageExchangeContextImpl.java Fri Jan 30 22:33:28 2009
@@ -119,36 +119,24 @@
 
         String response = resp.getEntity(String.class);
 
-        if (resp.getStatus() == 401) {
-            QName faultName = new QName("http://ode.apache.org/fault/http/", "http401");
-            Document odeMsg = DOMUtils.newDocument();
-            Element odeMsgEl = odeMsg.createElementNS(null, "message");
-            odeMsg.appendChild(odeMsgEl);
-            Element partElmt = odeMsg.createElement("payload");
-            odeMsgEl.appendChild(partElmt);
-            Element methodElmt = odeMsg.createElementNS(faultName.getNamespaceURI(), faultName.getLocalPart());
-            partElmt.appendChild(methodElmt);
-            methodElmt.setTextContent(response);
-
-            Message responseMsg = restOutMessageExchange.createMessage(null);
-            responseMsg.setMessage(odeMsgEl);
-            restOutMessageExchange.replyWithFault(faultName, responseMsg);
+        int responseType = isFaultOrFailure(resp.getStatus());
+        if (responseType > 0) {
+            faultFromHttpStatus(resp.getStatus(), response, restOutMessageExchange);
+            return;
+        }
+        if (responseType < 0) {
+            fail(res.getUrl(), "http" + resp.getStatus(), "Failing with HTTP response code "
+                    + resp.getStatus(), restOutMessageExchange);
             return;
         }
 
-        // TODO handle failure status
         // TODO allow POST over simple form url-encoded
         Element responseXML = null;
         if (response != null && response.trim().length() > 0) {
             try {
                 responseXML = DOMUtils.stringToDOM(response);
             } catch (Exception e) {
-                Document doc = DOMUtils.newDocument();
-                Element failureElmt = doc.createElement("requestFailure");
-                failureElmt.setTextContent(response);
-                __log.debug("Request to " + res.getUrl() + " failed, response couldn't be parsed: " + response);
-                restOutMessageExchange.replyWithFailure(MessageExchange.FailureType.FORMAT_ERROR,
-                        "Can't parse the response to " + res.getUrl(), failureElmt);
+                fail(res.getUrl(), "parseError", "Response couldn't be parsed: " + response, restOutMessageExchange);
                 return;
             }
         }
@@ -208,6 +196,31 @@
         return payload;
     }
 
+    private void faultFromHttpStatus(int s, String response, RESTOutMessageExchange mex) {
+        QName faultName = new QName(null, "http401");
+        Document odeMsg = DOMUtils.newDocument();
+        Element odeMsgEl = odeMsg.createElementNS(null, "message");
+        odeMsg.appendChild(odeMsgEl);
+        Element partElmt = odeMsg.createElement("payload");
+        odeMsgEl.appendChild(partElmt);
+        Element methodElmt = odeMsg.createElementNS(faultName.getNamespaceURI(), faultName.getLocalPart());
+        partElmt.appendChild(methodElmt);
+        methodElmt.setTextContent(response);
+
+        Message responseMsg = mex.createMessage(null);
+        responseMsg.setMessage(odeMsgEl);
+        mex.replyWithFault(faultName, responseMsg);
+    }
+
+    private void fail(String calledUrl, String errElmt, String text, RESTOutMessageExchange mex) {
+        Document doc = DOMUtils.newDocument();
+        Element failureElmt = doc.createElement(errElmt);
+        failureElmt.setTextContent(text);
+        String fullMsg = "Request to " + calledUrl + " failed. " + text;
+        __log.debug(fullMsg);
+        mex.replyWithFailure(MessageExchange.FailureType.FORMAT_ERROR, fullMsg, failureElmt);
+    }
+
     private void handleOutHeaders(Element msg, WebResource.Builder wr) {
         Element root = DOMUtils.getFirstChildElement(DOMUtils.getFirstChildElement(msg));
         Node headers = DOMUtils.findChildByName(root, new QName(null, "headers"));
@@ -245,4 +258,25 @@
         }
         return res;
     }
+
+    /**
+     * @param s, the status code to test, must be in [400, 600[
+     * @return 1 if fault, -1 if failure, 0 if success
+     */
+    public static int isFaultOrFailure(int s) {
+        if (s < 100 || s >= 600)
+            throw new IllegalArgumentException("Status-Code must be in interval [400,600]");
+
+        if (s == 500 || s == 501 || s == 502 || s == 505
+                || s == 400 || s == 402 || s == 403 || s == 404 || s == 405 || s == 406
+                || s == 409 || s == 410 || s == 412 || s == 413 || s == 414 || s == 415
+                || s == 411 || s == 416 || s == 417) {
+            return 1;
+        } else if (s == 503 || s == 504 || s == 401 || s == 407 || s == 408) {
+            return -1;
+        } else {
+            return 0;
+        }
+    }
+    
 }

Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java?rev=739438&r1=739437&r2=739438&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java Fri Jan 30 22:33:28 2009
@@ -47,7 +47,7 @@
                 return Response.status(204).build();
             } else {
                 return Response.status(200)
-                        .entity(unwrapResponse(mex.getResponse().getMessage()))
+                        .entity(DOMUtils.domToString(unwrapResponse(mex.getResponse().getMessage())))
                         .header("Location", _root+mex.getResource().getUrl())
                         .build();
             }

Modified: ode/sandbox/simpel/src/test/java/org/apache/ode/rest/RestfulSimPELTest.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/test/java/org/apache/ode/rest/RestfulSimPELTest.java?rev=739438&r1=739437&r2=739438&view=diff
==============================================================================
--- ode/sandbox/simpel/src/test/java/org/apache/ode/rest/RestfulSimPELTest.java (original)
+++ ode/sandbox/simpel/src/test/java/org/apache/ode/rest/RestfulSimPELTest.java Fri Jan 30 22:33:28 2009
@@ -267,10 +267,8 @@
         ClientConfig cc = new DefaultClientConfig();
         Client c = Client.create(cc);
 
-        Thread.sleep(10000000);
-
         WebResource wr = c.resource("http://localhost:3434/hello-form");
-        ClientResponse resp = wr.path("/").accept("application/x-www-form-urlencoded").type("application/x-www-form-urlencoded")
+        ClientResponse resp = wr.path("/").type("application/x-www-form-urlencoded")
                 .post(ClientResponse.class, "firstname=foo&lastname=bar");
         String response = resp.getEntity(String.class);
         System.out.println("=> " + response);