package com.dragome.examples.crudgrid.services.serverside;
import java.util.Arrays;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import com.dragome.examples.crudgrid.model.Column;
import com.dragome.examples.crudgrid.model.ColumnImpl;
import com.dragome.examples.crudgrid.model.Identifiable;
import com.dragome.examples.crudgrid.model.People;
import com.dragome.examples.crudgrid.model.Place;
import com.dragome.examples.crudgrid.services.EntitiesProviderService;
public class EntitiesProviderServiceImpl implements EntitiesProviderService
{
protected static EntityManager entityManager= Persistence.createEntityManagerFactory("hsqldb-ds").createEntityManager();
public <T extends Identifiable> List<T> getAll(Class<T> entityType)
{
List<Place> resultList= findAll(Place.class);
if (resultList.isEmpty())
createPeople();
return findAll(entityType);
}
public List<Column> getColumnsFor(Class<?> entityType)
{
if (entityType.equals(People.class))
return Arrays.asList(new ColumnImpl("id", "col-md-1", true), new ColumnImpl("name", "col-md-2"), new ColumnImpl("place", "col-md-1", true, Place.class));
else
return Arrays.asList(new ColumnImpl("id", "col-md-1", true), new ColumnImpl("name", "col-md-2"));
}
private void createPeople()
{
EntityTransaction transaction= entityManager.getTransaction();
transaction.begin();
entityManager.persist(new People("Diego Maradona", new Place("Villa Fiorito, Buenos Aires, Argentina")));
entityManager.persist(new People("Ariel Ortega", new Place("Ledesma, Jujuy, Argentina")));
entityManager.persist(new People("Ricardo Bochini", new Place("Zárate, Buenos Aires, Argentina")));
transaction.commit();
}
private <T> List<T> findAll(Class<T> type)
{
CriteriaBuilder criteriaBuilder= entityManager.getCriteriaBuilder();
CriteriaQuery<T> criteriaQuery= (CriteriaQuery<T>) criteriaBuilder.createQuery(type);
Root<T> from= (Root<T>) criteriaQuery.from(type);
criteriaQuery.orderBy(criteriaBuilder.asc(from.get("id")));
CriteriaQuery<T> select= criteriaQuery.select(from);
TypedQuery<T> typedQuery= entityManager.createQuery(select);
List<T> resultList= typedQuery.getResultList();
return resultList;
}
public <T extends Identifiable> void saveAll(List<T> entities)
{
EntityTransaction transaction= entityManager.getTransaction();
transaction.begin();
entityManager.createQuery("DELETE FROM People").executeUpdate();
entityManager.flush();
transaction.commit();
entityManager.clear();
transaction.begin();
for (T entity : entities)
{
entity.setId(null);
entityManager.persist(entity);
}
transaction.commit();
}
public void delete(Identifiable object)
{
EntityTransaction transaction= entityManager.getTransaction();
transaction.begin();
Object merge= entityManager.merge(object);
entityManager.remove(merge);
entityManager.flush();
transaction.commit();
}
public Identifiable add(Identifiable object)
{
EntityTransaction transaction= entityManager.getTransaction();
transaction.begin();
object.setId(null);
entityManager.merge(object);
entityManager.flush();
transaction.commit();
return object;
}
public void update(Identifiable object)
{
EntityTransaction transaction= entityManager.getTransaction();
transaction.begin();
entityManager.persist(entityManager.merge(object));
entityManager.flush();
transaction.commit();
}
}