// Path: raidenjpa-core/src/main/java/org/raidenjpa/entities/A.java
// @Entity
// public class A extends Entidade {
// 
// 	private Long id;
// 
// 	private String stringValue;
// 	
// 	private Integer intValue;
// 
// 	private B b;
// 	
// 	private List<ItemA> itens = new ArrayList<ItemA>();
// 
// 	public A() {
// 	}
// 
// 	public A(String stringValue, int intValue) {
// 		this.stringValue = stringValue;
// 		this.intValue = intValue;
// 	}
// 
// 	public A(String stringValue) {
// 		this.stringValue = stringValue;
// 	}
// 	
// 	public void addItem(ItemA item) {
// 		itens.add(item);
// 	}
// 
// 	@Id
// 	@GeneratedValue
// 	public Long getId() {
// 		return id;
// 	}
// 
// 	public A setId(Long id) {
// 		this.id = id;
// 		return this;
// 	}
// 
// 	@OneToOne
// 	public B getB() {
// 		return b;
// 	}
// 
// 	public void setB(B b) {
// 		this.b = b;
// 	}
// 
// 	public String getStringValue() {
// 		return stringValue;
// 	}
// 
// 	public void setStringValue(String stringValue) {
// 		this.stringValue = stringValue;
// 	}
// 
// 	public Integer getIntValue() {
// 		return intValue;
// 	}
// 
// 	public void setIntValue(Integer intValue) {
// 		this.intValue = intValue;
// 	}
// 
// 	@OneToMany(cascade = CascadeType.ALL, mappedBy = "a")
// 	public List<ItemA> getItens() {
// 		return itens;
// 	}
// 
// 	public A setItens(List<ItemA> itens) {
// 		this.itens = itens;
// 		return this;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "A [id=" + id + ", stringValue=" + stringValue + ", intValue=" + intValue + ", b.id=" + (b == null ? "" : b.getId()) + "]";
// 	}
// 
// }
// 
// Path: raidenjpa-benchmark/src/test/java/org/raidenjpa/util/EntityManagerUtil.java
// @BadSmell("It is duplicated. We should create a component to this kind of stuff")
// public class EntityManagerUtil {
// 
// 	private static List<EntityManager> ems = new ArrayList<EntityManager>();
// 
// 	private static EntityManagerFactory emfHibernate;
// 	
// 	private static EntityManagerFactory emfRaiden;
// 
// 	private static TestType testType;
// 
// 	public static EntityManager em() {
// 		EntityManager em = emf().createEntityManager();
// 
// 		ems.add(em);
// 
// 		return em;
// 	}
// 	
// 	public static <T> T mergeAndCommit(T t) {
// 		EntityManager em = EntityManagerUtil.em();
// 		em.getTransaction().begin();
// 		t = em.merge(t);
// 		em.getTransaction().commit();
// 		return t;
// 	}
// 
// 	private synchronized static EntityManagerFactory emf() {
// 		if (testType == null) {
// 			throw new RuntimeException("testType not defined");
// 		}
// 		
// 		if (testType == TestType.HIBERNATE) {
// 			if (emfHibernate == null) {
// 				emfHibernate = Persistence.createEntityManagerFactory("test-pu");
// 			}
// 			return emfHibernate;
// 		} else if (testType == TestType.RAIDEN) {
// 			if (emfRaiden == null) {
// 				emfRaiden = new RaidenEntityManagerFactory();
// 			}
// 			return emfRaiden;
// 		} else {
// 			throw new RuntimeException("testType not recognized: " + testType);
// 		}
// 	}
// 
// 	public static void clean() {
// 		for (EntityManager em : ems) {
// 			try {
// 				if (em.isOpen()) {
// 					em.close();
// 				}
// 			} catch (RuntimeException e) {
// 				e.printStackTrace();
// 			}
// 		}
// 
// 		ems = new ArrayList<EntityManager>();
// 
// 		testType = null;
// 	}
// 
// 	public static void asHibernate() {
// 		testType = TestType.HIBERNATE;
// 	}
// 	
// 	public static boolean isHibernate() {
// 		return testType == TestType.HIBERNATE; 
// 	}
// 
// 	public static void asRaiden() {
// 		testType = TestType.RAIDEN;
// 	}
// 	
// 	public static boolean isRaiden() {
// 		return testType == TestType.RAIDEN; 
// 	}
// 
// 	private enum TestType {
// 		HIBERNATE, RAIDEN
// 	}
// }


import static org.junit.Assert.*;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.junit.Test;
import org.raidenjpa.entities.A;
import org.raidenjpa.util.EntityManagerUtil;
package org.raidenjpa;





public class BasicTest extends AbstractTestCase {

	@Test
	public void test() {
		Service service = new Service();
		
		A a1 = new A("a1");
		A a2 = new A("a2");
		
		service.save(a1);
		service.save(a2);
		
		List<A> result = service.find("a1");
		assertEquals(1, result.size());
		assertEquals("a1", result.get(0).getStringValue());
	}
	
	class Service {
		
		@SuppressWarnings("unchecked")
		List<A> find(String value) {
			String jpql = "FROM A a WHERE a.stringValue = :value";
// Path: raidenjpa-core/src/main/java/org/raidenjpa/entities/A.java
// @Entity
// public class A extends Entidade {
// 
// 	private Long id;
// 
// 	private String stringValue;
// 	
// 	private Integer intValue;
// 
// 	private B b;
// 	
// 	private List<ItemA> itens = new ArrayList<ItemA>();
// 
// 	public A() {
// 	}
// 
// 	public A(String stringValue, int intValue) {
// 		this.stringValue = stringValue;
// 		this.intValue = intValue;
// 	}
// 
// 	public A(String stringValue) {
// 		this.stringValue = stringValue;
// 	}
// 	
// 	public void addItem(ItemA item) {
// 		itens.add(item);
// 	}
// 
// 	@Id
// 	@GeneratedValue
// 	public Long getId() {
// 		return id;
// 	}
// 
// 	public A setId(Long id) {
// 		this.id = id;
// 		return this;
// 	}
// 
// 	@OneToOne
// 	public B getB() {
// 		return b;
// 	}
// 
// 	public void setB(B b) {
// 		this.b = b;
// 	}
// 
// 	public String getStringValue() {
// 		return stringValue;
// 	}
// 
// 	public void setStringValue(String stringValue) {
// 		this.stringValue = stringValue;
// 	}
// 
// 	public Integer getIntValue() {
// 		return intValue;
// 	}
// 
// 	public void setIntValue(Integer intValue) {
// 		this.intValue = intValue;
// 	}
// 
// 	@OneToMany(cascade = CascadeType.ALL, mappedBy = "a")
// 	public List<ItemA> getItens() {
// 		return itens;
// 	}
// 
// 	public A setItens(List<ItemA> itens) {
// 		this.itens = itens;
// 		return this;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "A [id=" + id + ", stringValue=" + stringValue + ", intValue=" + intValue + ", b.id=" + (b == null ? "" : b.getId()) + "]";
// 	}
// 
// }
// 
// Path: raidenjpa-benchmark/src/test/java/org/raidenjpa/util/EntityManagerUtil.java
// @BadSmell("It is duplicated. We should create a component to this kind of stuff")
// public class EntityManagerUtil {
// 
// 	private static List<EntityManager> ems = new ArrayList<EntityManager>();
// 
// 	private static EntityManagerFactory emfHibernate;
// 	
// 	private static EntityManagerFactory emfRaiden;
// 
// 	private static TestType testType;
// 
// 	public static EntityManager em() {
// 		EntityManager em = emf().createEntityManager();
// 
// 		ems.add(em);
// 
// 		return em;
// 	}
// 	
// 	public static <T> T mergeAndCommit(T t) {
// 		EntityManager em = EntityManagerUtil.em();
// 		em.getTransaction().begin();
// 		t = em.merge(t);
// 		em.getTransaction().commit();
// 		return t;
// 	}
// 
// 	private synchronized static EntityManagerFactory emf() {
// 		if (testType == null) {
// 			throw new RuntimeException("testType not defined");
// 		}
// 		
// 		if (testType == TestType.HIBERNATE) {
// 			if (emfHibernate == null) {
// 				emfHibernate = Persistence.createEntityManagerFactory("test-pu");
// 			}
// 			return emfHibernate;
// 		} else if (testType == TestType.RAIDEN) {
// 			if (emfRaiden == null) {
// 				emfRaiden = new RaidenEntityManagerFactory();
// 			}
// 			return emfRaiden;
// 		} else {
// 			throw new RuntimeException("testType not recognized: " + testType);
// 		}
// 	}
// 
// 	public static void clean() {
// 		for (EntityManager em : ems) {
// 			try {
// 				if (em.isOpen()) {
// 					em.close();
// 				}
// 			} catch (RuntimeException e) {
// 				e.printStackTrace();
// 			}
// 		}
// 
// 		ems = new ArrayList<EntityManager>();
// 
// 		testType = null;
// 	}
// 
// 	public static void asHibernate() {
// 		testType = TestType.HIBERNATE;
// 	}
// 	
// 	public static boolean isHibernate() {
// 		return testType == TestType.HIBERNATE; 
// 	}
// 
// 	public static void asRaiden() {
// 		testType = TestType.RAIDEN;
// 	}
// 	
// 	public static boolean isRaiden() {
// 		return testType == TestType.RAIDEN; 
// 	}
// 
// 	private enum TestType {
// 		HIBERNATE, RAIDEN
// 	}
// }


// Path: raidenjpa-core/src/test/java/org/raidenjpa/BasicTest.java
import static org.junit.Assert.*;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.junit.Test;
import org.raidenjpa.entities.A;
import org.raidenjpa.util.EntityManagerUtil;

package org.raidenjpa;





public class BasicTest extends AbstractTestCase {

	@Test
	public void test() {
		Service service = new Service();
		
		A a1 = new A("a1");
		A a2 = new A("a2");
		
		service.save(a1);
		service.save(a2);
		
		List<A> result = service.find("a1");
		assertEquals(1, result.size());
		assertEquals("a1", result.get(0).getStringValue());
	}
	
	class Service {
		
		@SuppressWarnings("unchecked")
		List<A> find(String value) {
			String jpql = "FROM A a WHERE a.stringValue = :value";
			Query query = EntityManagerUtil.em().createQuery(jpql);