package fi.arcusys.koku.common.service.impl;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.ejb.Stateless;
import fi.arcusys.koku.common.service.RequestTemplateDAO;
import fi.arcusys.koku.common.service.datamodel.Question;
import fi.arcusys.koku.common.service.datamodel.RequestTemplate;
import fi.arcusys.koku.common.service.datamodel.User;
import fi.arcusys.koku.common.service.datamodel.Visibility;
/**
* DAO implementation for CRUD operations with 'RequestTemplate' Entity
*
* @author Dmitry Kudinov (dmitry.kudinov@arcusys.fi) Sep 2, 2011
*/
@Stateless
public class RequestTemplateDAOImpl extends AbstractEntityDAOImpl<RequestTemplate> implements RequestTemplateDAO {
public RequestTemplateDAOImpl() {
super(RequestTemplate.class);
}
/**
* @param searchString
* @param limit
* @return
*/
@Override
public List<RequestTemplate> searchTemplates(final User user, String searchString, int limit) {
final Map<String, Object> params = new HashMap<String, Object>();
params.put("prefix", getPrefixLike(searchString));
if (user == null) {
return super.getResultList("findRequestTemplatesByPrefix", params, FIRST_RESULT_NUMBER, limit);
} else {
params.put("user", user);
params.put("visibility_all", Visibility.All);
params.put("visibility_organization", Visibility.Organization);
params.put("visibility_creator", Visibility.Creator);
return super.getResultList("findRequestTemplatesByPrefixAndUser", params, FIRST_RESULT_NUMBER, limit);
}
}
/**
* @param subject
* @return
*/
@Override
public List<RequestTemplate> searchBySubject(String subject) {
return super.getResultList("findRequestTemplatesByPrefix",
Collections.<String, Object> singletonMap("prefix", subject),
FIRST_RESULT_NUMBER, MAX_RESULTS_COUNT);
}
/**
* @param entity
* @return
*/
@Override
public RequestTemplate update(RequestTemplate entity) {
if (entity.getId() == null) {
return super.update(entity);
}
final RequestTemplate existingEntity = getById(entity.getId());
final Set<Question> forDelete = new HashSet<Question>(existingEntity.getQuestions());
// still valid categories
for (final Question childEntity : entity.getQuestions()) {
if (childEntity.getId() != null) {
forDelete.remove(childEntity);
}
}
for (final Question childEntity : forDelete) {
em.remove(childEntity);
}
return super.update(entity);
}
}