/* * JBoss, Home of Professional Open Source * Copyright 2015, 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. * * @author JBoss Inc. */ package com.hp.mwtests.ts.arjuna.abstractrecords; import java.io.IOException; import com.arjuna.ats.arjuna.common.Uid; import com.arjuna.ats.arjuna.coordinator.AbstractRecord; import com.arjuna.ats.arjuna.coordinator.RecordType; import com.arjuna.ats.arjuna.coordinator.TwoPhaseOutcome; import com.arjuna.ats.arjuna.state.InputObjectState; import com.arjuna.ats.arjuna.state.OutputObjectState; public class OrderedOnePhaseAbstractRecord extends AbstractRecord { Uid order; private boolean fail; /** * Used for recovery */ public OrderedOnePhaseAbstractRecord() { super(); } public OrderedOnePhaseAbstractRecord(Uid uid) { super(uid); order = uid; } public static int typeId() { return RecordType.USER_DEF_FIRST0; } public int typeIs() { return typeId(); } public int topLevelPrepare() { // Maybe do a Hibernate flush or something to check constraints if you were wrapping hibernate return TwoPhaseOutcome.PREPARE_OK; } public void causeTransientFailure() { fail = true; } public int topLevelCommit() { System.out.println("topLevelCommit: " + order); if (!fail) return TwoPhaseOutcome.FINISH_OK; else return TwoPhaseOutcome.FINISH_ERROR; } /** * You would commit the 1PC connection here */ public int topLevelOnePhaseCommit() { return TwoPhaseOutcome.FINISH_OK; } /** * You would rollback the 1PC connection here */ public int topLevelAbort() { return TwoPhaseOutcome.FINISH_OK; } /** * Save inline in the BasicAction */ public boolean doSave() { return true; } /** * Make sure we save the Uid so we can do ordering during recovery */ public boolean save_state(OutputObjectState os, int ot) { try { os.packBytes(order.getBytes()); } catch (IOException e) { e.printStackTrace(); return false; } System.out.println("save: " + order); return true; } /** * Make sure we restore the Uid so we can do ordering during recovery */ public boolean restore_state(InputObjectState os, int ot) { try { order = new Uid(os.unpackBytes()); } catch (IOException e) { e.printStackTrace(); return false; } System.out.println("restored: " + order); return true; } /** * Use the Uid to enforce the order */ public Uid order() { return order; } public String type() { return "/StateManager/AbstractRecord/" + getClass().getName(); } // Methods below this are NO-OP/defaults/disable 1PC public int nestedOnePhaseCommit() { return TwoPhaseOutcome.FINISH_ERROR; } public int nestedAbort() { return TwoPhaseOutcome.FINISH_ERROR; } public int nestedCommit() { return TwoPhaseOutcome.FINISH_ERROR; } public int nestedPrepare() { return TwoPhaseOutcome.PREPARE_NOTOK; } public boolean shouldAdd(AbstractRecord a) { return false; } public boolean shouldMerge(AbstractRecord a) { return false; } public boolean shouldReplace(AbstractRecord a) { return false; } public boolean shouldAlter(AbstractRecord a) { return false; } public void merge(AbstractRecord a) { } public void alter(AbstractRecord a) { } public Object value() { return null; } public void setValue(Object o) { } }