/* * Copyright (c) 2002-2009 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.neo4j.kernel.impl.transaction; import java.util.ArrayList; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid; class FakeXAResource implements XAResource { private String name = null; private int transactionTimeout = 0; private ArrayList<MethodCall> methodCalls = new ArrayList<MethodCall>(); FakeXAResource( String name ) { this.name = name; } public String getName() { return name; } public String toString() { return name; } synchronized MethodCall[] getAndRemoveMethodCalls() { if ( methodCalls.size() > 0 ) { MethodCall methodCallArray[] = new MethodCall[methodCalls.size()]; methodCallArray = methodCalls.toArray( methodCallArray ); methodCalls = new ArrayList<MethodCall>(); return methodCallArray; } return new MethodCall[0]; } private synchronized void addMethodCall( MethodCall methodCall ) { methodCalls.add( methodCall ); } public void commit( Xid xid, boolean onePhase ) { addMethodCall( new MethodCall( "commit", new Object[] { xid, new Boolean( onePhase ) }, new String[] { "javax.transaction.xa.Xid", "java.lang.Boolean" } ) ); } public void end( Xid xid, int flags ) { addMethodCall( new MethodCall( "end", new Object[] { xid, new Integer( flags ) }, new String[] { "javax.transaction.xa.Xid", "java.lang.Integer" } ) ); } public void forget( Xid xid ) { addMethodCall( new MethodCall( "forget", new Object[] { xid }, new String[] { "javax.transaction.xa.Xid" } ) ); } public int getTransactionTimeout() { return transactionTimeout; } public boolean setTransactionTimeout( int timeout ) { transactionTimeout = timeout; return true; } public boolean isSameRM( XAResource xares ) { if ( xares instanceof FakeXAResource ) { if ( this.name.equals( ((FakeXAResource) xares).getName() ) ) { return true; } } return false; } public int prepare( Xid xid ) { addMethodCall( new MethodCall( "prepare", new Object[] { xid }, new String[] { "javax.transaction.xa.Xid" } ) ); return XAResource.XA_OK; } public Xid[] recover( int flag ) { addMethodCall( new MethodCall( "recover", new Object[] { new Integer( flag ) }, new String[] { "java.lang.Integer" } ) ); return new Xid[0]; } public void rollback( Xid xid ) { addMethodCall( new MethodCall( "rollback", new Object[] { xid }, new String[] { "javax.transaction.xa.Xid" } ) ); } public void start( Xid xid, int flags ) { addMethodCall( new MethodCall( "start", new Object[] { xid, new Integer( flags ) }, new String[] { "javax.transaction.xa.Xid", "java.lang.Integer" } ) ); } }