Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2013, 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) 2013
  * @author JBoss Inc.
  */
 
 package com.arjuna.ats.internal.jta.resources.arjunacore;
 
 import java.util.Map;
 
 import  javax.transaction.RollbackException;
 import  javax.transaction.Status;
 import  javax.transaction.Synchronization;
 import  javax.transaction.SystemException;
 
 import  org.jboss.tm.ConnectableResource;
 import  org.jboss.tm.XAResourceWrapper;
 
The CommitMarkableResourceRecord does not support nested transactions If the database is down forever that a CommitMarkableResourceRecord is linked to, it will have the side effect of never expiring a RecoverAtomicAction. The CommitMarkableResourceRecord assumes the following table has been created: syb: create table xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28)) ora: create table xids (xid RAW(144), transactionManagerID varchar(64), actionuid RAW(28)) psql: create table xids (xid bytea, transactionManagerID varchar(64), actionuid bytea) h2: create table xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28)) sybase notes: sp_configure "lock scheme",0,datarows
 
 public class CommitMarkableResourceRecord extends AbstractRecord {
	private final String tableName;
	private Xid xid;
	private ConnectableResource connectableResource;
	private boolean onePhase = false;
	private boolean committed;
	private boolean hasCompleted;
	private static final JTAEnvironmentBean jtaEnvironmentBean = BeanPopulator
	private static final String defaultTableName = 
	static {
		RecoveryManager recMan = RecoveryManager.manager();
		Vector recoveryModules = recMan.getModules();
		if (recoveryModules != null) {
			Enumeration modules = recoveryModules.elements();
			while (modules.hasMoreElements()) {
					break;
				}
			}
		}
	}

For recovery
		if (..isTraceEnabled()) {
			..trace("CommitMarkableResourceRecord.CommitMarkableResourceRecord (), record id=" + order());
		}
		 = null;
	}
			ConnectableResource xaResourcefinal Xid xid,
			BasicAction basicActionthrows IllegalStateException,
			RollbackException, SystemException {
		super(new Uid(), null.);
		if (..isTraceEnabled()) {
			..trace("CommitMarkableResourceRecord.CommitMarkableResourceRecord ( " + tx + ", " + xaResource + ", " 
xid + ", " + basicAction + " ), record id=" + order());
		}
		this. = xaResource;
		XAResourceWrapper xaResourceWrapper = ((XAResourceWrapper) xaResource);
		this. = xaResourceWrapper.getJndiName();
		this. = xaResourceWrapper.getProductName();
		this. = xaResourceWrapper.getProductVersion();
		this. = xid;
		this. = basicAction;
		if (tableName != null) {
			this. = tableName;
else {
		}
		if (boolean1 != null) {
		}
				public void beforeCompletion() {
				}
				public void afterCompletion(int status) {
					if (! && status == Status.STATUS_COMMITTED) {
						Connection connection = null;
						try {
									.getConnection());
							connection.setAutoCommit(false);
							String sql = "DELETE from "
" where xid in (?)";
							PreparedStatement prepareStatement = connection
							try {
								XID toSave = ((XidImplexid).getXID();
										baos);
								dos.writeInt(toSave.formatID);
								dos.writeInt(toSave.gtrid_length);
								dos.writeInt(toSave.bqual_length);
								dos.writeInt(toSave.data.length);
								dos.write(toSave.data);
								dos.flush();
								prepareStatement.setBytes(1, baos.toByteArray());
								if (prepareStatement.executeUpdate() != 1) {
											.error("Update was not successfull");
									connection.rollback();
else {
									connection.commit();
								}
catch (IOException e) {
										.warn("Could not generate prepareStatement paramaters",
												e);
finally {
								try {
									prepareStatement.close();
catch (SQLException e) {
											.warn("Could not close the prepared statement",
													e);
								}
							}
catch (Throwable e1) {
									.warn("Could not delete CommitMarkableResourceRecord entry, will rely on RecoveryModule",
											e1);
finally {
							if (connection != null) {
								try {
									connection.close();
catch (SQLException e) {
											.warn("Could not close the preparedConnection",
													e);
								}
							}
						}
					}
				}
			});
				public void beforeCompletion() {
				}
				public void afterCompletion(int status) {
					if (! && status == Status.STATUS_COMMITTED) {
					}
				}
			});
		}
	}
	public String getProductName() {
		return ;
	}
	}
	public String getJndiName() {
	}
	public void updateOutcome(boolean committed) {
		this. = true;
		this. = committed;
	}

We need to save this so we know there was a ConnectableResource in the intentions list.
	public boolean doSave() {
		return true;
	}
	public boolean save_state(OutputObjectState osint t) {
		boolean res = false;
		try {
			// We store these information so that during recovery we can query
			// the resource
			// manager to see if it had committed prior to any potential crash
			if (..isTraceEnabled()) {
			}
			if (..isTraceEnabled()) {
				..trace("pack: " + );
			}
			XidImple.pack(os);
			if () {
			}
			res = super.save_state(ost);
catch (Exception e) {
					"Could not save_state: " + XAHelper.xidToString(), e);
		}
		return res;
	}
	public boolean restore_state(InputObjectState osint t) {
		boolean res = false;
		try {
			if (..isTraceEnabled()) {
				..trace("unpack: " + );
			}
			 = XidImple.unpack(os);
			if (..isTraceEnabled()) {
				..trace("unpack: " + );
			}
			if (os.unpackBoolean()) {
else {
				// This will return true if the
				// CommitMarkableRecoveryModule is
				// between phases and the XID
				// has not been GC'd
                try {
                     = .wasCommitted(
                            );
                } catch (ObjectStoreException e) {
                    String resInfo =  == null ? "" : .toString();
                        resInfo, XAHelper.xidToString(), e);
                }
            }
			res = super.restore_state(ost);
catch (Exception e) {
			String resInfo =  == null ? "" : .toString();
				resInfo, XAHelper.xidToString(), e);
		}
		return res;
	}

This will add the required recovery data about this resource into the resources preparedConnection. If the preparedConnection is in read only mode, we do not need to persist this information.
	public int topLevelPrepare() {
		if (..isTraceEnabled()) {
			..trace("CommitMarkableResourceRecord.topLevelPrepare for " + this + ", record id=" + order());
		}
        try {
            PreparedStatement prepareStatement = null;
					.getConnection();
            try {
			    prepareStatement = 
					.prepareStatement("insert into "
" (xid, transactionManagerID, actionuid) values (?,?,?)");
				XID toSave = ((XidImple).getXID();
				dos.writeInt(toSave.formatID);
				dos.writeInt(toSave.gtrid_length);
				dos.writeInt(toSave.bqual_length);
				dos.writeInt(toSave.data.length);
				dos.write(toSave.data);
				dos.flush();
				prepareStatement.setBytes(1, baos.toByteArray());
				prepareStatement.setString(2, TxControl.getXANodeName());
				prepareStatement.setBytes(3, .get_uid().getBytes());
				if (prepareStatement.executeUpdate() != 1) {
					..warn("Update was not successful");
                    removeConnection();
				}
finally {
                if (prepareStatement != null)
				    prepareStatement.close();
			}
catch (Throwable t) {
					"Could not add recovery data to the 1PC resource"t);
		}
	}
	public int topLevelAbort() {
		if (..isTraceEnabled()) {
			..trace("CommitMarkableResourceRecord.topLevelAbort for " + this + ", record id=" + order());
		}
		try {
			try {
				// This can never be null as it can only ever be called before
				// crash
				// when we have a reference
				// on a connectableResource still. Although topLevelAbort can be
				// called for RecoverAtomicAction, it
				// can only do that for resources after the head position in the
				// preparedList, we know this resource
				// must be first
				 = true;
				 = false;
catch (XAException e) {
				return handler.handleCMRRollbackError();
catch (Throwable e) {
						.toString(), "-"e);
			}
finally {
		}
	}
	public int topLevelCommit() {
		if (..isTraceEnabled()) {
			..trace("CommitMarkableResourceRecord.topLevelCommit for " + this + ", record id=" + order());
		}
		return commit(false);
	}
	public int topLevelOnePhaseCommit() {
		if (..isTraceEnabled()) {
			..trace("CommitMarkableResourceRecord.topLevelOnePhaseCommit for " + this + ", record id=" + order());
		}
		return commit(true);
	}
	private int commit(boolean onePhase) {
		// As this can be called during recovery we check to see if we have the
		// pre-crash reference
		this. = onePhase;
		if ( != null) {
			try {
				 = true;
				 = true;
catch (XAException e) {
				int res = handler.handleCMRCommitError(onePhase);
				 = handler.isCommitted();
				return res;
catch (Throwable e) {
					.toString(), "-"e);
finally {
				}
			}
else {
			// This is a recovery scenario
			if () {
else {
			}
		}
	}
	private final void removeConnection() {
		if ( != null) {
			try {
catch (SQLException e) {
				..warn("Could not close the preparedConnection"e);
			}
		}
	}
	public Uid order() {
		return Uid.minUid();
	}
	public boolean propagateOnCommit() {
		return false;
	}
	public int typeIs() {
	}
	public String type() {
		return "/StateManager/AbstractRecord/CommitMarkableResourceRecord";
	}
	public Object value() {
	}
	public void setValue(Object o) {
	}
	public int nestedAbort() {
	}
	public int nestedCommit() {
	}
	public int nestedPrepare() {
	}
	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;
	}
New to GrepCode? Check out our FAQ X