/*******************************************************************************
* Copyright (c) 2014 antoniomariasanchez at gmail.com.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* antoniomaria - initial API and implementation
******************************************************************************/
package net.sf.gazpachoquest.repository.support;
import static org.springframework.data.jpa.repository.utils.JpaClassUtils.isEntityManagerOfType;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.spi.PersistenceProvider;
import org.eclipse.persistence.jpa.JpaQuery;
import org.springframework.data.jpa.repository.query.QueryExtractor;
/**
*
* @author Boris lam This class is use when you use DefaultRepositoryFactory to
* override default repository factory
* class.
*
*/
public enum DefaultPersistenceProvider implements QueryExtractor {
ECLIPSELINK("org.eclipse.persistence.jpa.JpaEntityManager") {
@Override
public String extractQueryString(final Query query) {
return ((JpaQuery<?>) query).getDatabaseQuery().getJPQLString();
}
},
GENERIC_JPA("javax.persistence.EntityManager") {
@Override
public boolean canExtractQuery() {
return false;
}
@Override
public String extractQueryString(final Query query) {
return null;
}
},
HIBERNATE("org.hibernate.ejb.HibernateEntityManager") {
@Override
public String extractQueryString(final Query query) {
return null;
}
@Override
protected String getCountQueryPlaceholder() {
return "*";
}
},
OPEN_JPA("org.apache.openjpa.persistence.OpenJPAEntityManager") {
@Override
public String extractQueryString(final Query query) {
// return ((OpenJPAQuery) query).getQueryString();
return null;
}
};
public static DefaultPersistenceProvider fromEntityManager(final EntityManager em) {
for (DefaultPersistenceProvider provider : values()) {
if (isEntityManagerOfType(em, provider.entityManagerClassName)) {
return provider;
}
}
return GENERIC_JPA;
}
private String entityManagerClassName;
/**
* Creates a new {@link PersistenceProvider}.
*
* @param entityManagerClassName
* the name of the provider specific {@link EntityManager}
* implementation
*/
private DefaultPersistenceProvider(final String entityManagerClassName) {
this.entityManagerClassName = entityManagerClassName;
}
@Override
public boolean canExtractQuery() {
return true;
}
/**
* Returns the placeholder to be used for simple count queries. Default
* implementation returns {@code *}.
*
* @return count
*/
protected String getCountQueryPlaceholder() {
return "x";
}
}