package cz.cvut.fel.adaptiverestfulapi.data.persistence;
import cz.cvut.fel.adaptiverestfulapi.core.HttpContext;
import cz.cvut.fel.adaptiverestfulapi.core.HttpRouter;
import cz.cvut.fel.adaptiverestfulapi.data.DataException;
import cz.cvut.fel.adaptiverestfulapi.data.NotFoundException;
import cz.cvut.fel.adaptiverestfulapi.meta.configuration.Configuration;
import cz.cvut.fel.adaptiverestfulapi.meta.model.Entity;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import java.util.List;
public class GetHandler extends cz.cvut.fel.adaptiverestfulapi.data.GetHandler {
protected EntityManager manager;
public GetHandler(EntityManager manager) {
this.manager = manager;
}
@Override
protected HttpContext get(Entity entity, HttpContext context, Configuration configuration) throws DataException {
HttpRouter router = context.getRouter();
Object identifier = router.getIdentifier(entity.getPrimary().getAttributeType());
Object result = null;
if (identifier != null) {
result = this.find(entity, identifier);
if (result == null) {
throw new NotFoundException(entity.getName(), identifier.toString());
}
} else {
result = this.findAll(entity);
}
context.setContent(result);
return context;
}
protected Object find(Entity entity, Object identifier) {
return this.manager.find(entity.getEntityClass(), identifier);
}
protected List findAll(Entity entity) {
CriteriaBuilder qb = this.manager.getCriteriaBuilder();
CriteriaQuery criteria = qb.createQuery(entity.getEntityClass());
Root root = criteria.from(entity.getEntityClass());
TypedQuery query = this.manager.createQuery(criteria);
return query.getResultList();
}
}