/* * 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) 2005 * * Arjuna Solutions Limited, * Newcastle upon Tyne, * Tyne and Wear, * UK. * * $Id$ */ package com.arjuna.ats.internal.jta.resources.jts.orbspecific; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid; import org.omg.CORBA.SystemException; import org.omg.CORBA.TRANSACTION_ROLLEDBACK; import org.omg.CosTransactions.HeuristicHazard; import org.omg.CosTransactions.HeuristicMixed; import org.omg.CosTransactions.HeuristicRollback; import org.omg.CosTransactions.NotPrepared; import org.omg.CosTransactions.Vote; import com.arjuna.ArjunaOTS.OTSAbstractRecord; import com.arjuna.ats.arjuna.common.Uid; import com.arjuna.ats.arjuna.common.arjPropertyManager; import com.arjuna.ats.arjuna.coordinator.RecordType; import com.arjuna.ats.internal.jta.transaction.jts.TransactionImple; import com.arjuna.ats.internal.jta.utils.jtaxLogger; /** * XAResourceRecord implementing the Last Resource Commit Optimisation. * * @author Kevin Conner (Kevin.Conner@arjuna.com) * @version $Id$ * @since ATS 4.1 */ public class LastResourceRecord extends XAResourceRecord { /** * The Uid for all last xa resource records. */ private static final String UID = Uid.lastResourceUid().stringForm() ; /** * Construct the record for last resource commit optimisation. * @param tx The current transaction. * @param xaResource The associated XA resource. * @param xid The X/Open transaction identifier. * @param params Additional parameters. */ public LastResourceRecord(final TransactionImple tx, final XAResource xaResource, final Xid xid, final Object[] params) { super(tx, xaResource, xid, params) ; } /** * The type id for this record. */ public int type_id() throws SystemException { return RecordType.LASTRESOURCE ; } /** * The UID for this resource. */ public String uid() throws SystemException { return UID ; } /** * Commit this resource. */ public void commit() throws SystemException, NotPrepared, HeuristicRollback, HeuristicMixed, HeuristicHazard { } /** * Prepare this resource. */ public Vote prepare() throws HeuristicMixed, HeuristicHazard, SystemException { try { commit_one_phase() ; return Vote.VoteCommit ; } catch (final TRANSACTION_ROLLEDBACK tr) { return Vote.VoteRollback ; } } /** * The type for saving state. */ public String type() { return "/CosTransactions/LastXAResourceRecord" ; } public boolean saveRecord() throws SystemException { return false; } public boolean shouldAdd(OTSAbstractRecord record) throws SystemException { if( record.type_id() == type_id() ) { if(ALLOW_MULTIPLE_LAST_RESOURCES) { if (!_disableMLRWarning || (_disableMLRWarning && !_issuedWarning)) { jtaxLogger.i18NLogger.warn_jtax_resources_jts_orbspecific_lastResource_multipleWarning(record.toString()); _issuedWarning = true; } return true; } else { jtaxLogger.i18NLogger.warn_jtax_resources_jts_orbspecific_lastResource_disallow(record.toString()); return false; } } else { return true; } } private static final boolean ALLOW_MULTIPLE_LAST_RESOURCES = arjPropertyManager.getCoreEnvironmentBean() .isAllowMultipleLastResources(); private static boolean _disableMLRWarning = false; private static boolean _issuedWarning = false; /** * Static block writes warning messages to the log if either multiple last resources are enabled * or multiple last resources warning is disabled. */ static { if (ALLOW_MULTIPLE_LAST_RESOURCES) { jtaxLogger.i18NLogger.warn_jtax_resources_jts_orbspecific_lastResource_startupWarning(); } if (arjPropertyManager.getCoreEnvironmentBean().isDisableMultipleLastResourcesWarning()) { jtaxLogger.i18NLogger.warn_jtax_resources_jts_orbspecific_lastResource_disableWarning(); _disableMLRWarning = true; } } }