Fixing the coordination context missing issue
git-svn-id: https://svn.apache.org/repos/asf/webservices/kandula/trunk/java@501849 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/org/apache/kandula/initiator/TransactionOutHandler.java b/src/org/apache/kandula/initiator/TransactionOutHandler.java
index c7284f0..337a737 100644
--- a/src/org/apache/kandula/initiator/TransactionOutHandler.java
+++ b/src/org/apache/kandula/initiator/TransactionOutHandler.java
@@ -16,6 +16,16 @@
*/
package org.apache.kandula.initiator;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.util.StAXUtils;
import org.apache.axiom.soap.SOAPHeader;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
@@ -25,41 +35,91 @@
import org.apache.kandula.Constants;
import org.apache.kandula.context.AbstractContext;
import org.apache.kandula.context.CoordinationContext;
+import org.apache.kandula.faults.AbstractKandulaException;
+import org.apache.kandula.faults.KandulaGeneralException;
+import org.oasis_open.docs.ws_tx.wscoor._2006._06.CoordinationContext_type3;
+import org.xmlsoap.schemas.ws._2004._08.addressing.ReferenceParametersType;
public class TransactionOutHandler extends AbstractHandler {
-
+
/**
* Field log
*/
private static final Log log = LogFactory.getLog(TransactionOutHandler.class);
-
+
private static ThreadLocal threadInfo = new ThreadLocal();
-
+
private static final long serialVersionUID = 4133392345837905499L;
-
+
public InvocationResponse invoke(MessageContext msgContext) throws AxisFault {
-
+
InitiatorContext initiatorTransaction;
String wsaAction = msgContext.getWSAAction();
if ((wsaAction != Constants.WS_COOR_CREATE_COORDINATIONCONTEXT)
&& (wsaAction != Constants.WS_COOR_REGISTER)
&& (wsaAction != Constants.WS_AT_COMMIT) && (wsaAction != Constants.WS_AT_ROLLBACK)) {
- Object context = threadInfo.get();
- if (context==null)
- {
- context = msgContext.getProperty(Constants.TRANSACTION_CONTEXT);
+ Object context = null;
+ try {
+ context = TransactionManager.getTransaction();
+ } catch (AbstractKandulaException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
- // We let the message to pass through if no transaction is found in the thread or in msgContext
+ if (context == null) {
+ context = msgContext.getProperty(Constants.Configuration.TRANSACTION_CONTEXT);
+ }
+ // We let the message to pass through if no transaction is found in
+ // the thread or in msgContext
if (context != null) {
+ Object registrationID = msgContext
+ .getProperty(Constants.Configuration.PARTICIPANT_IDENTIFIER);
AbstractContext txContext = (AbstractContext) context;
SOAPHeader soapHeader = msgContext.getEnvelope().getHeader();
CoordinationContext coorContext = txContext.getCoordinationContext();
- soapHeader.addChild(coorContext.toOM());
+
+ //ws-ba users can set a identifier for the participants
+ if (registrationID != null) {
+ CoordinationContext_type3 context_type32 = null;
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ try {
+ coorContext.toOM().serialize(byteArrayOutputStream);
+ context_type32 = CoordinationContext_type3.Factory.parse(StAXUtils
+ .createXMLStreamReader(new ByteArrayInputStream(
+ byteArrayOutputStream.toByteArray())));
+ context_type32.setExtraAttributes(null);
+ } catch (Exception e) {
+ throw new AxisFault(e);
+ }
+ ReferenceParametersType referenceParametersType = context_type32
+ .getRegistrationService().getReferenceParameters();
+ OMElement omElement = soapHeader.getOMFactory().createOMElement(
+ Constants.PARTICIPANT_ID_PARAMETER, null);
+ omElement.setText((String) registrationID);
+ referenceParametersType.addExtraElement(omElement);
+ soapHeader.addChild(context_type32.getOMElement(new QName(Constants.WS_COOR,
+ "CoordinationContext"), soapHeader.getOMFactory()));
+ } else {
+ soapHeader.addChild(coorContext.toOM());
+ }
+
} else {
- log.debug("Transaction Handler Engaged. " +
- "But no transaction information was found in the thread.");
+ log.debug("Transaction Handler Engaged. "
+ + "But no transaction information was found in the thread.");
}
}
return InvocationResponse.CONTINUE;
}
+
+ private static void addParticipantIdentifier(OMElement coorContext, String participantID) {
+ // Opps.. OMSourcedElementImpl.build() is broken
+ coorContext.getFirstOMChild();
+ OMElement registrationEPRElement = coorContext.getFirstChildWithName(new QName(
+ "RegistrationService", Constants.WS_COOR));
+ OMElement refParameters = registrationEPRElement.getFirstChildWithName(new QName(
+ "ReferenceParameters", "http://schemas.xmlsoap.org/ws/2004/08/addressing"));
+ OMElement omElement = registrationEPRElement.getOMFactory().createOMElement(
+ Constants.PARTICIPANT_ID_PARAMETER, null);
+ omElement.setText(participantID);
+ refParameters.addChild(omElement);
+ }
}