package net.techreadiness.persistence.datagrid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import net.techreadiness.persistence.domain.RoleDO;
import net.techreadiness.service.common.DataGrid;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Scope("prototype")
@Repository
@Transactional(readOnly = true)
public class RoleItemProviderImpl implements RoleItemProvider {
@PersistenceContext
private EntityManager em;
private String searchString;
private Long scopeId;
@Override
public List<Map<String, String>> getPage(DataGrid<Map<String, String>> grid) {
int start = (grid.getPage() - 1) * grid.getPageSize();
TypedQuery<RoleDO> query = getQuery();
query.setFirstResult(start);
query.setMaxResults(grid.getPageSize());
return createRoleMap(query.getResultList());
}
@Override
public int getTotalNumberOfItems(DataGrid<Map<String, String>> grid) {
return getQuery().getResultList().size();
}
private TypedQuery<RoleDO> getQuery() {
StringBuilder sb = new StringBuilder();
sb.append("select r ");
sb.append("from RoleDO r, ");
sb.append(" ScopeTreeDO st");
sb.append(" where r.name LIKE :name ");
sb.append(" and st.scope.scopeId = :scopeid ");
sb.append(" and st.ancestorScope.scopeId = r.scope.scopeId");
sb.append(" order by r.scope.name, r.category, r.displayOrder, r.name");
TypedQuery<RoleDO> query = em.createQuery(sb.toString(), RoleDO.class);
query.setParameter("name", "%%");
query.setParameter("scopeid", scopeId);
// update search string if it's not null and not empty
if (!(searchString == null)) {
if (!searchString.isEmpty()) {
query.setParameter("name", "%" + searchString + "%");
}
}
return query;
}
/**
* Takes a list of RoleDO objects and appends their attributes to a map.
*
* @param entities
* @return
*/
private static List<Map<String, String>> createRoleMap(List<RoleDO> entities) {
List<Map<String, String>> maps = new ArrayList<>();
for (RoleDO roleDO : entities) {
Map<String, String> map = roleDO.getAsMap();
if (roleDO.getScope() != null) {
map.put("scopeId", String.valueOf(roleDO.getScope().getScopeId()));
map.put("scopeName", roleDO.getScope().getName());
}
maps.add(map);
}
return maps;
}
@Override
public void setSearchCriteria(String searchString) {
this.searchString = searchString;
}
@Override
public void setScope(Long scopeId) {
this.scopeId = scopeId;
}
}