#250 improved dialect detection

This commit is contained in:
Timo Westkämper 2012-10-17 22:01:55 +03:00
parent 0145ab334e
commit 54714945f5
3 changed files with 30 additions and 48 deletions

View File

@ -13,67 +13,48 @@
*/
package com.mysema.query.jpa.impl;
import java.util.Map;
import javax.persistence.EntityManager;
import com.google.common.collect.Maps;
import com.mysema.query.jpa.EclipseLinkTemplates;
import com.mysema.query.jpa.HQLTemplates;
import com.mysema.query.jpa.JPQLTemplates;
import com.mysema.query.jpa.OpenJPATemplates;
/**
* JPAProvider provides an enumeration of supported JPA providers
* JPAProvider provides detection of the JPA provider based on the EntityManager instance
*
* @author tiwe
*
*/
public enum JPAProvider {
/**
* Hibernate
*/
HIBERNATE("org.hibernate.Session", new HQLTemplates()),
public final class JPAProvider {
/**
* EclipseLink
*/
ECLIPSELINK("org.eclipse.persistence.jpa.JpaEntityManager", new EclipseLinkTemplates()),
private static final Map<Class<?>, JPQLTemplates> mappings = Maps.newHashMap();
/**
* OpenJPA
*/
OPEN_JPA("org.apache.openjpa.persistence.OpenJPAEntityManager", new OpenJPATemplates()),
/**
* Generic JPA provider
*/
GENERIC("javax.persistence.EntityManager", JPQLTemplates.DEFAULT);
private Class<?> delegateClass;
private final JPQLTemplates templates;
JPAProvider(String emClassName, JPQLTemplates templates) {
this.templates = templates;
try {
this.delegateClass = Class.forName(emClassName);
private static void addMapping(String className, JPQLTemplates templates) {
try {
mappings.put(Class.forName(className), templates);
} catch (ClassNotFoundException e) {}
}
public JPQLTemplates getTemplates() {
return templates;
}
public static JPAProvider get(EntityManager em) {
for (JPAProvider provider : values()) {
if (provider.delegateClass != null
&& provider.delegateClass.isAssignableFrom(em.getDelegate().getClass())) {
return provider;
}
}
throw new IllegalStateException("No Provider for " + em.getClass().getName());
static {
addMapping("org.hibernate.Session", HQLTemplates.DEFAULT);
addMapping("org.hibernate.ejb.HibernateEntityManager", HQLTemplates.DEFAULT);
addMapping("org.eclipse.persistence.jpa.JpaEntityManager", EclipseLinkTemplates.DEFAULT);
addMapping("org.apache.openjpa.persistence.OpenJPAEntityManager", OpenJPATemplates.DEFAULT);
}
public static JPQLTemplates getTemplates(EntityManager em) {
return get(em).getTemplates();
for (Map.Entry<Class<?>, JPQLTemplates> entry : mappings.entrySet()) {
if (entry.getKey().isAssignableFrom(em.getDelegate().getClass())) {
return entry.getValue();
}
}
return JPQLTemplates.DEFAULT;
}
private JPAProvider() {}
}

View File

@ -37,7 +37,7 @@ public class JPAProviderTest {
em = factory.createEntityManager();
System.out.println(em.getDelegate().getClass());
// println(em.getEntityManagerFactory().getProperties());
assertEquals(JPAProvider.HIBERNATE, JPAProvider.get(em));
assertEquals(HQLTemplates.DEFAULT, JPAProvider.getTemplates(em));
}
@Test
@ -54,7 +54,7 @@ public class JPAProviderTest {
Thread.currentThread().getContextClassLoader(),
new Class[]{EntityManager.class},
handler);
assertEquals(JPAProvider.HIBERNATE, JPAProvider.get(proxy));
assertEquals(HQLTemplates.DEFAULT, JPAProvider.getTemplates(proxy));
}
@Test
@ -63,7 +63,7 @@ public class JPAProviderTest {
em = factory.createEntityManager();
System.out.println(em.getDelegate().getClass());
// println(em.getEntityManagerFactory().getProperties());
assertEquals(JPAProvider.ECLIPSELINK, JPAProvider.get(em));
assertEquals(EclipseLinkTemplates.DEFAULT, JPAProvider.getTemplates(em));
}
@Test
@ -80,7 +80,7 @@ public class JPAProviderTest {
Thread.currentThread().getContextClassLoader(),
new Class[]{EntityManager.class},
handler);
assertEquals(JPAProvider.ECLIPSELINK, JPAProvider.get(proxy));
assertEquals(EclipseLinkTemplates.DEFAULT, JPAProvider.getTemplates(proxy));
}
@Test
@ -89,7 +89,7 @@ public class JPAProviderTest {
em = factory.createEntityManager();
System.out.println(em.getDelegate().getClass());
// println(em.getEntityManagerFactory().getProperties());
assertEquals(JPAProvider.OPEN_JPA, JPAProvider.get(em));
assertEquals(OpenJPATemplates.DEFAULT, JPAProvider.getTemplates(em));
}
// private void println(Map<String, Object> properties) {

View File

@ -12,4 +12,5 @@ Import-Template:
javax.persistence.*;version="[1.1.0,2.1.0)",
javax.xml.stream.*;version="0",
org.hibernate.*;version="${hibernate.version}";resolution:=optional,
org.slf4j.*;version="${slf4j.version}"
org.slf4j.*;version="${slf4j.version}",
com.google.common.*;version="${guava.version}"