TCPTransportPipepublic class TCPTransportPipe extends Object implements com.sun.xml.ws.api.pipe.Pipe
Fields Summary |
---|
private static final Logger | logger | protected TCPClientTransport | clientTransport | protected final com.sun.xml.ws.api.pipe.Codec | defaultCodec | protected final com.sun.xml.ws.api.WSBinding | wsBinding | protected final com.sun.xml.ws.api.WSService | wsService |
Methods Summary |
---|
protected void | abortSession(com.sun.xml.ws.transport.tcp.util.ChannelContext channelContext)
if (channelContext != null) {
WSConnectionManager.getInstance().abortConnection(channelContext.getConnectionSession());
}
| private static boolean | canRetry(int retryNum)
return retryNum <= TCPConstants.CLIENT_MAX_FAIL_TRIES;
| public com.sun.xml.ws.api.pipe.Pipe | copy(com.sun.xml.ws.api.pipe.PipeCloner cloner)
return new TCPTransportPipe(this, cloner);
| private java.lang.String | getSOAPAction(java.lang.String soapAction, com.sun.xml.ws.api.message.Packet packet)get SOAPAction header if the soapAction parameter is non-null or BindingProvider properties set.
BindingProvider properties take precedence.
Boolean useAction = (Boolean) packet.invocationProperties.get(BindingProvider.SOAPACTION_USE_PROPERTY);
String sAction = null;
boolean use = (useAction != null) ? useAction.booleanValue() : false;
if (use) {
//TODO check if it needs to be quoted
sAction = packet.soapAction;
}
//request Property soapAction overrides wsdl
if (sAction != null) {
return sAction;
} else {
return soapAction;
}
| public void | preDestroy()
if (clientTransport != null) {
WSConnectionManager.getInstance().closeChannel(clientTransport.getConnectionContext());
}
| public com.sun.xml.ws.api.message.Packet | process(com.sun.xml.ws.api.message.Packet packet)
if (logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, MessagesMessages.WSTCP_1010_TCP_TP_PROCESS_ENTER(packet.endpointAddress));
}
ChannelContext channelContext = null;
WebServiceException failure = null;
final WSConnectionManager wsConnectionManager = WSConnectionManager.getInstance();
int retryNum = 0;
do {
try {
setupClientTransport(wsConnectionManager, packet.endpointAddress.getURI());
channelContext = clientTransport.getConnectionContext();
wsConnectionManager.lockConnection(channelContext.getConnectionSession());
// Taking Codec from ChannelContext
final Codec codec = channelContext.getCodec();
final ContentType ct = codec.getStaticContentType(packet);
clientTransport.setContentType(ct.getContentType());
/* write transport SOAPAction header if required
* in HTTP this param is sent as HTTP header, in SOAP/TCP
* it is part of content-type (similar to SOAP 1.2) */
writeTransportSOAPActionHeaderIfRequired(channelContext, ct, packet);
if (logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, MessagesMessages.WSTCP_1013_TCP_TP_PROCESS_ENCODE(ct.getContentType()));
}
codec.encode(packet, clientTransport.openOutputStream());
if (logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, MessagesMessages.WSTCP_1014_TCP_TP_PROCESS_SEND());
}
clientTransport.send();
if (logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, MessagesMessages.WSTCP_1015_TCP_TP_PROCESS_OPEN_PREPARE_READING());
}
final InputStream replyInputStream = clientTransport.openInputStream();
if (logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, MessagesMessages.WSTCP_1016_TCP_TP_PROCESS_OPEN_PROCESS_READING(clientTransport.getStatus(), clientTransport.getContentType()));
}
if (clientTransport.getStatus() != TCPConstants.ERROR) {
final Packet reply = packet.createClientResponse(null);
if (clientTransport.getStatus() != TCPConstants.ONE_WAY && !Boolean.FALSE.equals(packet.expectReply)) {
final String contentTypeStr = clientTransport.getContentType();
codec.decode(replyInputStream, contentTypeStr, reply);
}
return reply;
} else {
logger.log(Level.SEVERE, MessagesMessages.WSTCP_0016_ERROR_WS_EXECUTION_ON_SERVER(clientTransport.getError()));
throw new WSTCPException(clientTransport.getError());
}
} catch(ClientTransportException e) {
abortSession(channelContext);
failure = e;
} catch(WSTCPException e) {
if (e.getError().isCritical()) {
abortSession(channelContext);
} else {
releaseSession(channelContext);
}
failure = new WebServiceException(MessagesMessages.WSTCP_0016_ERROR_WS_EXECUTION_ON_SERVER(e.getError()), e);
} catch(IOException e) {
abortSession(channelContext);
failure = new WebServiceException(MessagesMessages.WSTCP_0017_ERROR_WS_EXECUTION_ON_CLIENT(), e);
} catch(ServiceChannelException e) {
releaseSession(channelContext);
retryNum = TCPConstants.CLIENT_MAX_FAIL_TRIES + 1;
failure = new WebServiceException(MessagesMessages.WSTCP_0016_ERROR_WS_EXECUTION_ON_SERVER(e.getFaultInfo().getErrorCode() + ":" + e.getMessage()), e);
} catch(Exception e) {
abortSession(channelContext);
retryNum = TCPConstants.CLIENT_MAX_FAIL_TRIES + 1;
failure = new WebServiceException(MessagesMessages.WSTCP_0017_ERROR_WS_EXECUTION_ON_CLIENT(), e);
}
if (logger.isLoggable(Level.FINE) && canRetry(retryNum + 1)) {
logger.log(Level.FINE, MessagesMessages.WSTCP_0012_SEND_RETRY(retryNum), failure);
}
} while (canRetry(++retryNum));
assert failure != null;
logger.log(Level.SEVERE, MessagesMessages.WSTCP_0001_MESSAGE_PROCESS_FAILED(), failure);
throw failure;
| protected void | releaseSession(com.sun.xml.ws.transport.tcp.util.ChannelContext channelContext)
if (channelContext != null) {
WSConnectionManager.getInstance().freeConnection(channelContext.getConnectionSession());
}
| private void | setupClientTransport(WSConnectionManager wsConnectionManager, java.net.URI uri)
final WSTCPURI tcpURI = WSTCPURI.parse(uri);
if (tcpURI == null) throw new WebServiceException(MessagesMessages.WSTCP_0005_INVALID_EP_URL(uri.toString()));
final ChannelContext channelContext = wsConnectionManager.openChannel(tcpURI, wsService, wsBinding, defaultCodec);
clientTransport.setup(channelContext);
| protected void | writeTransportSOAPActionHeaderIfRequired(com.sun.xml.ws.transport.tcp.util.ChannelContext channelContext, com.sun.xml.ws.api.pipe.ContentType ct, com.sun.xml.ws.api.message.Packet packet)
String soapActionTransportHeader = getSOAPAction(ct.getSOAPActionHeader(), packet);
if (soapActionTransportHeader != null) {
try {
int transportSoapActionParamId = channelContext.encodeParam(TCPConstants.TRANSPORT_SOAP_ACTION_PROPERTY);
channelContext.getConnection().setContentProperty(transportSoapActionParamId, soapActionTransportHeader);
} catch (WSTCPException ex) {
logger.log(Level.WARNING, MessagesMessages.WSTCP_0032_UNEXPECTED_TRANSPORT_SOAP_ACTION(), ex);
}
}
|
|