jackrabbit-jcr-rmi: Supplied javax.transaction.xa.Xid is assumed serializable, 
but is not on some environments.
---------------------------------------------------------------------------------------------------------------

                 Key: JCR-1333
                 URL: https://issues.apache.org/jira/browse/JCR-1333
             Project: Jackrabbit
          Issue Type: Bug
    Affects Versions: 1.4
         Environment: Linux (suse9) with websphere 6.1 invoking jackrabbit 
client RMI
            Reporter: Paul Gribben


Websphere provides a non-serializable javax.transaction.xa.Xid implementation, 
causing ClientXAResource to fail with NotSerializableException when passing Xid 
over RMI.
I have worked around this by converting the supplied Xid to a local 
serializable Xid implementation that takes the supplied Xid parameters, and 
implements hashCode() and equals() correctly:

    private static class SerializableXID implements javax.transaction.xa.Xid, 
Serializable {
        /**
                 * Serial version ID
                 */
                private static final long serialVersionUID = 
-1390620315181450507L;
                
                private final byte[] branchQualifier;
        private final byte[] globalTransactionId;
        private final int formatId;
        private final int hashCode;
        
        public SerializableXID(Xid xid) {
                branchQualifier = xid.getBranchQualifier();
                globalTransactionId = xid.getGlobalTransactionId();
                formatId = xid.getFormatId();
                hashCode = xid.hashCode();
        }

                public byte[] getBranchQualifier() {
                        return branchQualifier;
                }

                public int getFormatId() {
                        return formatId;
                }

                public byte[] getGlobalTransactionId() {
                        return globalTransactionId;
                }

        public final int hashCode() {
                return hashCode;
        }
        
        public final boolean equals(Object obj) {
                if(obj == this) {
                    return true;
                }
                
                if(!(obj instanceof Xid)) {
                        return false;                   
                }
                
                Xid xidimpl = (Xid)obj;
                if(formatId != xidimpl.getFormatId()) {
                        return false;
                }
                else {
                    return Arrays.equals(branchQualifier, 
xidimpl.getBranchQualifier())
                        && Arrays.equals(globalTransactionId, 
xidimpl.getGlobalTransactionId());
                }
        }
    }


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to