EjbWebServiceDispatcherpublic class EjbWebServiceDispatcher extends Object implements EjbMessageDispatcherHandles dispatching of ejb web service http invocations. |
Fields Summary |
---|
private static Logger | logger | private com.sun.xml.rpc.spi.JaxRpcObjectFactory | rpcFactory | private WsUtil | wsUtil | private com.sun.enterprise.webservice.monitoring.WebServiceEngineImpl | wsEngine | private static final QName | FAULT_CODE_CLIENT | private static final String | HTTP_SERVLET_RESPONSE |
Constructors Summary |
---|
public EjbWebServiceDispatcher()
rpcFactory = JaxRpcObjectFactory.newInstance();
wsEngine = WebServiceEngineImpl.getInstance();
|
Methods Summary |
---|
protected javax.xml.soap.SOAPMessage | createSOAPMessage(javax.servlet.http.HttpServletRequest request, javax.xml.soap.MimeHeaders headers)
InputStream is = request.getInputStream();
byte[] bytes = readFully(is);
int length = request.getContentLength() == -1 ? bytes.length
: request.getContentLength();
ByteInputStream in = new ByteInputStream(bytes, length);
SOAPMessageContext msgContext = rpcFactory.createSOAPMessageContext();
SOAPMessage message = msgContext.createMessage(headers, in);
return message;
| private void | handleGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp, javax.servlet.ServletContext ctxt, EjbRuntimeEndpointInfo endpointInfo)
wsUtil.handleGet(req, resp, endpointInfo.getEndpoint());
| private void | handlePost(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp, EjbRuntimeEndpointInfo endpointInfo)
JAXRPCEndpointImpl endpoint = null;
String messageID = null;
SOAPMessageContext msgContext = null;
try {
MimeHeaders headers = wsUtil.getHeaders(req);
if (!wsUtil.hasTextXmlContentType(headers)) {
wsUtil.writeInvalidContentType(resp);
return;
}
msgContext = rpcFactory.createSOAPMessageContext();
SOAPMessage message = createSOAPMessage(req, headers);
ServerAuthContext sAC = null;
boolean wssSucceded = true;
if (message != null) {
msgContext.setMessage(message);
// get the endpoint info
endpoint = (JAXRPCEndpointImpl) endpointInfo.getEndpoint().getExtraAttribute(EndpointImpl.NAME);
if (endpoint!=null) {
// first global notification
if (wsEngine.hasGlobalMessageListener()) {
messageID = wsEngine.preProcessRequest(endpoint);
}
} else {
logger.fine("Missing internal monitoring info to trace " + req.getRequestURI());
}
Handler implementor = null;
try {
Ejb2RuntimeEndpointInfo endpointInfo2 = (Ejb2RuntimeEndpointInfo)endpointInfo;
// Do ejb container pre-invocation and pre-handler
// logic
implementor = endpointInfo2.getHandlerImplementor(msgContext);
// Set http response object so one-way operations will
// response before actual business method invocation.
msgContext.setProperty(HTTP_SERVLET_RESPONSE, resp);
ServerAuthConfig authConfig = endpointInfo2.getServerAuthConfig();
if (authConfig != null) {
sAC = authConfig.getAuthContext
((StreamingHandler)implementor,message);
if (sAC != null) {
wssSucceded =
WebServiceSecurity.validateRequest(msgContext,sAC);
}
}
// Trace if necessary
if (messageID!=null || (endpoint!=null && endpoint.hasListeners())) {
// create the thread local
ThreadLocalInfo threadLocalInfo =
new ThreadLocalInfo(messageID, req);
wsEngine.getThreadLocal().set(threadLocalInfo);
endpoint.processRequest(msgContext);
}
// Pass control back to jaxrpc runtime to invoke
// any handlers and call the webservice method itself,
// which will be flow back into the ejb container.
if (wssSucceded) {
implementor.handle(msgContext);
}
} finally {
// Always call release, even if an error happened
// during getImplementor(), since some of the
// preInvoke steps might have occurred. It's ok
// if implementor is null.
endpointInfo.releaseImplementor();
}
} else {
String errorMsg = "null message POSTed to ejb endpoint " +
endpointInfo.getEndpoint().getEndpointName() +
" at " + endpointInfo.getEndpointAddressUri();
logger.fine(errorMsg);
msgContext.writeSimpleErrorResponse
(FAULT_CODE_CLIENT, errorMsg);
}
if (messageID!=null || endpoint!=null) {
endpoint.processResponse(msgContext);
}
SOAPMessage reply = msgContext.getMessage();
if (sAC != null && wssSucceded) {
WebServiceSecurity.secureResponse(msgContext,sAC);
}
if (reply.saveRequired()) {
reply.saveChanges();
}
wsUtil.writeReply(resp, msgContext);
} catch (Throwable e) {
String errorMessage = "invocation error on ejb endpoint " +
endpointInfo.getEndpoint().getEndpointName() + " at " +
endpointInfo.getEndpointAddressUri();
logger.log(Level.WARNING, errorMessage, e);
SOAPMessageContext errorMsgContext =
rpcFactory.createSOAPMessageContext();
errorMsgContext.writeSimpleErrorResponse
(SOAPConstants.FAULT_CODE_SERVER, errorMessage);
resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
if (messageID!=null || endpoint!=null) {
endpoint.processResponse(errorMsgContext);
}
wsUtil.writeReply(resp, errorMsgContext);
}
// final tracing notification
if (messageID!=null) {
HttpResponseInfoImpl response = new HttpResponseInfoImpl(resp);
wsEngine.postProcessResponse(messageID, response);
}
| public void | invoke(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp, javax.servlet.ServletContext ctxt, EjbRuntimeEndpointInfo endpointInfo)
String method = req.getMethod();
if (logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, "WebServiceDispatcher " + req.getMethod() +
" entering for " + req.getRequestURI() + " and query string " + req.getQueryString());
}
try {
if( method.equals("POST") ) {
handlePost(req, resp, endpointInfo);
} else if( method.equals("GET") ) {
handleGet(req, resp, ctxt, endpointInfo);
} else {
String errorMessage = "Unsupported method request = ["
+ method + "] for endpoint " +
endpointInfo.getEndpoint().getEndpointName() + " at " +
endpointInfo.getEndpointAddressUri();
logger.warning(errorMessage);
wsUtil.writeInvalidMethodType(resp, errorMessage);
}
} catch(Exception e) {
logger.log(Level.WARNING, "ejb endpoint exception", e);
}
| protected byte[] | readFully(java.io.InputStream istream)
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int num = 0;
while( (num = istream.read(buf)) != -1) {
bout.write(buf, 0, num);
}
byte[] ret = bout.toByteArray();
return ret;
|
|