/*
* 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.xaframework;
import java.io.IOException;
import java.util.Map;
/**
* This is a wrapper class containing the logical log, command factory,
* transaction factory and resource manager. Using the static <CODE>create</CODE>
* method, a {@link XaResourceManager} will be created and the
* {@link XaLogicalLog} will be instantiated (not opened).
* <p>
* The purpose of this class is to make it easier to setup all that is needed
* when using the <CODE>xaframework</CODE>. Classes needs to be instantiated
* in a certain order and references passed between the. <CODE>XaContainer</CODE>
* will do that work so you only have to supply the <CODE>logical log file</CODE>,
* your {@link XaCommandFactory} and {@link XaTransactionFactory}
* implementations.
*/
public class XaContainer
{
private XaCommandFactory cf = null;
private XaLogicalLog log = null;
private XaResourceManager rm = null;
private XaTransactionFactory tf = null;
/**
* Creates a XaContainer.
*
* @param logicalLog
* The logical log file name
* @param cf
* The command factory implementation
* @param tf
* The transaction factory implementation
* @param config Configuration map or null if no config needed
*/
public static XaContainer create( String logicalLog, XaCommandFactory cf,
XaTransactionFactory tf, Map<Object,Object> config )
{
if ( logicalLog == null || cf == null || tf == null )
{
throw new IllegalArgumentException( "Null parameter, "
+ "LogicalLog[" + logicalLog + "] CommandFactory[" + cf
+ "TransactionFactory[" + tf + "]" );
}
return new XaContainer( logicalLog, cf, tf, config );
}
private XaContainer( String logicalLog, XaCommandFactory cf,
XaTransactionFactory tf, Map<Object,Object> config )
{
this.cf = cf;
this.tf = tf;
rm = new XaResourceManager( tf, logicalLog );
log = new XaLogicalLog( logicalLog, rm, cf, tf, config );
rm.setLogicalLog( log );
tf.setLogicalLog( log );
}
/**
* Opens the logical log. If the log doesn't exist a new log will be
* created. If the log exists it will be scaned and non completed
* transactions will be recovered.
* <p>
* This method is only valid to invoke once after the container has been
* created. Invoking this method again could cause the logical log to be
* corrupted.
*/
public void openLogicalLog() throws IOException
{
log.open();
}
/**
* Closes the logical log and nulls out all instances.
*/
public void close()
{
try
{
if ( log != null )
{
log.close();
}
}
catch ( IOException e )
{
System.out.println( "Unable to close logical log" );
e.printStackTrace();
}
log = null;
rm = null;
cf = null;
tf = null;
}
public XaCommandFactory getCommandFactory()
{
return cf;
}
public XaLogicalLog getLogicalLog()
{
return log;
}
public XaResourceManager getResourceManager()
{
return rm;
}
public XaTransactionFactory getTransactionFactory()
{
return tf;
}
}