[jboss-svn-commits] JBL Code SVN: r27610 - labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jul 6 07:42:56 EDT 2009


Author: tfennelly
Date: 2009-07-06 07:42:56 -0400 (Mon, 06 Jul 2009)
New Revision: 27610

Modified:
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/JBossRemotingGatewayListener.java
Log:
https://jira.jboss.org/jira/browse/JBESB-2361
Return the http error code and message in JBossRemotingGateway Listener. 

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/JBossRemotingGatewayListener.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/JBossRemotingGatewayListener.java	2009-07-06 11:10:08 UTC (rev 27609)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/JBossRemotingGatewayListener.java	2009-07-06 11:42:56 UTC (rev 27610)
@@ -32,6 +32,7 @@
 import org.jboss.remoting.marshal.http.HTTPMarshaller;
 import org.jboss.remoting.security.SSLSocketBuilder;
 import org.jboss.remoting.transport.Connector;
+import org.jboss.remoting.transport.http.HTTPMetadataConstants;
 import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.actions.ActionUtils;
 import org.jboss.soa.esb.addressing.EPR;
@@ -58,12 +59,12 @@
 import org.jboss.soa.esb.util.ClassUtil;
 
 import javax.management.MBeanServer;
+import javax.security.auth.login.LoginException;
 
 import java.io.Serializable;
-import java.net.InetAddress;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.UnknownHostException;
+import java.io.StringWriter;
+import java.io.PrintWriter;
+import java.net.*;
 import java.util.*;
 
 /**
@@ -159,6 +160,10 @@
      */
     private final String asyncResponse;
     /**
+     * Flag indicating whether or not this gateway is servicing HTTP requests.
+     */
+    private boolean isHttp;
+    /**
      * ServiceInvoker timeout if the ServiceInvoker is configured to be synchronous.
      */
     private long serviceInvokerTimeout;
@@ -239,6 +244,9 @@
             endpointReference = new EPR(getJbrServerLocatorURI());
             messageDeliveryAdapter = createDeliveryAdapter();
             initaliseJBRConnectorConfiguration(connectorConfig);
+
+            String protocol = getConfig().getAttribute(JBR_SERVER_PROTOCOL);
+            isHttp = (protocol.equals("http") || protocol.equals("https"));
         } catch (ConfigurationException e) {
             throw new ManagedLifecycleException("Remoting Listener configuration failed.", e);
         }
@@ -355,6 +363,8 @@
      * @throws Throwable Message processing failure.
      */
     public Object invoke(InvocationRequest invocationRequest) throws Throwable {
+        Map responseMap = getJBRResponseMap(invocationRequest);
+
         // Set the request object on the thread so as to make it available
         // to the HttpMarshaller...
         currentRequest.set(invocationRequest);
@@ -366,22 +376,50 @@
                     logger.debug("Returning response [" + response + "].");
                 }
 
+                if(isHttp) {
+                    responseMap.put(HTTPMetadataConstants.RESPONSE_CODE, HttpURLConnection.HTTP_OK);
+                }
                 return response;
             } else {
                 messageDeliveryAdapter.deliverAsync(invocationRequest);
+                if(isHttp) {
+                    responseMap.put(HTTPMetadataConstants.RESPONSE_CODE, HttpURLConnection.HTTP_ACCEPTED);
+                }
+
+                if(asyncResponse == null) {
+                    return "<ack/>";
+                } else {
+                    return StreamUtils.readStreamString(getClass().getResourceAsStream(asyncResponse), "UTF-8");
+                }
             }
         } catch (Throwable t) {
-            logger.error("JBoss Remoting Gateway failed to " + (synchronous ? "synchronously" : "asynchronously") + " deliver message to target service [" +
+            logger.debug("JBoss Remoting Gateway failed to " + (synchronous ? "synchronously" : "asynchronously") + " deliver message to target service [" +
                     messageDeliveryAdapter.getDeliveryAdapter().getServiceCategory() + ":" +
                     messageDeliveryAdapter.getDeliveryAdapter().getServiceName() + "].", t);
 
+            if(isHttp) {
+                StringWriter stringWriter = new StringWriter();
+
+                mapHTTPErrorDetails(responseMap, t);
+                t.printStackTrace(new PrintWriter(stringWriter));
+                responseMap.put(HTTPMetadataConstants.CONTENTTYPE, "text/plain");
+
+                return stringWriter.toString();
+            }
+
             throw t;
         }
+    }
 
-        if(asyncResponse == null) {
-            return "<ack/>";
+    private void mapHTTPErrorDetails(Map responseMap, Throwable t) {
+        Throwable cause = t.getCause();
+
+        if(cause instanceof SecurityServiceException && cause.getCause() instanceof LoginException) {
+            responseMap.put(HTTPMetadataConstants.RESPONSE_CODE, HttpURLConnection.HTTP_UNAUTHORIZED);
+            responseMap.put(HTTPMetadataConstants.RESPONSE_CODE_MESSAGE, "Invalid Login Credentials.");
         } else {
-            return StreamUtils.readStreamString(getClass().getResourceAsStream(asyncResponse), "UTF-8");
+            responseMap.put(HTTPMetadataConstants.RESPONSE_CODE, HttpURLConnection.HTTP_INTERNAL_ERROR);
+            responseMap.put(HTTPMetadataConstants.RESPONSE_CODE_MESSAGE, "Failed to service request.");
         }
     }
 
@@ -578,13 +616,8 @@
         public Object decompose(Message message, T invocationRequest) throws MessageDeliverException {
             Properties properties = message.getProperties();
             String propertyNames[] = properties.getNames();
-            Map responseMap = invocationRequest.getReturnPayload();
+            Map responseMap = getJBRResponseMap(invocationRequest);
 
-            if(responseMap == null) {
-                responseMap = new LinkedHashMap();
-                invocationRequest.setReturnPayload(responseMap);
-            }
-
             for(String name : propertyNames) {
                 Object value = properties.getProperty(name);
 
@@ -599,6 +632,16 @@
         }
     }
 
+    private static Map getJBRResponseMap(InvocationRequest invocationRequest) {
+        Map responseMap = invocationRequest.getReturnPayload();
+
+        if(responseMap == null) {
+            responseMap = new LinkedHashMap();
+            invocationRequest.setReturnPayload(responseMap);
+        }
+        return responseMap;
+    }
+
     private static Map<String, String> legacySSLConfigNameMappings = new HashMap<String, String>();
     static {
         /*




More information about the jboss-svn-commits mailing list