package net.techreadiness.customer.action.organization; 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 OrganizationItemProviderImpl extends DataGridItemProviderImpl<Org> implements OrganizationItemProvider { 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, ShowAllOrganizationsSelectionHandler.SHOW_ALL); ScopeDO scope; criteriaQuery.setFullTextSearchColumns(new String[] { "code", "name" }); StringBuilder sb = new StringBuilder(); if (grid.getFilters().get(ShowAllOrganizationsSelectionHandler.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("WHERE op.scope_id = :scopeId AND tree.ancestor_org_id = :orgId "); 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); } }