Fixing the coordination context missing issue

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);

+	}

 }