package com.ctp.cdi.query.util.jpa; import java.util.Arrays; import java.util.List; import javax.persistence.Query; public class QueryStringExtractorFactory { private final List<QueryStringExtractor> extractors = Arrays.<QueryStringExtractor>asList( new HibernateQueryStringExtractor(), new EclipseLinkEjbQueryStringExtractor(), new OpenJpaQueryStringExtractor()); public QueryStringExtractor select(Query query) { for (QueryStringExtractor extractor : extractors) { String compare = extractor.getClass().getAnnotation(ProviderSpecific.class).value(); if (isQueryClass(compare, query)) { return extractor; } } throw new RuntimeException("Persistence provider not supported"); } private boolean isQueryClass(String clazzName, Query query) { try { Class<?> toClass = Class.forName(clazzName); toClass.cast(query); return true; } catch (Exception e) { return false; } } }