public static String getXIDString(XID xid) { // companion method to XID.toString - try to keep them in sync. StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("< formatId="); stringBuilder.append(xid.formatID); stringBuilder.append(", gtrid_length="); stringBuilder.append(xid.gtrid_length); stringBuilder.append(", bqual_length="); stringBuilder.append(xid.bqual_length); stringBuilder.append(", tx_uid="); stringBuilder.append(getUid(xid).stringForm()); stringBuilder.append(", node_name="); stringBuilder.append(getNodeName(xid)); stringBuilder.append(", branch_uid="); stringBuilder.append(getBranchUid(xid)); stringBuilder.append(", eis_name="); stringBuilder.append(getEISName(xid)); stringBuilder.append(" >"); return stringBuilder.toString(); } }
/** * Returning subordinate node name codified inside of the Xid. * * @param xid the xid to check the subordinate node name * @return subordinate node name saved in the xid */ public static final String getSubordinateNodeName (Xid xid) { return XATxConverter.getSubordinateNodeName(getXIDfromXid(xid)); }
public XidImple(Xid xid, boolean branch, Integer eisName) { this(xid); if (branch) { XATxConverter.setBranchUID(_theXid, new Uid()); } XATxConverter.setEisName(_theXid, eisName); }
if (uid.notEquals(Uid.nullUid())) XidImple loadedXid = (XidImple) saa.getXid(); if (loadedXid.getFormatId() == XATxConverter.FORMAT_ID) { String loadedXidSubordinateNodeName = XATxConverter.getSubordinateNodeName(loadedXid.getXID()); if (TxControl.getXANodeName().equals(loadedXidSubordinateNodeName)) { if (parentNodeName.equals(saa.getParentNodeName())) { if (jtaLogger.logger.isDebugEnabled()) { XidImple loadedXid = (XidImple) saa.getXid(); if (loadedXid.getFormatId() == XATxConverter.FORMAT_ID) { String loadedXidSubordinateNodeName = XATxConverter.getSubordinateNodeName(loadedXid.getXID()); if (XATxConverter.getSubordinateNodeName(new XidImple(xid).getXID()).equals(loadedXidSubordinateNodeName)) { if (Arrays.equals(loadedXid.getGlobalTransactionId(), xid.getGlobalTransactionId())) { if (jtaLogger.logger.isDebugEnabled()) { jtaLogger.logger.debug("Found record for " + saa);
public SubordinateAtomicAction (int timeout, Xid xid) { super(timeout); // implicit start (done in base class) if (xid != null && xid.getFormatId() == XATxConverter.FORMAT_ID) { XidImple toImport = new XidImple(xid); XID toCheck = toImport.getXID(); _parentNodeName = XATxConverter.getSubordinateNodeName(toCheck); if (_parentNodeName == null) { _parentNodeName = XATxConverter.getNodeName(toCheck); } XATxConverter.setSubordinateNodeName(toImport.getXID(), TxControl.getXANodeName()); _theXid = new XidImple(toImport); } else { _theXid = new XidImple(xid); } _activated = true; }
private XidImple convertXid(Xid xid) { if (xid != null && xid.getFormatId() == XATxConverter.FORMAT_ID) { XidImple toImport = new XidImple(xid); XATxConverter.setSubordinateNodeName(toImport.getXID(), TxControl.getXANodeName()); return new SubordinateXidImple(toImport); } else { return new XidImple(xid); } }
@Override public Vote checkXid(Xid xid) { if (xid.getFormatId() != XATxConverter.FORMAT_ID) { String nodeName = XATxConverter.getSubordinateNodeName(new XidImple(xid).getXID());
byte[] gtridUid = uid.getBytes(); String nodeName = TxControl.getXANodeName(); int nodeNameLengthToUse = nodeName.getBytes().length; xid.gtrid_length = gtridUid.length+nodeNameLengthToUse; if (branch.notEquals(Uid.nullUid())) setEisName(xid, eisName);
assertEquals(XATxConverter.getNodeName(rootXid.getXID()), nodeName1); assertEquals(XATxConverter.getNodeName(rootXid.getXID()).length(), nodeNameLength); assertEquals(XATxConverter.getEISName(rootXid.getXID()), eisName); assertEquals( XATxConverter.getSubordinateNodeName(rootXid.getXID()), null); XATxConverter.setSubordinateNodeName(rootXid.getXID(), nodeName2); XidImple subordinateXid = new XidImple(rootXid); + subordinateXid.getBranchQualifier().length, subordinateXid.getBranchQualifier().length <= Xid.MAXBQUALSIZE); assertEquals(XATxConverter.getNodeName(subordinateXid.getXID()), nodeName1); assertEquals(XATxConverter.getNodeName(subordinateXid.getXID()) .length(), nodeNameLength); assertEquals(XATxConverter.getEISName(subordinateXid.getXID()), eisName); assertEquals(XATxConverter.getSubordinateNodeName(subordinateXid .getXID()), nodeName2); assertEquals( XATxConverter.getSubordinateNodeName( subordinateXid.getXID()).length(), nodeNameLength);
@Test public void testSubordinateJTAXAResourceOrphanFilter() throws HeuristicRollbackException, HeuristicMixedException, HeuristicCommitException, SystemException, RollbackException, XAException { XAResourceOrphanFilter orphanFilter = new SubordinateJTAXAResourceOrphanFilter(); XidImple xid = (XidImple) XATxConverter.getXid(Uid.nullUid(), false, XATxConverter.FORMAT_ID); XATxConverter.setSubordinateNodeName(xid.getXID(), TxControl.getXANodeName()); List<String> xaRecoveryNodes = jtaPropertyManager.getJTAEnvironmentBean().getXaRecoveryNodes(); try { jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(Arrays.asList("2")); assertEquals(XAResourceOrphanFilter.Vote.ABSTAIN, orphanFilter.checkXid(xid)); jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(Arrays.asList("1")); assertEquals(XAResourceOrphanFilter.Vote.ROLLBACK, orphanFilter.checkXid(xid)); } finally { jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(xaRecoveryNodes); } } }
XidImple xid2 = new XidImple(new Uid()); assertTrue(XATxConverter.getNodeName(xid1.getXID()).equals(TxControl.getXANodeName()));
@Test public void testJTATransactionLogOrphanFilter() { XAResourceOrphanFilter orphanFilter = new JTATransactionLogXAResourceOrphanFilter(); Xid notJTAFormatId = XATxConverter.getXid(new Uid(), false, 0); assertEquals(XAResourceOrphanFilter.Vote.ABSTAIN, orphanFilter.checkXid(notJTAFormatId)); Xid jtaFormatId = XATxConverter.getXid(new Uid(), false, XATxConverter.FORMAT_ID); assertEquals(XAResourceOrphanFilter.Vote.ABSTAIN, orphanFilter.checkXid(jtaFormatId)); }
@Test public void testJTANodeNameXAResourceOrphanFilter() { XAResourceOrphanFilter orphanFilter = new JTANodeNameXAResourceOrphanFilter(); Xid notJTAFormatId = XATxConverter.getXid(new Uid(), false, 0); assertEquals(XAResourceOrphanFilter.Vote.ABSTAIN, orphanFilter.checkXid(notJTAFormatId)); List<String> recoveryNodes = new LinkedList<String>(); recoveryNodes.add("1"); jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(recoveryNodes); String notRecoverableNodeName ="2"; TxControl.setXANodeName(notRecoverableNodeName); Xid jtaNotRecoverableNodeName = XATxConverter.getXid(new Uid(), false, XATxConverter.FORMAT_ID); assertEquals(XAResourceOrphanFilter.Vote.ABSTAIN, orphanFilter.checkXid(jtaNotRecoverableNodeName)); String recoverableNodeName ="1"; TxControl.setXANodeName(recoverableNodeName); Xid jtaRecoverableNodeName = XATxConverter.getXid(new Uid(), false, XATxConverter.FORMAT_ID); assertEquals(XAResourceOrphanFilter.Vote.ROLLBACK, orphanFilter.checkXid(jtaRecoverableNodeName)); recoveryNodes.clear(); recoveryNodes.add(NodeNameXAResourceOrphanFilter.RECOVER_ALL_NODES); jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(recoveryNodes); assertEquals(XAResourceOrphanFilter.Vote.ROLLBACK, orphanFilter.checkXid(jtaNotRecoverableNodeName)); assertEquals(XAResourceOrphanFilter.Vote.ROLLBACK, orphanFilter.checkXid(jtaRecoverableNodeName)); }
@Override public String getNodeName() { return XATxConverter.getNodeName(xidImple.getXID()); } @Override
public static String getNodeName(XID xid) { if(xid.formatID != FORMAT_ID) { return null; } // the node name follows the Uid with no separator, so the only // way to tell where it starts is to figure out how long the Uid is. Uid uid = getUid(xid); int uidLength = uid.getBytes().length; int nameLength = xid.gtrid_length-uidLength; byte[] nodeName = new byte[nameLength]; System.arraycopy(xid.data, uidLength, nodeName, 0, nodeName.length); try { return new String(nodeName, "US-ASCII"); } catch(UnsupportedEncodingException e) { // should never happen, we use a required charset. return "<failed to get nodename>"; } }
@Test public void testForeignXID() { XidImple foreignXidImple = new XidImple(new MyForeignXID()); assertEquals(XATxConverter.getNodeName(foreignXidImple.getXID()), null); assertTrue(XATxConverter.getEISName(foreignXidImple.getXID()) == -1); assertEquals(XATxConverter.getSubordinateNodeName(foreignXidImple.getXID()), null); }
public final Uid getTransactionUid() { return XATxConverter.getUid(_theXid); }
public String toString () { // controversial and not too robust. see JBTM-297 before messing with this. if(formatID == XATxConverter.FORMAT_ID) { // it's one of ours, we know how to inspect it: return XATxConverter.getXIDString(this); } // it's a foreign id format, use a general algorithm: StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("< "); stringBuilder.append(formatID); stringBuilder.append(", "); stringBuilder.append(gtrid_length); stringBuilder.append(", "); stringBuilder.append(bqual_length); stringBuilder.append(", "); for (int i = 0; i < gtrid_length; i++) { stringBuilder.append(data[i]); } stringBuilder.append(", "); for (int i = 0; i < bqual_length; i++) { stringBuilder.append(gtrid_length+data[i]); } stringBuilder.append(" >"); return stringBuilder.toString(); }
/** * Returning eis name codified inside of the Xid. * * @param xid the xid to check the eis name * @return eis name integer saved in the xid */ public static final Integer getEisName (Xid xid) { return XATxConverter.getEISName(getXIDfromXid(xid)); }