com.arjuna.ats.internal.jbossatx.jts.PropagationContextWrapper Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of narayana-jts-integration
Show all versions of narayana-jts-integration
Narayana: ArjunaJTS integration (atx)
/*
* JBoss, Home of Professional Open Source
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* (C) 2005-2006,
* @author JBoss Inc.
*/
/*
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
*
* Arjuna Technologies Ltd.
* Newcastle upon Tyne,
* Tyne and Wear,
* UK.
*
* $Id: PropagationContextWrapper.java,v 1.5 2004/10/04 09:48:19 nmcl Exp $
*/
package com.arjuna.ats.internal.jbossatx.jts;
import org.omg.CosTransactions.*;
import java.io.*;
import com.arjuna.ats.internal.jts.ORBManager;
import com.arjuna.ats.jts.utils.Utility;
/**
* This class is a wrapper around a PropagationContext object allowing it to be serialized.
*
* @author Richard A. Begg ([email protected])
* @version $Id: PropagationContextWrapper.java,v 1.5 2004/10/04 09:48:19 nmcl Exp $
*/
public class PropagationContextWrapper implements Externalizable
{
private static boolean _propagateFullContext = false;
private boolean _isNull = true;
private int _timeout;
private TransIdentityWrapper _current;
private TransIdentityWrapper[] _parents = null;
private PropagationContext _tpc = null;
public static void setPropagateFullContext(boolean propagateFullContext)
{
_propagateFullContext = propagateFullContext;
}
public static boolean getPropagateFullContext()
{
return _propagateFullContext;
}
/**
* Default constructor required for serialization
*/
public PropagationContextWrapper()
{
}
/**
* Create a wrapper around a propagation context class
* @param tpc
*/
public PropagationContextWrapper(PropagationContext tpc)
{
this();
_isNull = (tpc == null);
if (tpc != null)
{
_current = new TransIdentityWrapper();
_current._coordinator = ORBManager.getORB().orb().object_to_string(tpc.current.coord);
_current.setOtid(tpc.current.otid);
_timeout = tpc.timeout;
if (_propagateFullContext)
{
_current._terminator = ORBManager.getORB().orb().object_to_string(tpc.current.term);
_parents = new TransIdentityWrapper[tpc.parents.length];
for (int count = 0; count < tpc.parents.length; count++)
{
_parents[count] = new TransIdentityWrapper();
_parents[count]._coordinator = ORBManager.getORB().orb().object_to_string(tpc.parents[count].coord);
_parents[count]._terminator = ORBManager.getORB().orb().object_to_string(tpc.parents[count].term);
_parents[count].setOtid(tpc.parents[count].otid);
}
}
}
}
public int hashCode()
{
return _isNull ? 0 : _current.hashCode();
}
public boolean equals(Object o)
{
if (o instanceof PropagationContextWrapper)
{
PropagationContextWrapper comp = (PropagationContextWrapper) o;
if (!_isNull && !comp._isNull)
{
return (_current.equals(comp._current));
}
}
return false;
}
// this is called on the remote side
public PropagationContext getPropagationContext()
{
if (_isNull)
{
return null;
}
if (_tpc == null)
{
if (_propagateFullContext)
{
TransIdentity[] parents = new TransIdentity[_parents != null ? _parents.length : 0];
for (int count = 0; count < parents.length; count++)
{
parents[count] = _parents[count].getTransIdentity();
}
_tpc = new PropagationContext(_timeout,
_current.getTransIdentity(),
parents,
null);
}
else
{
_tpc = new PropagationContext(_timeout,
_current.getTransIdentity(),
new TransIdentity[0], // no parents, but not null
null);
}
}
return _tpc;
}
public void writeExternal(ObjectOutput out) throws IOException
{
try
{
out.writeBoolean(_propagateFullContext);
out.writeBoolean(_isNull);
if (!_isNull)
{
out.writeInt(_timeout);
_current.writeExternal(out, _propagateFullContext);
if (_propagateFullContext)
{
out.writeInt(_parents.length);
for (int count = 0; count < _parents.length; count++)
{
_parents[count].writeExternal(out, _propagateFullContext);
}
}
}
}
catch (Exception e)
{
IOException ioException = new IOException(e.toString());
ioException.initCause(e);
throw ioException;
}
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
{
try
{
boolean fullContext = in.readBoolean();
_isNull = in.readBoolean();
if (!_isNull)
{
_timeout = in.readInt();
_current = new TransIdentityWrapper();
_current.readExternal(in, fullContext);
if (fullContext)
{
_parents = new TransIdentityWrapper[in.readInt()];
for (int count = 0; count < _parents.length; count++)
{
_parents[count] = new TransIdentityWrapper();
_parents[count].readExternal(in, fullContext);
}
}
}
_tpc = null;
}
catch (Exception e)
{
IOException ioException = new IOException(e.toString());
ioException.initCause(e);
throw ioException;
}
}
/**
* A wrapper around a transidentity object so that it can be serialized.
*/
private class TransIdentityWrapper implements Serializable
{
public String _coordinator = null;
private otid_t _otid = null;
public String _terminator = null;
private int _hashCode = 0;
public TransIdentity getTransIdentity()
{
return new TransIdentity(CoordinatorHelper.narrow(ORBManager.getORB().orb().string_to_object(_coordinator)),
_terminator == null ? null : TerminatorHelper.narrow(ORBManager.getORB().orb().string_to_object(_terminator)),
_otid);
}
public otid_t getOtid()
{
return _otid;
}
public void setOtid(otid_t o)
{
_otid = o;
_hashCode = Utility.otidToUid(_otid).hashCode();
}
private boolean same(otid_t otid1, otid_t otid2)
{
if ((otid1.formatID == otid2.formatID) &&
(otid1.bqual_length == otid2.bqual_length))
{
for (int i = 0; i < otid1.bqual_length; i++)
{
if (otid1.tid[i] != otid2.tid[i])
return false;
}
/*
* Got here, so must be equal!
*/
return true;
}
else
return false;
}
public int hashCode()
{
return _hashCode;
}
public boolean equals(Object o)
{
if (o instanceof TransIdentityWrapper)
{
TransIdentityWrapper t = (TransIdentityWrapper) o;
return _otid != null && t._otid != null && same(_otid, t._otid);
}
return false;
}
/**
* The object implements the writeExternal method to save its contents
* by calling the methods of DataOutput for its primitive values or
* calling the writeObject method of ObjectOutput for objects, strings,
* and arrays.
*
* @serialData Overriding methods should use this tag to describe
* the data layout of this Externalizable object.
* List the sequence of element types and, if possible,
* relate the element to a public/protected field and/or
* method of this Externalizable class.
*
* @param out the stream to write the object to
* @exception IOException Includes any I/O exceptions that may occur
*/
public void writeExternal(ObjectOutput out, boolean fullContext) throws IOException
{
out.writeObject(_coordinator);
out.writeObject(getOtid());
if (fullContext)
{
out.writeObject(_terminator);
}
}
public void readExternal(ObjectInput in, boolean fullContext) throws IOException, ClassNotFoundException
{
_coordinator = (String) in.readObject();
setOtid((otid_t) in.readObject());
if (fullContext)
{
_terminator = (String) in.readObject();
}
else
{
_terminator = null;
}
}
}
}