/******************************************************************************* | |
* Copyright (c) 2010 Oracle. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v1.0 | |
* and Apache License v2.0 which accompanies this distribution. | |
* The Eclipse Public License is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* and the Apache License v2.0 is available at | |
* http://www.opensource.org/licenses/apache2.0.php. | |
* You may elect to redistribute this code under either of these licenses. | |
* | |
* Contributors: | |
* mkeith - Gemini JPA tests | |
******************************************************************************/ | |
package org.eclipse.gemini.jpa.tests; | |
import java.util.HashMap; | |
import java.util.List; | |
import java.util.Map; | |
import java.util.Set; | |
import javax.persistence.*; | |
import javax.persistence.metamodel.EntityType; | |
import org.junit.*; | |
import org.osgi.framework.BundleContext; | |
import org.osgi.framework.InvalidSyntaxException; | |
import org.osgi.framework.ServiceReference; | |
import org.osgi.service.jpa.EntityManagerFactoryBuilder; | |
import model.account.*; | |
/** | |
* Test class to test EMF Service from a client | |
* | |
* @author mkeith | |
*/ | |
public abstract class JpaTest { | |
public static BundleContext context; | |
// Define the JDBC access details. At some point we should probably externalize this... | |
public static final String JDBC_TEST_DRIVER = "org.apache.derby.jdbc.ClientDriver"; | |
public static final String JDBC_TEST_URL = "jdbc:derby://localhost:1527/accountDB;create=true"; | |
public static final String JDBC_TEST_USER = "app"; | |
public static final String JDBC_TEST_PASSWORD = "app"; | |
// Put the JDBC access config in the default props | |
public static Map<String,Object> defaultProps() { | |
Map<String,Object> props = new HashMap<String,Object>(); | |
props.put("javax.persistence.jdbc.driver", JDBC_TEST_DRIVER); | |
props.put("javax.persistence.jdbc.url", JDBC_TEST_URL); | |
props.put("javax.persistence.jdbc.user", JDBC_TEST_USER); | |
props.put("javax.persistence.jdbc.password", JDBC_TEST_URL); | |
return props; | |
} | |
/* === Methods that *must* be subclassed === */ | |
public abstract EntityManagerFactory getEmf(); | |
public abstract String getTestPersistenceUnitName(); | |
/* === Methods that *may* be subclassed === */ | |
public boolean needsEmfService() { return true; } | |
public boolean needsDsfService() { return true; } | |
public String testName() { | |
return this.getClass().getSimpleName(); | |
} | |
public Object newObject() { | |
Account a = new Account(); | |
a.setBalance(100.0); | |
return a; | |
} | |
public Object findObject() { | |
EntityManager em = getEmf().createEntityManager(); | |
Object obj = em.find(Account.class, 1); | |
em.close(); | |
return obj; | |
} | |
public Object queryObjects() { | |
EntityManager em = getEmf().createEntityManager(); | |
List<?> result = em.createQuery("SELECT a FROM Account a").getResultList(); | |
em.close(); | |
return result; | |
} | |
/* === Test Methods === */ | |
@Test | |
public void testGettingEntityManager() { | |
log("testGettingEntityManager"); | |
EntityManager em = getEmf().createEntityManager(); | |
log("Got EM - " + em); | |
} | |
@Test | |
public void testPersisting() { | |
log("testPersisting"); | |
EntityManager em = getEmf().createEntityManager(); | |
Object obj = newObject(); | |
em.getTransaction().begin(); | |
log("testPersisting - tx begun"); | |
try { | |
em.persist(obj); | |
} catch (Exception e) { | |
log("Error calling persist(): "); | |
e.printStackTrace(System.out); | |
} | |
log("testPersisting - tx committing"); | |
em.getTransaction().commit(); | |
em.close(); | |
log("Persisted " + obj); | |
} | |
@Test | |
public void testFinding() { | |
log("testFinding"); | |
log("Find returned - " + findObject()); | |
} | |
@Test | |
public void testQuerying() { | |
log("testQuerying"); | |
log("Query returned - " + queryObjects()); | |
} | |
@Test | |
public void testGettingMetamodel() { | |
log("testGettingMetamodel"); | |
EntityManager em = getEmf().createEntityManager(); | |
Set<EntityType<?>> s = em.getMetamodel().getEntities(); | |
for (EntityType<?> et : s) { | |
log("Managed Entity name: " + et.getName()); | |
log("Managed Entity class: " + et.getJavaType()); | |
log("Classloader: " + et.getJavaType().getClassLoader()); | |
} | |
} | |
/* === Helper methods === */ | |
public static EntityManagerFactory lookupEntityManagerFactory(String testName, String puName) { | |
String filter = "(osgi.unit.name="+puName+")"; | |
ServiceReference[] refs = null; | |
try { | |
refs = context.getServiceReferences(EntityManagerFactory.class.getName(), filter); | |
} catch (InvalidSyntaxException isEx) { | |
new RuntimeException("Bad filter", isEx); | |
} | |
slog(testName, "EMF Service refs looked up from registry: " + refs); | |
return (refs == null) | |
? null | |
: (EntityManagerFactory) context.getService(refs[0]); | |
} | |
public static EntityManagerFactoryBuilder lookupEntityManagerFactoryBuilder(String testName, String puName) { | |
String filter = "(osgi.unit.name="+puName+")"; | |
ServiceReference[] refs = null; | |
try { | |
refs = context.getServiceReferences(EntityManagerFactoryBuilder.class.getName(), filter); | |
} catch (InvalidSyntaxException isEx) { | |
new RuntimeException("Bad filter", isEx); | |
} | |
slog(testName, "EMF Builder Service refs looked up from registry: " + refs); | |
return (refs == null) | |
? null | |
: (EntityManagerFactoryBuilder) context.getService(refs[0]); | |
} | |
public static void slog(String testName, String msg) { | |
System.out.println("***** " + testName + " - " + msg); | |
} | |
public void log(String msg) { | |
System.out.println("***** " + this.getClass().getSimpleName() + " - " + msg); | |
} | |
} |