AddressingProperties maps = ContextUtils.retrieveMAPs(message, false, false, false);
AttributedURIType actionURI = null == maps ? null : maps.getAction();
String action = null == actionURI ? null : actionURI.getValue().trim();
LOG.fine("action: " + action);
RMConstants consts;
if (RM10Constants.ACTIONS.contains(action)) {
consts = RM10Constants.INSTANCE;
} else if (RM11Constants.ACTIONS.contains(action)) {
consts = RM11Constants.INSTANCE;
} else {
return;
}
RMProperties rmps = RMContextUtils.retrieveRMProperties(message, false);
rmps.exposeAs(consts.getWSRMNamespace());
ProtocolVariation protocol =
ProtocolVariation.findVariant(consts.getWSRMNamespace(), maps.getNamespaceURI());
LOG.info("Updating service model info in exchange");
RMManager manager = getManager(message);
assert manager != null;
RMEndpoint rme = null;
try {
rme = manager.getReliableEndpoint(message);
} catch (RMException e) {
throw new SoapFault(new org.apache.cxf.common.i18n.Message("CANNOT_PROCESS", LOG), e,
message.getVersion().getSender());
}
Exchange exchange = message.getExchange();
Endpoint ep = rme.getEndpoint(protocol);
exchange.put(Endpoint.class, ep);
exchange.put(Service.class, ep.getService());
exchange.put(Binding.class, ep.getBinding());
// Also set BindingOperationInfo as some operations (SequenceAcknowledgment) have
// neither in nor out messages, and thus the WrappedInInterceptor cannot
// determine the operation name.
BindingInfo bi = ep.getEndpointInfo().getBinding();
BindingOperationInfo boi = null;
boolean isOneway = true;
if (consts.getCreateSequenceAction().equals(action)) {
if (RMContextUtils.isServerSide(message)) {
boi = bi.getOperation(consts.getCreateSequenceOperationName());
isOneway = false;
} else {
boi = bi.getOperation(consts.getCreateSequenceOnewayOperationName());
}
} else if (consts.getCreateSequenceResponseAction().equals(action)) {
if (RMContextUtils.isServerSide(message)) {
boi = bi.getOperation(consts.getCreateSequenceResponseOnewayOperationName());
} else {
boi = bi.getOperation(consts.getCreateSequenceOperationName());
isOneway = false;
}
} else if (consts.getSequenceAckAction().equals(action)) {
boi = bi.getOperation(consts.getSequenceAckOperationName());
} else if (consts.getAckRequestedAction().equals(action)) {
boi = bi.getOperation(consts.getAckRequestedOperationName());
} else if (consts.getTerminateSequenceAction().equals(action)) {
boi = bi.getOperation(consts.getTerminateSequenceOperationName());
} else if (RM11Constants.INSTANCE.getTerminateSequenceResponseAction().equals(action)) {
//TODO add server-side TSR handling
boi = bi.getOperation(RM11Constants.INSTANCE.getTerminateSequenceOperationName());
isOneway = false;
} else if (consts.getCloseSequenceAction().equals(action)) {
boi = bi.getOperation(consts.getCloseSequenceOperationName());
} else if (RM11Constants.INSTANCE.getCloseSequenceResponseAction().equals(action)) {
boi = bi.getOperation(RM11Constants.INSTANCE.getCloseSequenceOperationName());
isOneway = false;
}
// make sure the binding information has been set
if (boi == null) {
LOG.fine("No BindingInfo for action " + action);
} else {
exchange.put(BindingOperationInfo.class, boi);
exchange.put(OperationInfo.class, boi.getOperationInfo());
exchange.setOneWay(isOneway);
}
// Fix requestor role (as the client side message observer always sets it to TRUE)
// to allow unmarshalling the body of a server originated TerminateSequence request.
// In the logical RM interceptor set it back to what it was so that the logical
// addressing interceptor does not try to send a partial response to
// server originated oneway RM protocol messages.
//
if (!consts.getCreateSequenceResponseAction().equals(action)
&& !consts.getSequenceAckAction().equals(action)
&& !RM11Constants.INSTANCE.getTerminateSequenceResponseAction().equals(action)
&& !RM11Constants.INSTANCE.getCloseSequenceResponseAction().equals(action)) {
LOG.fine("Changing requestor role from " + message.get(Message.REQUESTOR_ROLE)
+ " to false");
Object originalRequestorRole = message.get(Message.REQUESTOR_ROLE);