package net.techreadiness.plugin.action.org; import java.util.Collection; import java.util.Map; import javax.inject.Inject; import net.techreadiness.persistence.criteriaquery.Criteria; import net.techreadiness.persistence.criteriaquery.CriteriaQuery; import net.techreadiness.persistence.criteriaquery.QueryResult; import net.techreadiness.persistence.dao.OrgDAO; import net.techreadiness.persistence.dao.ScopeDAO; import net.techreadiness.persistence.domain.OrgDO; import net.techreadiness.persistence.domain.ScopeDO; import net.techreadiness.service.ServiceContext; import net.techreadiness.service.common.DataGrid; import net.techreadiness.service.common.DataGridItemProviderImpl; import net.techreadiness.service.object.Org; import net.techreadiness.service.object.mapping.MappingService; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @Component @Scope("prototype") @Transactional(readOnly = true) public class ReadyOrgItemProviderImpl extends DataGridItemProviderImpl<Org> implements ReadyOrgItemProvider { static final String SCOPE_PATH = "scopePath"; @Inject private ScopeDAO scopeDAO; @Inject private OrgDAO orgDao; @Inject private CriteriaQuery<OrgDO> criteriaQuery; @Inject private MappingService mappingService; @Inject private ServiceContext serviceContext; private Long scopeId; @Override public Collection<Org> getPage(DataGrid<Org> grid) { Criteria criteria = createCriteria(grid, "SHOW_ALL"); ScopeDO scope; criteriaQuery.setFullTextSearchColumns(new String[] { "code", "name" }); StringBuilder sb = new StringBuilder(); if (grid.getFilters().get("SHOW_ALL").isEmpty()) { scope = scopeDAO.getScopeForOrgParts(scopeId); sb.append("select org.* "); sb.append("from org "); sb.append("join org_tree tree on org.org_id = tree.org_id "); sb.append("join org_part op on op.org_id = org.org_id "); sb.append("join org_type ot on ot.org_type_id = org.org_type_id "); sb.append("where op.scope_id = :scopeId "); sb.append("and tree.ancestor_org_id = :orgId "); sb.append("and ot.allow_device = 1 "); criteriaQuery.setBaseSubSelect(sb.toString()); } else { scope = scopeDAO.getScopeForOrgs(scopeId); if (scope == null) { throw new IllegalStateException("The scope selected does not support organizations."); } sb.append("SELECT org.* "); sb.append("FROM org "); sb.append("JOIN org_tree tree ON org.org_id = tree.org_id "); sb.append("WHERE org.scope_id = :scopeId AND tree.ancestor_org_id = :orgId "); criteriaQuery.setBaseSubSelect(sb.toString()); } criteria.getParameters().put("scopeId", scope.getScopeId()); criteria.getParameters().put("orgId", serviceContext.getOrgId()); QueryResult<OrgDO> result = criteriaQuery.getData(criteria, OrgDO.class); setTotalNumberOfItems(result.getTotalRowCount()); Collection<OrgDO> orgDOList = result.getRows(); return mappingService.getMapper().mapAsList(orgDOList, Org.class); } protected Map<String, String> convertToMap(OrgDO org) { Map<String, String> map = mappingService.map(org).getAsMap(); map.put("orgTypeName", org.getOrgType().getName()); map.put("hasDevices", String.valueOf(org.getOrgType().isAllowDevice())); if (org.getParentOrg() != null) { map.put("parentOrgName", org.getParentOrg().getName()); } return map; } @Override public void setScope(Long scopeId) { this.scopeId = scopeId; } @Override public Org getObjectForKey(String rowKey) { Long orgId = Long.valueOf(rowKey); OrgDO org = orgDao.getById(orgId); return mappingService.getMapper().map(org, Org.class); } }