/*
* 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.
*/
package com.arjuna.ats.internal.arjuna.tools.log;
import com.arjuna.ats.arjuna.AtomicAction;
import com.arjuna.ats.arjuna.common.Uid;
import com.arjuna.ats.arjuna.coordinator.AbstractRecord;
import com.arjuna.ats.arjuna.coordinator.ActionStatus;
import com.arjuna.ats.arjuna.coordinator.RecordListIterator;
import com.arjuna.ats.arjuna.coordinator.TwoPhaseOutcome;
import com.arjuna.ats.arjuna.logging.tsLogger;
public class EditableAtomicAction extends AtomicAction implements EditableTransaction // going to have to be one per action type because of state differences
{
public EditableAtomicAction (final Uid u)
{
super(u);
_activated = activate();
if (!_activated) {
tsLogger.i18NLogger.warn_tools_log_eaa1(u, type());
}
}
/**
* Move a previous heuristic participant back to the prepared list so that recovery
* can try again. If it fails again then it may end up back on the heuristic list.
*/
public void moveHeuristicToPrepared (int index) throws IndexOutOfBoundsException
{
if ((index < 0) || (index >= super.heuristicList.size()))
throw new IndexOutOfBoundsException();
else
{
if (super.heuristicList.size() == 0)
throw new IndexOutOfBoundsException();
RecordListIterator iter = new RecordListIterator(super.heuristicList);
AbstractRecord rec = iter.iterate();
for (int i = 0; i < index; i++)
rec = iter.iterate();
/*
* Before we move we need to tell the resource that is can forget about the heuristic.
* This assumes that a) the user knows what they are doing, and b) the resource can then
* be driven through commit once more. If either of those assumptions is incorrect then
* we could be in a world of pain!
*/
if (rec.forgetHeuristic())
{
/*
* Move from heuristic list to prepared list.
*/
super.heuristicList.remove(rec);
super.preparedList.insert(rec);
/*
* If the list is zero then the heuristic has gone away!
*
* We don't maintain a per-resource heuristic so we cannot change
* the heuristic each time we remove a resource, i.e., we have to
* assume that the original heuristic applies to all of the remaining
* participants.
*/
if (super.heuristicList.size() == 0)
super.setHeuristicDecision(TwoPhaseOutcome.FINISH_OK);
super.updateState();
}
else {
tsLogger.i18NLogger.warn_tools_log_eaa2();
}
}
}
/**
* Delete a heuristic participant from the list.
*/
public void deleteHeuristicParticipant (int index) throws IndexOutOfBoundsException
{
if ((index < 0) || (index >= super.heuristicList.size()))
throw new IndexOutOfBoundsException();
else
{
if (super.heuristicList.size() == 0)
throw new IndexOutOfBoundsException();
RecordListIterator iter = new RecordListIterator(super.heuristicList);
AbstractRecord rec = iter.iterate();
for (int i = 0; i < index; i++)
rec = iter.iterate();
super.heuristicList.remove(rec);
/*
* If the list is zero then the heuristic has gone away!
*/
if (super.heuristicList.size() == 0)
super.setHeuristicDecision(TwoPhaseOutcome.FINISH_OK);
// if the log is not entry this call will delete the log automatically.
super.updateState();
}
}
public String toString ()
{
if (!_activated)
return "RecoveryAction not activated.";
else
{
String printableForm = "ActionStatus: "+ActionStatus.stringForm(super.status());
printableForm += "\nHeuristic Decision: "+TwoPhaseOutcome.stringForm(super.getHeuristicDecision());
if (super.preparedList.size() == 0)
printableForm += "\nNo prepared entries.";
else
{
printableForm += "\nPrepared entries:";
RecordListIterator iter = new RecordListIterator(super.preparedList);
AbstractRecord rec = iter.iterate();
int i = 0;
while (rec != null)
{
printableForm += "\n["+i+"] "+rec;
rec = iter.iterate();
i++;
}
}
if (super.heuristicList.size() == 0)
printableForm += "\nNo heuristic entries.";
else
{
printableForm += "\nHeuristic entries:";
RecordListIterator iter = new RecordListIterator(super.heuristicList);
AbstractRecord rec = iter.iterate();
int i = 0;
while (rec != null)
{
printableForm += "\n["+i+"] "+rec;
rec = iter.iterate();
i++;
}
}
return printableForm;
}
}
private boolean _activated;
}