jmsutils.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 467 行 · 第 1/2 页
JAVA
467 行
}
}
// If the char set enc is still not found use the default
if (charSetEnc == null) {
charSetEnc = MessageContext.DEFAULT_CHAR_SET_ENCODING;
}
format.setSOAP11(msgCtx.isSOAP11());
format.setCharSetEncoding(charSetEnc);
String encoding = format.getCharSetEncoding();
String contentType = format.getContentType();
if (encoding != null) {
contentType += "; charset=" + encoding;
}
// action header is not mandated in SOAP 1.2. So putting it, if available
if (!msgCtx.isSOAP11() && soapActionString != null &&
!"".equals(soapActionString.trim())) {
contentType = contentType + ";action=\"" + soapActionString + "\";";
}
return contentType;
}
/**
* Get the SOAP Action from the message context
*
* @param msgCtx the MessageContext
* @return the SOAP Action as s String if present, or the WS-Action
*/
private static String getSOAPAction(MessageContext msgCtx) {
String soapActionString = msgCtx.getSoapAction();
if (soapActionString == null || soapActionString.trim().length() == 0) {
soapActionString = msgCtx.getWSAAction();
}
Object disableSoapAction =
msgCtx.getOptions().getProperty(Constants.Configuration.DISABLE_SOAP_ACTION);
if (soapActionString == null || JavaUtils.isTrueExplicitly(disableSoapAction)) {
soapActionString = "";
}
return soapActionString;
}
/**
* Return the destination name from the given URL
*
* @param url the URL
* @return the destination name
*/
public static String getDestination(String url) {
String tempUrl = url.substring(JMSConstants.JMS_PREFIX.length());
int propPos = tempUrl.indexOf("?");
if (propPos == -1) {
return tempUrl;
} else {
return tempUrl.substring(0, propPos);
}
}
/**
* Return a SOAPEnvelope created from the given JMS Message and Axis
* MessageContext, and the InputStream into the message
*
* @param message the JMS Message
* @param msgContext the Axis MessageContext
* @param in the InputStream into the message
* @return SOAPEnvelope for the message
* @throws javax.xml.stream.XMLStreamException
*
*/
public static SOAPEnvelope getSOAPEnvelope(
Message message, MessageContext msgContext, InputStream in)
throws XMLStreamException {
SOAPEnvelope envelope = null;
StAXBuilder builder = null;
String contentType = JMSUtils.getProperty(message, JMSConstants.CONTENT_TYPE);
if (contentType != null) {
if (contentType.indexOf(
HTTPConstants.HEADER_ACCEPT_MULTIPART_RELATED) > -1) {
builder = BuilderUtil.getAttachmentsBuilder(
msgContext, in, contentType, true);
envelope = (SOAPEnvelope) builder.getDocumentElement();
} else {
String charSetEnc = BuilderUtil.getCharSetEncoding(contentType);
builder = BuilderUtil.getSOAPBuilder(in, charSetEnc);
// Set the encoding scheme in the message context
msgContext.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING, charSetEnc);
envelope = (SOAPEnvelope) builder.getDocumentElement();
}
}
// handle pure plain vanilla POX and binary content (non SOAP)
if (builder == null) {
SOAPFactory soapFactory = new SOAP11Factory();
try {
XMLStreamReader xmlreader = StAXUtils.createXMLStreamReader
(in, MessageContext.DEFAULT_CHAR_SET_ENCODING);
// Set the encoding scheme in the message context
msgContext.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING,
MessageContext.DEFAULT_CHAR_SET_ENCODING);
builder = new StAXOMBuilder(xmlreader);
builder.setOMBuilderFactory(soapFactory);
String ns = builder.getDocumentElement().getNamespace().getNamespaceURI();
if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(ns)) {
envelope = getEnvelope(in, SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
} else if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(ns)) {
envelope = getEnvelope(in, SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
} else {
// this is POX ... mark MC as REST
msgContext.setDoingREST(true);
envelope = soapFactory.getDefaultEnvelope();
envelope.getBody().addChild(builder.getDocumentElement());
}
} catch (Exception e) {
log.debug("Non SOAP/XML JMS message received");
Parameter operationParam = msgContext.getAxisService().
getParameter(JMSConstants.OPERATION_PARAM);
QName operationQName = (operationParam != null ?
getQName(operationParam.getValue()) : JMSConstants.DEFAULT_OPERATION);
AxisOperation operation = msgContext.getAxisService().getOperation(operationQName);
if (operation != null) {
msgContext.setAxisOperation(operation);
} else {
handleException("Cannot find operation : " + operationQName + " on the service "
+ msgContext.getAxisService());
}
Parameter wrapperParam = msgContext.getAxisService().
getParameter(JMSConstants.WRAPPER_PARAM);
QName wrapperQName = (wrapperParam != null ?
getQName(wrapperParam.getValue()) : JMSConstants.DEFAULT_WRAPPER);
OMElement wrapper = soapFactory.createOMElement(wrapperQName, null);
try {
if (message instanceof TextMessage) {
OMTextImpl textData = (OMTextImpl) soapFactory.createOMText(
((TextMessage) message).getText());
wrapper.addChild(textData);
} else if (message instanceof BytesMessage) {
BytesMessage bm = (BytesMessage) message;
byte[] msgBytes = new byte[(int) bm.getBodyLength()];
bm.reset();
bm.readBytes(msgBytes);
DataHandler dataHandler = new DataHandler(
new ByteArrayDataSource(msgBytes));
OMText textData = soapFactory.createOMText(dataHandler, true);
wrapper.addChild(textData);
msgContext.setDoingMTOM(true);
} else {
handleException("Unsupported JMS Message format : " + message.getJMSType());
}
envelope = soapFactory.getDefaultEnvelope();
envelope.getBody().addChild(wrapper);
} catch (JMSException j) {
handleException("Error wrapping JMS message into a SOAP envelope ", j);
}
}
}
String charEncOfMessage = builder == null ? null :
builder.getDocument() == null ? null : builder.getDocument().getCharsetEncoding();
String charEncOfTransport = ((String) msgContext.getProperty(
Constants.Configuration.CHARACTER_SET_ENCODING));
if (charEncOfMessage != null &&
!(charEncOfMessage.trim().length() == 0) &&
!charEncOfMessage.equalsIgnoreCase(charEncOfTransport)) {
handleException(
"Character Set Encoding from transport information do not " +
"match with character set encoding in the received " +
"SOAP message");
}
return envelope;
}
private static SOAPEnvelope getEnvelope(InputStream in, String namespace) throws XMLStreamException {
try {
in.reset();
} catch (IOException e) {
throw new XMLStreamException("Error resetting message input stream", e);
}
XMLStreamReader xmlreader = StAXUtils.createXMLStreamReader
(in, MessageContext.DEFAULT_CHAR_SET_ENCODING);
StAXBuilder builder = new StAXSOAPModelBuilder(xmlreader, namespace);
return (SOAPEnvelope) builder.getDocumentElement();
}
private static QName getQName(Object obj) {
String value;
if (obj instanceof QName) {
return (QName) obj;
} else {
value = obj.toString();
}
int open = value.indexOf('{');
int close = value.indexOf('}');
if (close > open && open > -1 && value.length() > close) {
return new QName(value.substring(open+1, close-open), value.substring(close+1));
} else {
return new QName(value);
}
}
private static void handleException(String s) {
log.error(s);
throw new AxisJMSException(s);
}
private static void handleException(String s, Exception e) {
log.error(s, e);
throw new AxisJMSException(s, e);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?