package connector;
import javax.resource.spi.work.*;
import javax.resource.spi.endpoint.MessageEndpoint;
import javax.resource.spi.XATerminator;
import javax.transaction.xa.Xid;
import java.util.List;
import java.util.ArrayList;
public class NestedWork_Parent extends DeliveryWork implements WorkContextProvider {
// private WorkContexts ics = null;
private List<WorkContext> contextsList = new ArrayList<WorkContext>();
private MessageEndpoint ep;
private int numOfMessages;
private int workCount = 1;
private String op = null;
private WorkManager wm;
private XATerminator xa;
private boolean transactedChild;
private boolean transacted;
private boolean successfulPVForChild;
private boolean translationRequired;
public NestedWork_Parent(MessageEndpoint ep, int numOfMessages, String op, int workCount,
WorkManager wm, XATerminator xa, boolean transacted, boolean transactedChild,
boolean successfulPVForChild, boolean translationRequired) {
super(ep, numOfMessages, op);
this.workCount = workCount;
this.ep = ep;
this.numOfMessages = numOfMessages;
this.op = op;
this.wm = wm;
this.xa = xa;
this.transacted = transacted;
this.transactedChild = transactedChild;
this.successfulPVForChild = successfulPVForChild;
this.translationRequired = translationRequired;
}
public NestedWork_Parent(MessageEndpoint ep, int numOfMessages, String op, boolean keepCount,
int workCount, WorkManager wm, XATerminator xa, boolean transacted, boolean transactedChild,
boolean successfulPVForChild, boolean translationRequired) {
super(ep, numOfMessages, op, keepCount);
this.workCount = workCount;
this.ep = ep;
this.numOfMessages = numOfMessages;
this.op = op;
this.wm = wm;
this.xa = xa;
this.transacted = transacted;
this.transactedChild = transactedChild;
this.successfulPVForChild = successfulPVForChild;
this.translationRequired = translationRequired;
}
public List<WorkContext> getWorkContexts() {
return contextsList;
}
public void addWorkContext(WorkContext ic) {
contextsList.add(ic);
}
public void run() {
for (int i = 0; i < workCount; i++) {
ExecutionContext ec1 = null;
try {
if(transacted){
super.run();
}
NestedWork_Child w1 = new NestedWork_Child(ep, numOfMessages, op, transactedChild, translationRequired);
if (transactedChild) {
ec1 = startTx();
TransactionContext tic = new TransactionContext();
tic.setXid(ec1.getXid());
w1.addWorkContext(tic);
}
if(successfulPVForChild){
MySecurityContext sic =
new MySecurityContextWithListener("prasath", "jagadish", "jagadish", translationRequired, true, true);
w1.addWorkContext(sic);
}else{
MySecurityContext sic =
new MySecurityContextWithListener("abc", "xyz", "jagadish", translationRequired, true, false);
w1.addWorkContext(sic);
}
debug("executing nested work parent instance [ " + i + " ] ");
wm.doWork(w1, 0, null, null);
if (transactedChild) {
xa.commit(ec1.getXid(), true);
debug("commiting nested work parent instance [ " + i + " ] ");
}
debug("completed nested work parent instance [ " + i + " ] ");
} catch (Exception we) {
debug(we.toString());
}
}
}
private ExecutionContext startTx() {
ExecutionContext ec = new ExecutionContext();
try {
Xid xid = new XID();
ec.setXid(xid);
ec.setTransactionTimeout(50 * 1000); //50 seconds
} catch (Exception ex) {
ex.printStackTrace();
}
return ec;
}
public void debug(String message) {
System.out.println("JSR-322 [RA] [Nested Work - Parent]: " + message);
}
}