@POST @Produces(TxMediaType.PLAIN_MEDIA_TYPE) public String enlist( @Context UriInfo info, @QueryParam("pId") @DefaultValue("") String pId, @QueryParam("fault") @DefaultValue("") String fault, @QueryParam("twoPhaseAware") @DefaultValue("true") String twoPhaseAware, @QueryParam("isVolatile") @DefaultValue("false") String isVolatile, String enlistUrl) throws IOException { Work work = faults.get(pId); TxSupport txn = new TxSupport(); String txId = enlistUrl.substring(enlistUrl.lastIndexOf('/') + 1); boolean isTwoPhaseAware = "true".equals(twoPhaseAware); boolean isVolatileParticipant = "true".equals(isVolatile); String vRegistration = null; // URI for registering with the volatile phase String vParticipantLink = null; // URI for handling pre and post 2PC phases String path = TxSupport.extractUri(info); if (work == null) { int id = ++pid; work = makeWork( txn, path, String.valueOf(id), txId, enlistUrl, isTwoPhaseAware, isVolatileParticipant, null, fault); } else { Work newWork = makeWork( txn, path, work.id, txId, enlistUrl, isTwoPhaseAware, isVolatileParticipant, null, fault); newWork.oldState = work.oldState; newWork.newState = work.newState; work = newWork; } if (enlistUrl.indexOf(',') != -1) { String[] urls = enlistUrl.split(","); if (urls.length < 2) throw new WebApplicationException(HttpURLConnection.HTTP_BAD_REQUEST); enlistUrl = urls[0]; vRegistration = urls[1]; String vParticipant = new StringBuilder(path) .append('/') .append(work.id) .append('/') .append(txId) .append('/') .append("vp") .toString(); vParticipantLink = txn.addLink2(new StringBuilder(), TxLinkNames.VOLATILE_PARTICIPANT, vParticipant, true) .toString(); } try { // enlist TestResource in the transaction as a participant work.recoveryUrl = txn.enlistParticipant(enlistUrl, work.pLinks); if (vParticipantLink != null) txn.enlistVolatileParticipant(vRegistration, vParticipantLink); } catch (HttpResponseException e) { throw new WebApplicationException(e.getActualResponse()); } work.status = TxStatus.TransactionActive.name(); work.start(); faults.put(work.id, work); return work.id; }
@SuppressWarnings({"UnusedDeclaration"}) @GET public String getBasic( @Context UriInfo info, @QueryParam("pId") @DefaultValue("") String pId, @QueryParam("context") @DefaultValue("") String ctx, @QueryParam("name") @DefaultValue("") String name, @QueryParam("value") @DefaultValue("") String value, @QueryParam("query") @DefaultValue("pUrl") String query, @QueryParam("arg") @DefaultValue("") String arg, @QueryParam("twoPhaseAware") @DefaultValue("true") String twoPhaseAware, @QueryParam("isVolatile") @DefaultValue("false") String isVolatileParticipant, @QueryParam("register") @DefaultValue("true") String register) { Work work = faults.get(pId); String res = null; boolean isVolatile = "true".equals(isVolatileParticipant); boolean isTwoPhaseAware = "true".equals(twoPhaseAware); if (name.length() != 0) { if (value.length() != 0) { if (work == null) { work = makeWork( new TxSupport(), TxSupport.extractUri(info), String.valueOf(++pid), null, null, isTwoPhaseAware, isVolatile, null, null); work.oldState.put(name, value); faults.put(work.id, work); return work.id; } work.newState.put(name, value); } if (work != null) { if ("syncCount".equals(name)) res = String.valueOf(work.syncCount); else if ("commitCnt".equals(name)) res = String.valueOf(work.commitCnt); else if ("prepareCnt".equals(name)) res = String.valueOf(work.prepareCnt); else if ("rollbackCnt".equals(name)) res = String.valueOf(work.rollbackCnt); else if ("commmitOnePhaseCnt".equals(name)) res = String.valueOf(work.commmitOnePhaseCnt); else if (work.inTxn()) res = work.newState.get(name); else res = work.oldState.get(name); } } if (work == null) throw new WebApplicationException(HttpURLConnection.HTTP_NOT_FOUND); if ("move".equals(query)) res = moveParticipant(work, arg, register, isTwoPhaseAware, isVolatile); else if ("recoveryUrl".equals(query)) res = work.recoveryUrl; else if ("status".equals(query)) res = work.status; else if (res == null) res = work.pLinks; return res; // null will generate a 204 status code (no content) }