package org.dcache.webadmin.controller.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.dcache.webadmin.controller.PoolAdminService;
import org.dcache.webadmin.controller.exceptions.PoolAdminServiceException;
import org.dcache.webadmin.controller.util.NamedCellUtil;
import org.dcache.webadmin.model.businessobjects.CellResponse;
import org.dcache.webadmin.model.businessobjects.Pool;
import org.dcache.webadmin.model.dataaccess.DAOFactory;
import org.dcache.webadmin.model.dataaccess.DomainsDAO;
import org.dcache.webadmin.model.dataaccess.PoolsDAO;
import org.dcache.webadmin.model.exceptions.DAOException;
import org.dcache.webadmin.view.beans.PoolAdminBean;
import org.dcache.webadmin.view.beans.PoolCommandBean;
import org.dcache.webadmin.view.util.SelectableWrapper;
/**
*
* @author jans
*/
public class StandardPoolAdminService implements PoolAdminService {
private static final Logger _log = LoggerFactory.getLogger(
StandardPoolAdminService.class);
private DAOFactory _daoFactory;
public StandardPoolAdminService(DAOFactory daoFactory) {
_daoFactory = daoFactory;
}
@Override
public List<PoolAdminBean> getPoolGroups() throws PoolAdminServiceException {
try {
Set<String> poolGroups = getPoolsDAO().getPoolGroupNames();
Map<String, List<String>> domainMap = getDomainsDAO().getDomainsMap();
List<PoolAdminBean> adminBeans = new ArrayList<>();
for (String currentPoolGroup : poolGroups) {
PoolAdminBean newAdmin = createPoolAdminBean(
currentPoolGroup, domainMap);
adminBeans.add(newAdmin);
}
return adminBeans;
} catch (DAOException e) {
throw new PoolAdminServiceException(e);
}
}
private DomainsDAO getDomainsDAO() {
return _daoFactory.getDomainsDAO();
}
private PoolsDAO getPoolsDAO() {
return _daoFactory.getPoolsDAO();
}
public void setDAOFactory(DAOFactory daoFactory) {
_daoFactory = daoFactory;
}
private PoolAdminBean createPoolAdminBean(String currentPoolGroup,
Map<String, List<String>> domainMap) throws DAOException {
PoolAdminBean newAdmin = new PoolAdminBean(currentPoolGroup);
List<SelectableWrapper<PoolCommandBean>> groupPools =
new ArrayList<>();
for (Pool currentPool : getPoolsDAO().getPoolsOfPoolGroup(currentPoolGroup)) {
groupPools.add(new SelectableWrapper<>(
createPoolCommandBean(currentPool, domainMap)));
}
newAdmin.setPools(groupPools);
return newAdmin;
}
private PoolCommandBean createPoolCommandBean(Pool currentPool,
Map<String, List<String>> domainMap) {
PoolCommandBean groupPool = new PoolCommandBean();
groupPool.setName(currentPool.getName());
groupPool.setDomain(NamedCellUtil.findDomainOfUniqueCell(domainMap,
currentPool.getName()));
return groupPool;
}
@Override
public void sendCommand(
List<SelectableWrapper<PoolCommandBean>> pools, String command)
throws PoolAdminServiceException {
Set<String> poolIds = getSelectedPools(pools);
_log.debug("Sending commnd {} to following pools {}", command, poolIds);
try {
Set<CellResponse> responses = getDomainsDAO().sendCommand(poolIds, command);
for (SelectableWrapper<PoolCommandBean> pool : pools) {
clearResponse(pool);
for (CellResponse response : responses) {
if (pool.getWrapped().getName().equals(response.getCellName())) {
pool.getWrapped().setResponse(response.getResponse());
}
}
}
} catch (DAOException e) {
throw new PoolAdminServiceException(e);
}
}
private Set<String> getSelectedPools(List<SelectableWrapper<PoolCommandBean>> pools) {
Set<String> poolIds = new HashSet<>();
for (SelectableWrapper<PoolCommandBean> pool : pools) {
if (pool.isSelected()) {
poolIds.add(pool.getWrapped().getName());
}
}
return poolIds;
}
private void clearResponse(SelectableWrapper<PoolCommandBean> pool) {
pool.getWrapped().setResponse("");
}
}