blob: 07d0dcd687446187a9b176810c0ac54ec7100cab [file] [log] [blame]
package org.apache.kandula.participant.ba;
import javax.xml.namespace.QName;
import org.apache.axis2.context.MessageContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.kandula.Constants;
import org.apache.kandula.Status;
import org.apache.kandula.context.AbstractContext;
import org.apache.kandula.context.impl.BAActivityContext;
import org.apache.kandula.context.impl.ParticipantContext;
import org.apache.kandula.faults.AbstractKandulaException;
import org.apache.kandula.faults.InvalidStateException;
import org.apache.kandula.faults.KandulaGeneralException;
import org.apache.kandula.storage.StorageUtils;
import org.apache.kandula.utility.KandulaConfiguration;
import org.apache.kandula.wsba.BACoordinatorCompletionCoordinatorServiceStub;
import org.apache.kandula.wsba.BACoordinatorCompletionParticipantServiceStub;
import org.apache.kandula.wsba.BAParticipantCompletionCoordinatorServiceStub;
import org.apache.kandula.wsba.BAParticipantCompletionParticipantServiceStub;
import org.oasis_open.docs.ws_tx.wsba._2006._06.Canceled;
import org.oasis_open.docs.ws_tx.wsba._2006._06.Closed;
import org.oasis_open.docs.ws_tx.wsba._2006._06.Compensated;
import org.oasis_open.docs.ws_tx.wsba._2006._06.Completed;
import org.oasis_open.docs.ws_tx.wsba._2006._06.ExceptionType;
import org.oasis_open.docs.ws_tx.wsba._2006._06.Exit;
import org.oasis_open.docs.ws_tx.wsba._2006._06.Fail;
import org.oasis_open.docs.ws_tx.wsba._2006._06.NotificationType;
public class BAParticipantTransactionSentCoordinator {
private static final Log log = LogFactory.getLog(BAParticipantTransactionSentCoordinator.class);
public void completed(ParticipantContext context) throws AbstractKandulaException {
context.lock();
switch (context.getStatus()) {
case (Status.BAParticipantStatus.STATUS_COMPLETING):
case (Status.BAParticipantStatus.STATUS_COMPLETED):
context.unlock();
try {
BAParticipantCompletionCoordinatorServiceStub serviceStub = new BAParticipantCompletionCoordinatorServiceStub(
MessageContext.getCurrentMessageContext().getConfigurationContext(), null);
serviceStub._getServiceClient().getOptions().setTo(context.getCoordinationEPR());
Completed completed = new Completed();
completed.setCompleted(new NotificationType());
context.setStatus(Status.BAParticipantStatus.STATUS_COMPLETED);
serviceStub.CompletedOperation(completed);
} catch (Exception e) {
log.fatal("WS_BA : " + context.getCoordinationContext().getActivityID()
+ " : completed :" + context.getID() + " : " + e);
throw new KandulaGeneralException(e);
}
break;
case (Status.BAParticipantStatus.STATUS_CANCELLING):
case (Status.BAParticipantStatus.STATUS_COMPENSATING):
case (Status.BAParticipantStatus.STATUS_ACTIVE):
case (Status.BAParticipantStatus.STATUS_CLOSING):
case (Status.BAParticipantStatus.STATUS_FAULTING):
case (Status.BAParticipantStatus.STATUS_EXITING):
case (Status.BAParticipantStatus.STATUS_ENDED):
log.fatal("WS_BA : " + context.getCoordinationContext().getActivityID()
+ " : completed :" + context.getID() + " : " + " Participant is in"
+ context.getStatus() + " (invalid) state");
throw new InvalidStateException(" Participant is in" + context.getStatus()
+ " (invalid) state");
}
}
public void closed(ParticipantContext context) throws AbstractKandulaException {
BACoordinatorCompletionCoordinatorServiceStub coordinatorStub;
switch (context.getStatus()) {
case (Status.BAParticipantStatus.STATUS_ACTIVE):
case (Status.BAParticipantStatus.STATUS_CANCELLING):
case (Status.BAParticipantStatus.STATUS_COMPLETING):
case (Status.BAParticipantStatus.STATUS_COMPLETED):
case (Status.BAParticipantStatus.STATUS_COMPENSATING):
case (Status.BAParticipantStatus.STATUS_FAULTING):
case (Status.BAParticipantStatus.STATUS_EXITING):
log.fatal("WS_BA : " + context.getCoordinationContext().getActivityID() + " : closed :"
+ context.getID() + " : " + " Participant is in" + context.getStatus()
+ " (invalid) state");
throw new InvalidStateException(" Participant is in" + context.getStatus()
+ " (invalid) state");
case (Status.BAParticipantStatus.STATUS_CLOSING):
case (Status.BAParticipantStatus.STATUS_ENDED):
try {
coordinatorStub = new BACoordinatorCompletionCoordinatorServiceStub(MessageContext
.getCurrentMessageContext().getConfigurationContext(), null);
coordinatorStub._getServiceClient().getOptions()
.setTo(context.getCoordinationEPR());
Closed closed = new Closed();
closed.setClosed(new NotificationType());
coordinatorStub.ClosedOperation(closed);
context.setStatus(Status.BAParticipantStatus.STATUS_ENDED);
StorageUtils.forgetContext(context.getID());
} catch (Exception e) {
log.fatal("WS_BA : " + context.getCoordinationContext().getActivityID()
+ " : closed :" + context.getID() + " : " + e);
throw new KandulaGeneralException(e);
}
break;
}
}
public void canceled(ParticipantContext context) throws AbstractKandulaException {
switch (context.getStatus()) {
case (Status.BAParticipantStatus.STATUS_ACTIVE):
case (Status.BAParticipantStatus.STATUS_COMPLETING):
case (Status.BAParticipantStatus.STATUS_COMPLETED):
case (Status.BAParticipantStatus.STATUS_CLOSING):
case (Status.BAParticipantStatus.STATUS_COMPENSATING):
case (Status.BAParticipantStatus.STATUS_FAULTING):
case (Status.BAParticipantStatus.STATUS_EXITING):
log.fatal("WS_BA : " + context.getCoordinationContext().getActivityID()
+ " : canceled :" + context.getID() + " : " + " Participant is in"
+ context.getStatus() + " (invalid) state");
throw new InvalidStateException(" Participant is in" + context.getStatus()
+ " (invalid) state");
case (Status.BAParticipantStatus.STATUS_CANCELLING):
case (Status.BAParticipantStatus.STATUS_ENDED):
try {
BACoordinatorCompletionCoordinatorServiceStub coordinatorServiceStub;
coordinatorServiceStub = new BACoordinatorCompletionCoordinatorServiceStub(
MessageContext.getCurrentMessageContext().getConfigurationContext(), null);
coordinatorServiceStub._getServiceClient().getOptions().setTo(
context.getCoordinationEPR());
Canceled canceled = new Canceled();
canceled.setCanceled(new NotificationType());
coordinatorServiceStub.CanceledOperation(canceled);
context.setStatus(Status.BAParticipantStatus.STATUS_ENDED);
StorageUtils.forgetContext(context.getID());
} catch (Exception e) {
log.fatal("WS_BA : " + context.getCoordinationContext().getActivityID()
+ " : canceled :" + context.getID() + " : " + e);
throw new KandulaGeneralException(e);
}
break;
}
}
public void exit(ParticipantContext context) throws AbstractKandulaException {
BACoordinatorCompletionCoordinatorServiceStub coordinatorStub;
switch (context.getStatus()) {
case (Status.BAParticipantStatus.STATUS_ACTIVE):
case (Status.BAParticipantStatus.STATUS_COMPLETING):
case (Status.BAParticipantStatus.STATUS_EXITING):
try {
coordinatorStub = new BACoordinatorCompletionCoordinatorServiceStub(MessageContext
.getCurrentMessageContext().getConfigurationContext(), null);
coordinatorStub._getServiceClient().getOptions()
.setTo(context.getCoordinationEPR());
Exit exit = new Exit();
exit.setExit(new NotificationType());
context.setStatus(Status.BAParticipantStatus.STATUS_EXITING);
coordinatorStub.ExitOperation(exit);
} catch (Exception e) {
log.fatal("WS_BA : " + context.getCoordinationContext().getActivityID()
+ " : closed :" + context.getID() + " : " + e);
throw new KandulaGeneralException(e);
}
break;
case (Status.BAParticipantStatus.STATUS_CANCELLING):
case (Status.BAParticipantStatus.STATUS_COMPLETED):
case (Status.BAParticipantStatus.STATUS_CLOSING):
case (Status.BAParticipantStatus.STATUS_COMPENSATING):
case (Status.BAParticipantStatus.STATUS_FAULTING):
case (Status.BAParticipantStatus.STATUS_ENDED):
log.fatal("WS_BA : " + context.getCoordinationContext().getActivityID() + " : exit :"
+ context.getID() + " : " + " Participant is in" + context.getStatus()
+ " (invalid) state");
throw new InvalidStateException(" Participant is in" + context.getStatus()
+ " (invalid) state");
}
}
public void compensated(ParticipantContext context) throws AbstractKandulaException {
BACoordinatorCompletionCoordinatorServiceStub coordinatorStub;
switch (context.getStatus()) {
case (Status.BAParticipantStatus.STATUS_ACTIVE):
case (Status.BAParticipantStatus.STATUS_CANCELLING):
case (Status.BAParticipantStatus.STATUS_COMPLETING):
case (Status.BAParticipantStatus.STATUS_COMPLETED):
case (Status.BAParticipantStatus.STATUS_CLOSING):
case (Status.BAParticipantStatus.STATUS_FAULTING):
case (Status.BAParticipantStatus.STATUS_EXITING):
log.fatal("WS_BA : " + context.getCoordinationContext().getActivityID()
+ " : compensated :" + context.getID() + " : " + " Participant is in"
+ context.getStatus() + " (invalid) state");
throw new InvalidStateException(" Participant is in" + context.getStatus()
+ " (invalid) state");
case (Status.BAParticipantStatus.STATUS_COMPENSATING):
case (Status.BAParticipantStatus.STATUS_ENDED):
try {
coordinatorStub = new BACoordinatorCompletionCoordinatorServiceStub(MessageContext
.getCurrentMessageContext().getConfigurationContext(), null);
coordinatorStub._getServiceClient().getOptions()
.setTo(context.getCoordinationEPR());
Compensated compensated = new Compensated();
compensated.setCompensated(new NotificationType());
context.setStatus(Status.BAParticipantStatus.STATUS_ENDED);
coordinatorStub.CompensatedOperation(compensated);
} catch (Exception e) {
log.fatal("WS_BA : " + context.getCoordinationContext().getActivityID()
+ " : compensated :" + context.getID() + " : " + e);
throw new KandulaGeneralException(e);
}
break;
}
}
public void fault(ParticipantContext context) throws AbstractKandulaException {
switch (context.getStatus()) {
case (Status.BAParticipantStatus.STATUS_ACTIVE):
case (Status.BAParticipantStatus.STATUS_COMPLETING):
context.setStatus(Status.BAParticipantStatus.STATUS_FAULTING_ACTIVE);
sendFaultMessage(context);
break;
case (Status.BAParticipantStatus.STATUS_CANCELLING):
case (Status.BAParticipantStatus.STATUS_COMPLETED):
case (Status.BAParticipantStatus.STATUS_CLOSING):
case (Status.BAParticipantStatus.STATUS_EXITING):
case (Status.BAParticipantStatus.STATUS_ENDED):
log.fatal("WS_BA : " + context.getCoordinationContext().getActivityID() + " : Fault :"
+ context.getID() + " : " + " Participant is in" + context.getStatus()
+ " (invalid) state");
throw new InvalidStateException(" Participant is in" + context.getStatus()
+ " (invalid) state");
case (Status.BAParticipantStatus.STATUS_COMPENSATING):
context.setStatus(Status.BAParticipantStatus.STATUS_FAULTING_COMPENSATING);
sendFaultMessage(context);
break;
case (Status.BAParticipantStatus.STATUS_FAULTING):
context.setStatus(Status.BAParticipantStatus.STATUS_FAULTING);
sendFaultMessage(context);
break;
}
}
private void sendFaultMessage(ParticipantContext context) throws AbstractKandulaException {
BACoordinatorCompletionCoordinatorServiceStub coordinatorStub;
try {
coordinatorStub = new BACoordinatorCompletionCoordinatorServiceStub(
KandulaConfiguration.getInstance().getPariticipantAxis2ConfigurationContext(),
null);
coordinatorStub._getServiceClient().getOptions().setTo(context.getCoordinationEPR());
Fail fail = new Fail();
ExceptionType exceptionType = new ExceptionType();
exceptionType.setExceptionIdentifier(new QName("Bimalee"));
fail.setFail(exceptionType);
context.setStatus(Status.BAParticipantStatus.STATUS_ENDED);
coordinatorStub.FailOperation(fail);
} catch (Exception e) {
log.fatal("WS_BA : " + context.getCoordinationContext().getActivityID()
+ " : compensated :" + context.getID() + " : " + e);
throw new KandulaGeneralException(e);
}
}
}