Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
   /*
    * 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,
   *
   * Arjuna Solutions Limited,
   * Newcastle upon Tyne,
   * Tyne and Wear,
   * UK.
   *
   * $Id: XAResourceRecord.java 2342 2006-03-30 13:06:17Z  $
   */
  
  package com.arjuna.ats.internal.jta.resources.arjunacore;
  
  import java.util.List;
  import java.util.Vector;
  
  

Author(s):
Mark Little (mark_little@hp.com)
Version:
$Id: XAResourceRecord.java 2342 2006-03-30 13:06:17Z $
Since:
JTS 1.2.4.
  
  
  public class XAResourceRecord extends AbstractRecord
  {
  
  	public static final int XACONNECTION = 0;
  
  	private static final Uid START_XARESOURCE = Uid.minUid();
  
  	private static final Uid END_XARESOURCE = Uid.maxUid();

The params represent specific parameters we need to recreate the connection to the database in the event of a failure. If they're not set then recovery is out of our control. Could also use it to pass other information, such as the readonly flag.
  
  
  	public XAResourceRecord(TransactionImple txXAResource resXid xid,
  			Object[] params)
 	{
 		super(new Uid(), null.);
 
 		if (..isTraceEnabled()) {
             ..trace("XAResourceRecord.XAResourceRecord ( " + xid + ", " + res + " ), record id=" + order());
         }
 
 		 = res;
         if( != null) {
         }
 
 		 = null;
 		 = xid;
 
 		 = true;
 
 		if (params != null)
 		{
 			if (params.length >= )
 			{
 				if (params[instanceof RecoverableXAConnection)
 			}
 		}
 
 		 = false;
 
 	}
 
 	public final Xid getXid()
 	{
 		return ;
 	}
 
 	public Uid order()
 	{
 		if ( instanceof StartXAResource)
 		else
 		{
 			if ( instanceof EndXAResource)
 				return ;
 			else
 				return super.order();
 		}
 	}
 
 	public boolean propagateOnCommit()
 	{
 		return false// cannot ever be nested!
 	}
 
 	public int typeIs()
 	{
 	}
 
 	public Object value()
 	{
 		return ;
 	}
 
 	public void setValue(Object o)
 	{
         ..warn_resources_arjunacore_setvalue("XAResourceRecord::set_value()");
 	}
 
 	public int nestedAbort()
 	{
 	}
 
 	public int nestedCommit()
 	{
 	}
 
 	/*
 	 * XA is not subtransaction aware.
 	 */
 
 	public int nestedPrepare()
 	{
 		return .// do nothing
 	}
 
 	public int topLevelPrepare()
 	{
 		if (..isTraceEnabled()) {
             ..trace("XAResourceRecord.topLevelPrepare for " + this + ", record id=" + order());
         }
 
 		if (! || ( == null) || ( == null))
 		{
             ..warn_resources_arjunacore_preparenulltx("XAResourceRecord.prepare");
 
                     removeConnection();
 
 		}
 
 		try
 		{
 			{
 			}
 
 			 = true;
 
 			{
 			    if (TxControl.isReadonlyOptimisation())
 			    {
 			        // we won't be called again, so we need to tidy up now
 			        removeConnection();
 			    }
 
 			}
 			else
 		}
 		catch (XAException e1)
 		{
                     .toString(), XAHelper.printXAErrorCode(e1), e1);
 
 			/*
 			 * XA_RB*, XAER_RMERR, XAER_RMFAIL, XAER_NOTA, XAER_INVAL, or
 			 * XAER_PROTO.
 			 */
 
 			if (// won't have rollback called on it
 
 			switch (e1.errorCode)
 			{
 			case .// resource may have arbitrarily rolled back (shouldn't, but ...)
 				return .;  // will not call rollback
 			default:
 				return .// we're not really sure (shouldn't get here though).
 			}
 		}
 		catch (Exception e2)
 		{
                     .toString(), "-"e2);
 
 			if (// won't have rollback called on it
 
 		}
 	}
 
 	public int topLevelAbort()
 	{
 		if (..isTraceEnabled()) {
             ..trace("XAResourceRecord.topLevelAbort for " + this + ", record id=" + order());
         }
 
 		if (!)
 
 		if ( != null
 		{
 			/*
 			 * Already rolledback during delist.
 			 */
 
 		}
 
 		if ( == null)
 		{
             ..warn_resources_arjunacore_rollbacknulltx("XAResourceRecord.rollback");
 
 		}
 		else
 		{
 			if ( == null)
 
 			if ( != null)
 			{
 					return ;
 
 				try
 				{
 					if (!)
 					{
 						{
 						}
 					}
 				}
 				catch (XAException e1)
 				{
 				    if ((e1.errorCode >= .)
 						&& (e1.errorCode < .))
 				    {
 					/*
 					 * Has been marked as rollback-only. We still
 					 * need to call rollback.
 					 */
 					 
 				    } else if ((e1.errorCode == .) || (e1.errorCode == .)){
 				    	    try {
 				    	    	    .rollback();
 				    	    } catch (XAException e2)
 				    	    {
                                 .toString(), XAHelper.printXAErrorCode(e2), e2);
 
                                 		    removeConnection();
 
                                 		    return .;
 				    	    }
 				    }
 				    else
 				    {
                         ..warn_resources_arjunacore_rollbackerror(XAHelper.xidToString(),
                                 .toString(), XAHelper.printXAErrorCode(e1), e1);
 
     					removeConnection();
 
 	    				return .;
 				    }
 				}
                 catch(RuntimeException e)
                 {
                     ..warn_resources_arjunacore_rollbackerror(XAHelper.xidToString(), .toString(), "-"e);
 
                     throw e;
                 }
 
 				try
 				{
 				}
 				catch (XAException e1)
 				{
 					if (notAProblem(e1false))
 					{
 						// some other thread got there first (probably)
 					}
 					else
 					{
                         ..warn_resources_arjunacore_rollbackerror(XAHelper.xidToString(),
                                 .toString(), XAHelper.printXAErrorCode(e1), e1);
 
 						switch (e1.errorCode)
 						{
 							if (!)
 								break// just do the finally block
 						    if ()
 							break// rolled back previously and recovery completed
 						case .// forget?
 							break;
 						default:
 						}
 					}
 				}
 				catch (Exception e2)
 				{
                     ..warn_resources_arjunacore_rollbackerror(XAHelper.xidToString(),
                             .toString(), "-"e2);
 
 				}
 				finally
 				{
 					if (!)
 				}
 			}
 			else
 			{
 
 			    {
                 
 
 			    }
 			    else
 			}
 		}
 
 	}
 
 	public int topLevelCommit()
 	{
 		if (..isTraceEnabled()) {
             ..trace("XAResourceRecord.topLevelCommit for " + this + ", record id=" + order());
         }
 
 		if (!)
 
 		if ( == null)
 		{
             ..warn_resources_arjunacore_commitnulltx("XAResourceRecord.commit");
 
 		}
 		else
 		{
 			if ( == null)
 
 			if ( != null)
 			{
 					return ;
 
 				/*
 				 * No need for end call here since we can only get to this
 				 * point by going through prepare.
 				 */
 
 				try
 				{
 				}
 				catch (XAException e1)
 				{
 					if (notAProblem(e1true))
 					{
 						// some other thread got there first (probably)
 					}
 					else
 					{
                         ..warn_resources_arjunacore_commitxaerror(XAHelper.xidToString(),
                                 .toString(), XAHelper.printXAErrorCode(e1), e1);
 
 						/*
 						 * XA_HEURHAZ, XA_HEURCOM, XA_HEURRB, XA_HEURMIX,
 						 * XAER_RMERR, XAER_RMFAIL, XAER_NOTA, XAER_INVAL, or
 						 * XAER_PROTO.
 						 */
 
 						switch (e1.errorCode)
 						{
 						case .// what about forget?
 														// OTS doesn't support
 														// this code here.
 							break;
 						case .:  // could really do with an ABORTED status in TwoPhaseOutcome to differentiate
 	                                        case .:  // XA spec implies rollback
 						    if ()
 							break// committed previously and recovery completed
 						    else
 						        return .;  // something terminated the transaction!
 						     = true;  // will cause log to be rewritten
 						    
 	                                            /*
                                                      * Could do timeout retry here, but that could cause other resources in the list to go down the
                                                      * heuristic path (some are far too keen to do this). Fail and let recovery retry. Meanwhile
                                                      * the coordinator will continue to commit the other resources immediately.
                                                      */
 						case .// resource manager failed, did it rollback?
 						default:
 						}
 					}
 				}
 				catch (Exception e2)
 				{
                     ..warn_resources_arjunacore_commitxaerror(XAHelper.xidToString(),
                                 .toString(), "-"e2);
 
 				    return .;
 				}
 				finally
 				{
 				}
 			}
 			else
 			{
 
 			    {
                     ..info_resources_arjunacore_assumecomplete(XAHelper.xidToString());
 
 			    }
 			    else
 			}
 		}
 
 	}

Is the XAException a non-error when received in reply to commit or rollback ? It normally is, but may be overridden in recovery.
 
 
 	protected boolean notAProblem(XAException exboolean commit)
 	{
 		return XAResourceErrorHandler.notAProblem(excommit);
 	}
 
 	public int nestedOnePhaseCommit()
 	{
 	}

For commit_one_phase we can do whatever we want since the transaction outcome is whatever we want. Therefore, we do not need to save any additional recoverable state, such as a reference to the transaction coordinator, since it will not have an intentions list anyway.
 
 
 	public int topLevelOnePhaseCommit()
 	{
 	    if (..isTraceEnabled()) {
             ..trace("XAResourceRecord.topLevelOnePhaseCommit for " + this + ", record id=" + order());
         }
 
 	    boolean commit = true;
 	    
 	    if ( == null)
 	    {
             ..warn_resources_arjunacore_opcnulltx("XAResourceRecord.1pc");
 
 	        return .;  // rolled back!!
 	    }
 	    else
 	    {
 	        if ( != null)
 	        {
 	            if ( != .)
 	                return ;
 
 	            XAException endHeuristic = null;
 	            XAException endRBOnly = null;
 
 	            try
 	            {
 	                /*
 	                 * TODO in Oracle the end is not needed. Is this common
 	                 * across other RMs?
 	                 */
 
 	                if (endAssociation())
 	                {
 	                    .end(.);
 	                }
 	            }
 	            catch (XAException e1)
 	            {
 	                /*
 	                 * Now it's not legal to return a heuristic from end, but
 	                 * apparently Oracle does (http://jira.jboss.com/jira/browse/JBTM-343)
 	                 * Since this is 1PC we can call forget: the outcome of the
 	                 * transaction is the outcome of the participant.
 	                 */
 
 	                switch (e1.errorCode)
 	                {
 	                case .:
 	                case .:
 	                case .:
 	                case .:
 	                    endHeuristic = e1;
 	                    break;
 	                case .:
 	                case .:
 	                case .:
 	                case .:
 	                case .:
 	                case .:
 	                case .:
 	                case .:
 	                    /*
 	                     * Has been marked as rollback-only. We still
 	                     * need to call rollback.
 	                     */
 
 	                	endRBOnly = e1;
 	                    commit = false;
 	                    break;
 	                case .:
                         case .:
                         case .:
                         case .:
                         case .:
                         default:
 	                {
                         ..warn_resources_arjunacore_opcerror(XAHelper.xidToString(),
                                 .toString(), XAHelper.printXAErrorCode(e1), e1);
 	                    
 	                    removeConnection();
 	                    
                             return .;
 	                }
 	                }
 	            }
 	            catch(RuntimeException e)
 	            {
                     ..warn_resources_arjunacore_opcerror(XAHelper.xidToString(),
                                 .toString(), "-"e);
 
 	                throw e;
 	            }
 
 	            try
 	            {
 	                /*
 	                 * Not strictly necessary since calling commit will
 	                 * do the rollback if end failed as above.
 	                 */
 
 	                if (endHeuristic != null// catch those RMs that terminate in end rather than follow the spec
 	                    throw endHeuristic;
 
 	                if (commit)
 	                    .commit(true);
 	                else {
 	                    .rollback();
 	                    throw endRBOnly;
 	                }
 	            }
 	            catch (XAException e1)
 	            {
                     ..warn_resources_arjunacore_opcerror(XAHelper.xidToString(),
                                 .toString(), XAHelper.printXAErrorCode(e1), e1);
 
 	                /*
 	                 * XA_HEURHAZ, XA_HEURCOM, XA_HEURRB, XA_HEURMIX,
 	                 * XAER_RMERR, XAER_RMFAIL, XAER_NOTA, XAER_INVAL, or
 	                 * XAER_PROTO. XA_RB*
 	                 */
 
 	                switch (e1.errorCode)
 	                {
 	                case .:
 	                case .:
 	                    return .;
 	                case .:
 	                    forget();
 	                    break;
 	                case .:
 	                       forget();
 	                       return .;
 	                case .:
 	                case .:
 	                case .:
 	                case .:
 	                case .:
 	                case .:
 	                case .:
 	                case .:
 	                case .:
 	                    return .;
 	                case .:
 	                    return .// something committed or rolled back without asking us!
 	                case .// resource manager failed, did it rollback?
 	                    return .;
 	                case .:  // XA does not allow this to be thrown for 1PC!
 	                case .:
 	                    return .// assume rollback
 	                case .:
 	                default:
 	                     = true;  // will cause log to be rewritten
 	                    return .;  // recovery should retry
 	                }
 	            }
 	            catch (Exception e2)
 	            {
                     ..warn_resources_arjunacore_opcerror(XAHelper.xidToString(),
                                 .toString(), "-"e2);
 
 	                return .;
 	            }
 	            finally
 	            {
 	                removeConnection();
 	            }
 	        }
 	        else
 	            return .;
 	    }
 
 	    if (commit)
 	        return .;
 	    else
 	        return .;
 	}
 
 	public boolean forgetHeuristic()
 	{
 		if (..isTraceEnabled()) {
             ..trace("XAResourceRecord.forget for " + this);
         }
 
 		forget();
 
 
 		return true;
 	}
 
 	private void forget()
 	{
 		if (( != null) && ( != null))
 		{
 		    
 			try
 			{
 			}
 			catch (Exception e)
 			{
 			}
 		}
 	}
 
 	/*
 	 * Independant recovery cannot occur. Must be driven by the recovery of the
 	 * local transaction, i.e., top-down recovery.
 	 */
 
 	protected int recover()
 	{
 		if (..isTraceEnabled()) {
             ..trace("XAResourceRecord.recover");
         }
 
 		if ()
 		{
 		    /*
 		     * A previous commit attempt failed, but we know the intention
 		     * was to commit. So let's try again.
 		     */
 		    
 		        return .;
 		    else
 		        return .;
 		}
 		else
 	}
 
 	public boolean save_state(OutputObjectState osint t)
 	{
 		boolean res = false;
 
 		try
 		{
 			
 			/*
 			 * Since we don't know what type of Xid we are using, leave it up to
 			 * XID to pack.
 			 */
 
 			XidImple.pack(os);
 
 			/*
 			 * If no recovery object set then rely upon object serialisation!
 			 */
 
 			if ( == null)
 			{
 
                 os.packString();
                 os.packString();
                 os.packString();
 
                 if ( instanceof Serializable)
                 {
                     try
                     {
                         ByteArrayOutputStream s = new ByteArrayOutputStream();
                         ObjectOutputStream o = new ObjectOutputStream(s);
 
                         o.writeObject();
                         o.close();
 
                         os.packBoolean(true);
                         String name = .getClass().getName();
                         os.packString(name);
 
                         os.packBytes(s.toByteArray());
                     }
                     catch (NotSerializableException ex)
                     {
                         ..warn_resources_arjunacore_savestate();
 
                         return false;
                     }
                 }
                 else
                 {
                     // have to rely upon XAResource.recover!
 
                     os.packBoolean(false);
                 }
 			}
 			else
 			{
 
 			}
 
 			res = true;
 		}
 		catch (Exception e)
 		{
 		    
 			res = false;
 		}
 
 		if (res)
 			res = super.save_state(ost);
 
 		return res;
 	}
 
 	public boolean restore_state(InputObjectState osint t)
 	{
 		boolean res = false;
 
 		try
 		{
 			
 			 = XidImple.unpack(os);
 
 			 = null;
 			 = null;
 
 			{
                  = os.unpackString();
                  = os.unpackString();
                  = os.unpackString();
 
 				boolean haveXAResource = os.unpackBoolean();
 
 				if (haveXAResource)
 				{
 					try
 					{
 						// Read the classname of the serialized XAResource
 						String className = os.unpackString();
 						
 						byte[] b = os.unpackBytes();
 
 						
 						// Give the list of deserializers a chance to deserialize the record
 						boolean deserialized = false;
 						while (iterator.hasNext()) {
 							SerializableXAResourceDeserializer proxyXAResourceDeserializer = iterator.next();
 							if (proxyXAResourceDeserializer.canDeserialze(className)) {
 								 = proxyXAResourceDeserializer.deserialze(o);
 								deserialized = true;
                                 break;
 							}
 						}
 
 						// Give it a go ourselves
 						if (!deserialized) {
 						}
 						o.close();
 
 						if (..isTraceEnabled()) {
                             ..trace("XAResourceRecord.restore_state - XAResource de-serialized");
                         }
 					}
 					catch (Exception ex)
 					{
 						// not serializable in the first place!
 
                         ..warn_resources_arjunacore_restorestate(ex);
 
 						return false;
 					}
 				}
 				else
 				{
 					/*
 					 * Lookup new XAResource via XARecoveryModule if possible.
 					 */
 
 
 					if ( == null)
 					{
                         ..warn_resources_arjunacore_norecoveryxatoString() );
 
 						/*
 						 * Don't prevent tx from activating because there may be
 						 * other participants that can still recover. Plus, we will
 						 * try to get a new XAResource later for this instance.
 						 */
 
 						res = true;
 					}
 				}
 			}
 			else
 			{
 				String creatorName = os.unpackString();
 
                  = ClassloadingUtility.loadAndInstantiateClass(RecoverableXAConnection.classcreatorNamenull);
                 if( == null) {
                     throw new ClassNotFoundException();
                 }
 
 
 				if (..isTraceEnabled()) {
                     ..trace("XAResourceRecord.restore_state - XAResource got from "
                             + creatorName);
                 }
 			}
 
 			res = true;
 		}
 		catch (Exception e)
		    res = false;
		if (res)
			res = super.restore_state(ost);
		return res;
	public String type()
		return XAResourceRecord.typeName();
	public static String typeName()
		return "/StateManager/AbstractRecord/XAResourceRecord";
	public boolean doSave()
		return true;
	public void merge(AbstractRecord a)
	public void alter(AbstractRecord a)
	public boolean shouldAdd(AbstractRecord a)
		return false;
	public boolean shouldAlter(AbstractRecord a)
		return false;
	public boolean shouldMerge(AbstractRecord a)
		return false;
	public boolean shouldReplace(AbstractRecord a)
		return false;
	}

    
Returns the resource manager product name.

Returns:
the product name
    public String getProductName()
    {
        return ;
    }

    
Sets the resource manager product name.

Parameters:
productName the product name
    public void setProductName(String productName)
    {
        this. = productName;
    }

    
Returns the resource manager product version.

Returns:
the product version
    public String getProductVersion()
    {
        return ;
    }

    
Sets the resource manager product version.

Parameters:
productVersion the product version
    public void setProductVersion(String productVersion)
    {
        this. = productVersion;
    }

    
Returns the resource manager JNDI name for e.g. xa datasource. Note this is not used for lookup, only for information.

Returns:
the JNDI name.
    public String getJndiName()
    {
        return ;
    }

    
Sets the resource manager JNDI name. Note this is not used for lookup, only for information.

Parameters:
jndiName the JNDI name.
    public void setJndiName(String jndiName)
    {
        this. = jndiName;
    }
    public XAResourceRecord()
		super();
		 = null;
		 = true;
		 = true;
		 = true;
		super(unull.);
		 = null;
		 = true;
		 = true;
		 = true;
    public String