/* * 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) 1999-2001 by HP Bluestone Software, Inc. All rights Reserved. * * HP Arjuna Labs, * Newcastle upon Tyne, * Tyne and Wear, * UK. * * $Id: RecoverAtomicAction.java 2342 2006-03-30 13:06:17Z $ */ package com.arjuna.ats.arjuna.recovery ; import com.arjuna.ats.arjuna.AtomicAction; import com.arjuna.ats.arjuna.common.Uid; import com.arjuna.ats.arjuna.coordinator.ActionStatus; import com.arjuna.ats.arjuna.logging.tsLogger; import com.arjuna.ats.internal.arjuna.recovery.AtomicActionExpiryScanner; public class RecoverAtomicAction extends AtomicAction { /** * Re-creates/activates an AtomicAction for the specified * transaction Uid. */ public RecoverAtomicAction ( Uid rcvUid, int theStatus ) { super( rcvUid ) ; _theStatus = theStatus ; _activated = activate() ; } /** * Replays phase 2 of the commit protocol. */ public void replayPhase2() { if (tsLogger.logger.isDebugEnabled()) { tsLogger.logger.debug("RecoverAtomicAction.replayPhase2 recovering "+get_uid()+" ActionStatus is "+ActionStatus.stringForm(_theStatus)); } if ( _activated ) { if ( (_theStatus == ActionStatus.PREPARED) || (_theStatus == ActionStatus.COMMITTING) || (_theStatus == ActionStatus.COMMITTED) || (_theStatus == ActionStatus.H_COMMIT) || (_theStatus == ActionStatus.H_MIXED) || (_theStatus == ActionStatus.H_HAZARD) ) { super.phase2Commit( _reportHeuristics ) ; } else if ( (_theStatus == ActionStatus.ABORTED) || (_theStatus == ActionStatus.H_ROLLBACK) || (_theStatus == ActionStatus.ABORTING) || (_theStatus == ActionStatus.ABORT_ONLY) ) { super.phase2Abort( _reportHeuristics ) ; } else { tsLogger.i18NLogger.warn_recovery_RecoverAtomicAction_2(ActionStatus.stringForm(_theStatus)); } if (tsLogger.logger.isDebugEnabled()) { tsLogger.logger.debug("RecoverAtomicAction.replayPhase2( "+get_uid()+" ) finished"); } } else { tsLogger.i18NLogger.warn_recovery_RecoverAtomicAction_4(get_uid()); /* * Failure to activate so move the log. Unlikely to get better automatically! */ AtomicActionExpiryScanner scanner = new AtomicActionExpiryScanner(); try { scanner.moveEntry(get_uid()); } catch (final Exception ex) { tsLogger.i18NLogger.warn_recovery_RecoverAtomicAction_5(get_uid()); } } } // Current transaction status // (retrieved from the TransactionStatusManager) private int _theStatus ; // Flag to indicate that this transaction has been re-activated // successfully. private boolean _activated = false ; // whether heuristic reporting on phase 2 commit is enabled. private boolean _reportHeuristics = true ; }