package example.das;

import java.io.InputStream;

import javax.persistence.Query;

import org.apache.openjpa.das.FluidDASFactory;
import org.apache.openjpa.meta.MetaDataFactory;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.sdo.SDOEntityManagerFactory;
import org.apache.openjpa.sdo.SDOMappingRepository;
import org.apache.openjpa.sdo.SDOMetaDataFactory;
import org.apache.tuscany.das.rdb.DAS;
import org.apache.tuscany.das.rdb.DASFactory;

import commonj.sdo.Type;

import junit.framework.TestCase;

abstract class DASTestCase extends TestCase {
	public static final String UNIT_NAME = 
		System.getProperty("persistence.unit", "test");
	
	protected static FluidDASFactory dasFactory;
	
	protected void setUp() throws Exception {
		super.setUp();
		if (dasFactory == null)
			dasFactory = new FluidDASFactory(UNIT_NAME);
	}

	protected DAS getDAS() {
		return dasFactory.createDAS((InputStream)null);
	}
	
	/**
	 * Count number of persistent instances of the given alias.
	 */
	public int count(String alias) {
		OpenJPAEntityManager em = dasFactory.getDelegate().createEntityManager();
		Query query = em.createQuery("SELECT COUNT(o) FROM " + alias + " o");
		return ((Long)query.getSingleResult()).intValue();
	}
	
	public Type getType(String name) {
		SDOEntityManagerFactory emf = dasFactory.getDelegate();
		MetaDataFactory mdf = emf.getConfiguration()
			.getMetaDataRepositoryInstance().getMetaDataFactory();
		assertTrue(mdf instanceof SDOMetaDataFactory);
		SDOMappingRepository repos = ((SDOMetaDataFactory)mdf).getSDOMappingRepository();
		return repos.getType(name);
	}
}
