blob: 647c9925c2fff1c1ad6e9367a8cdfc6679711fa5 [file] [log] [blame]
package org.testng.gigaspaces;
import java.io.IOException;
import java.util.Properties;
import net.jini.core.entry.UnusableEntryException;
import net.jini.core.lease.Lease;
import net.jini.core.lease.LeaseException;
import net.jini.core.transaction.Transaction;
import net.jini.core.transaction.TransactionException;
import net.jini.core.transaction.TransactionFactory;
import net.jini.core.transaction.Transaction.Created;
import net.jini.core.transaction.server.TransactionManager;
import org.testng.ISuite;
import org.testng.internal.Utils;
import org.testng.remote.adapter.IWorkerApadter;
import org.testng.xml.XmlSuite;
import com.j_spaces.core.IJSpace;
import com.j_spaces.core.client.LocalTransactionManager;
import com.j_spaces.core.client.SpaceFinder;
/**
* Provides a Worker adapter based on Gigaspaces space implementation.
*
* @author Guy Korland
*
* @date April 20, 2007
*/
public class SpaceWorkerAdapter implements IWorkerApadter
{
public static final String SPACE_URL = "gigaspaces.url";
public static final String SLAVE_TIMEOUT = "gigaspaces.slave.timeout";
final private SuiteEntry _suiteTemplate = new SuiteEntry();
private long m_transactionTimeout;
private TransactionManager m_tm;
private IJSpace m_space;
private Transaction m_currentTransaction;
private SuiteEntry m_currentSuite;
public SpaceWorkerAdapter()
{
}
/*
* @see org.testng.remote.adapter.IWorkerApadter#init(java.util.Properties)
*/
public void init(Properties prop) throws Exception
{
String url = prop.getProperty(SPACE_URL, "jini://*/*/TestNGSpace?groups=TestNG");
m_space = (IJSpace) SpaceFinder.find(url);
m_tm = LocalTransactionManager.getInstance(m_space);
//default 5 min
m_transactionTimeout = Integer.parseInt( prop.getProperty(SLAVE_TIMEOUT, "300000"));
}
/*
* @see org.testng.remote.adapter.IWorkerApadter#getSuite(long)
*/
public XmlSuite getSuite(long timeout) throws InterruptedException,
IOException
{
try
{
Created created = TransactionFactory.create(m_tm, m_transactionTimeout);
m_currentTransaction = created.transaction;
m_currentSuite = (SuiteEntry) m_space.take( _suiteTemplate, m_currentTransaction, m_transactionTimeout);
created.lease.renew(m_transactionTimeout);
return m_currentSuite.getSuite();
}
catch (TransactionException e)
{
Utils.log( "Transaction error", 1, e.toString());
}
catch (LeaseException e)
{
Utils.log( "Lease error", 1, e.toString());
}
catch (UnusableEntryException e)
{
IOException ex = new IOException();
ex.initCause(e);
throw ex;
}
return null;
}
/*
* @see org.testng.remote.adapter.IWorkerApadter#returnResult(org.testng.ISuite)
*/
public void returnResult(ISuite result) throws IOException
{
try
{
m_space.write(new ResultEntry(result, m_currentSuite.getTestID()), m_currentTransaction, Lease.FOREVER);
m_currentTransaction.commit();
}
catch (TransactionException e)
{
Utils.log( "Transaction error", 0, e.toString());
}
finally
{
m_currentTransaction = null;
m_currentSuite = null;
}
}
}