diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAProvider.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAProvider.java index 675de8e36..697f8f514 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAProvider.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAProvider.java @@ -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, 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, JPQLTemplates> entry : mappings.entrySet()) { + if (entry.getKey().isAssignableFrom(em.getDelegate().getClass())) { + return entry.getValue(); + } + } + return JPQLTemplates.DEFAULT; } + + private JPAProvider() {} + } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/JPAProviderTest.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/JPAProviderTest.java index ba41f1e9d..dbbf89a16 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/jpa/JPAProviderTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/JPAProviderTest.java @@ -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 properties) { diff --git a/querydsl-jpa/template.mf b/querydsl-jpa/template.mf index da916f3b1..dd21d8d6f 100644 --- a/querydsl-jpa/template.mf +++ b/querydsl-jpa/template.mf @@ -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}" \ No newline at end of file + org.slf4j.*;version="${slf4j.version}", + com.google.common.*;version="${guava.version}" \ No newline at end of file