[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