package fi.otavanopisto.pyramus.dao;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.metamodel.EntityType;
import javax.persistence.metamodel.Metamodel;
import javax.persistence.metamodel.SingularAttribute;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;
import org.hibernate.CacheMode;
import org.hibernate.search.MassIndexer;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.Search;
@Stateless
public class SystemDAO {
public SystemDAO() {
}
// JPA methods
@SuppressWarnings({ "unchecked", "rawtypes" })
public Object findEntityById(Class referencedClass, Object id) {
EntityManager entityManager = getEntityManager();
return entityManager.find(referencedClass, id);
}
public SingularAttribute<?, ?> getEntityIdAttribute(Class<?> entityClass) {
EntityType<?> entityType = getEntityManager().getMetamodel().entity(entityClass);
return entityType.getId(entityType.getIdType().getJavaType());
}
public Set<EntityType<?>> getEntities() {
return getEntityManager().getMetamodel().getEntities();
}
public javax.persistence.metamodel.Attribute<?, ?> getEntityAttribute(Class<?> entityClass, String fieldName) {
EntityType<?> entityType = getEntityManager().getMetamodel().entity(entityClass);
return entityType.getAttribute(fieldName);
}
public Set<javax.persistence.metamodel.Attribute<?, ?>> getEntityAttributes(Class<?> entityClass) {
Set<javax.persistence.metamodel.Attribute<?, ?>> result = new HashSet<>();
EntityType<?> entityType = getEntityManager().getMetamodel().entity(entityClass);
for (javax.persistence.metamodel.Attribute<?, ?> attribute : entityType.getAttributes()) {
result.add(attribute);
}
return result;
}
public void persistEntity(Object entity) {
getEntityManager().persist(entity);
}
public Set<ConstraintViolation<Object>> validateEntity(Object entity) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
return factory.getValidator().validate(entity);
}
public Query createJPQLQuery(String jpql) {
return getEntityManager().createQuery(jpql);
}
// Hibernate search methods
public List<Class<?>> getIndexedEntities() {
List<Class<?>> result = new ArrayList<>();
EntityManager entityManager = getEntityManager();
Metamodel metamodel = entityManager.getEntityManagerFactory().getMetamodel();
for (EntityType<?> entityType : metamodel.getEntities()) {
Class<?> entityClass = entityType.getJavaType();
if (entityClass.isAnnotationPresent(Indexed.class)) {
result.add(entityClass);
}
}
return result;
}
public void reindexHibernateSearchObjects(Class<?> entity, int batchSize) throws InterruptedException {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(getEntityManager());
MassIndexer massIndexer = fullTextEntityManager.createIndexer(entity);
massIndexer.batchSizeToLoadObjects(batchSize);
massIndexer.threadsToLoadObjects(1);
massIndexer.cacheMode(CacheMode.IGNORE);
massIndexer.startAndWait();
}
public EntityManager getEntityManager() {
return entityManager;
}
@PersistenceContext
private EntityManager entityManager;
}