package net.techreadiness.plugin.action.device;
import java.util.ArrayList;
import java.util.Collection;
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.DeviceDAO;
import net.techreadiness.persistence.domain.DeviceDO;
import net.techreadiness.service.common.DataGrid;
import net.techreadiness.service.common.DataGridItemProviderImpl;
import net.techreadiness.service.common.SelectableItemProvider;
import net.techreadiness.service.object.Device;
import net.techreadiness.service.object.Org;
import net.techreadiness.service.object.mapping.MappingService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
public interface DeviceByOrgItemProvider extends SelectableItemProvider<Device> {
void setOrg(Org org);
void setDoNotDisplayText(String text);
}
@Component
@Transactional
class DeviceByOrgItemProviderImpl extends DataGridItemProviderImpl<Device> implements DeviceByOrgItemProvider {
private Org org;
private String doNotDisplayText = "";
private int numDevices;
@Inject
private DeviceDAO deviceDao;
@Inject
private MappingService mappingService;
@Inject
CriteriaQuery<DeviceDO> criteriaQuery;
@Override
public Collection<Device> getPage(DataGrid<Device> grid) {
if (StringUtils.isNotBlank(doNotDisplayText)) {
throw new IllegalStateException(doNotDisplayText);
}
Criteria criteria = createCriteria(grid, "blank");
criteriaQuery.setFullTextSearchColumns(new String[] { "location", "name" });
StringBuilder sb = new StringBuilder();
sb.append("SELECT d.* ");
sb.append("FROM device d ");
sb.append("join org o on o.org_id = d.org_id ");
sb.append("join org_tree tree on o.org_id = tree.org_id ");
sb.append("where tree.ancestor_org_id = :orgId ");
criteriaQuery.setBaseSubSelect(sb.toString());
criteria.getParameters().put("orgId", org.getOrgId());
QueryResult<DeviceDO> result = criteriaQuery.getData(criteria, DeviceDO.class);
numDevices = result.getTotalRowCount();
Collection<DeviceDO> devices = result.getRows();
Collection<Device> deviceMaps = new ArrayList<>();
for (DeviceDO deviceDO : devices) {
deviceMaps.add(mappingService.getMapper().map(deviceDO, Device.class));
}
return deviceMaps;
}
@Override
public int getTotalNumberOfItems(DataGrid<Device> grid) {
return numDevices;
}
@Override
public void setOrg(Org org) {
this.org = org;
}
@Override
public void setDoNotDisplayText(String text) {
doNotDisplayText = text;
}
@Override
public Device getObjectForKey(String rowKey) {
Long deviceId = Long.valueOf(rowKey);
DeviceDO device = deviceDao.getById(deviceId);
return mappingService.getMapper().map(device, Device.class);
}
}