package org.dcache.webadmin.controller.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import diskCacheV111.poolManager.PoolPreferenceLevel;
import diskCacheV111.poolManager.PoolSelectionUnit.DirectionType;
import diskCacheV111.poolManager.PoolSelectionUnit.SelectionEntity;
import diskCacheV111.poolManager.PoolSelectionUnit.SelectionLink;
import diskCacheV111.poolManager.PoolSelectionUnit.SelectionPool;
import diskCacheV111.poolManager.PoolSelectionUnit.SelectionPoolGroup;
import diskCacheV111.poolManager.PoolSelectionUnit.SelectionUnit;
import diskCacheV111.poolManager.PoolSelectionUnit.SelectionUnitGroup;
import org.dcache.poolmanager.Partition;
import org.dcache.webadmin.controller.PoolSelectionSetupService;
import org.dcache.webadmin.controller.exceptions.PoolSelectionSetupServiceException;
import org.dcache.webadmin.controller.util.BeanDataMapper;
import org.dcache.webadmin.model.businessobjects.Pool;
import org.dcache.webadmin.model.dataaccess.DAOFactory;
import org.dcache.webadmin.model.dataaccess.PoolsDAO;
import org.dcache.webadmin.model.exceptions.DAOException;
import org.dcache.webadmin.view.pages.poolselectionsetup.beans.DCacheEntityContainerBean;
import org.dcache.webadmin.view.pages.poolselectionsetup.beans.EntityReference;
import org.dcache.webadmin.view.pages.poolselectionsetup.beans.EntityType;
import org.dcache.webadmin.view.pages.poolselectionsetup.beans.IORequest;
import org.dcache.webadmin.view.pages.poolselectionsetup.beans.LinkEntity;
import org.dcache.webadmin.view.pages.poolselectionsetup.beans.MatchBean;
import org.dcache.webadmin.view.pages.poolselectionsetup.beans.PartitionsBean;
import org.dcache.webadmin.view.pages.poolselectionsetup.beans.PoolEntity;
import org.dcache.webadmin.view.pages.poolselectionsetup.beans.PoolGroupEntity;
import org.dcache.webadmin.view.pages.poolselectionsetup.beans.UGroupEntity;
import org.dcache.webadmin.view.pages.poolselectionsetup.beans.UnitEntity;
import org.dcache.webadmin.view.pages.poolselectionsetup.panels.simulatediorequest.IoDirections;
/**
*
* @author jans
*/
public class StandardPoolSelectionSetupService implements PoolSelectionSetupService {
private static final Logger _log = LoggerFactory.getLogger(StandardPoolSelectionSetupService.class);
private DAOFactory _daoFactory;
public StandardPoolSelectionSetupService(DAOFactory daoFactory) {
_daoFactory = daoFactory;
}
@Override
public List<PartitionsBean> getPartitions() throws PoolSelectionSetupServiceException {
try {
Map<String, Partition> partitions = getPoolsDAO().getPartitions();
return createPartitionBeans(partitions);
} catch (DAOException ex) {
throw new PoolSelectionSetupServiceException("could not retrive selection data", ex);
}
}
@Override
public DCacheEntityContainerBean getEntityContainer() throws PoolSelectionSetupServiceException {
DCacheEntityContainerBean container = new DCacheEntityContainerBean();
try {
container.setPoolGroups(createContainerPoolGroupsFromDAO(
getPoolsDAO().getPoolGroups()));
container.setUnitGroups(createContainerUnitGroupsFromDAO(
getPoolsDAO().getUnitGroups()));
container.setUnits(createContainerUnitsFromDAO(getPoolsDAO().getUnits()));
container.setLinks(createContainerLinksFromDAO(getPoolsDAO().getLinks()));
container.setPools(createContainerPoolsFromDAO(getPoolsDAO().getPools()));
} catch (DAOException ex) {
throw new PoolSelectionSetupServiceException("could not retrive selection data", ex);
}
return container;
}
private Collection<SelectionPool> extractSelectionPools(Set<Pool> pools) {
Collection<SelectionPool> returnPools = new ArrayList<>();
for (Pool pool : pools) {
returnPools.add(pool.getSelectionPool());
}
return returnPools;
}
private List<EntityReference> createReferencesOfType(Collection<? extends SelectionEntity> referenceSources,
EntityType type) {
List<EntityReference> references = new ArrayList<>();
for (SelectionEntity source : referenceSources) {
EntityReference newReference = new EntityReference(source.getName(), type);
references.add(newReference);
}
return references;
}
private Collection<PoolGroupEntity> createContainerPoolGroupsFromDAO(
Collection<SelectionPoolGroup> poolGroups) throws DAOException {
Collection<PoolGroupEntity> entites = new HashSet<>();
for (SelectionPoolGroup group : poolGroups) {
PoolGroupEntity entity = new PoolGroupEntity();
entity.setName(group.getName());
entity.setPoolMembers(createReferencesOfType(
extractSelectionPools(getPoolsDAO().getPoolsOfPoolGroup(group.getName())),
EntityType.POOL));
entity.setLinksTargetingUs(createReferencesOfType(
getPoolsDAO().getLinksPointingToPoolGroup(group.getName()),
EntityType.LINK));
entites.add(entity);
}
return entites;
}
private Collection<UGroupEntity> createContainerUnitGroupsFromDAO(Collection<SelectionUnitGroup> unitGroups)
{
Collection<UGroupEntity> entites = new HashSet<>();
for (SelectionUnitGroup unitGroup : unitGroups) {
UGroupEntity entity = new UGroupEntity();
entity.setName(unitGroup.getName());
entity.setUnits(createReferencesOfType(
unitGroup.getMemeberUnits(),
EntityType.UNIT));
entity.setLinks(createReferencesOfType(
unitGroup.getLinksPointingTo(),
EntityType.LINK));
entites.add(entity);
}
return entites;
}
private Collection<UnitEntity> createContainerUnitsFromDAO(Collection<SelectionUnit> units)
{
Collection<UnitEntity> entites = new HashSet<>();
for (SelectionUnit unit : units) {
UnitEntity entity = new UnitEntity();
entity.setName(unit.getName());
entity.setType(unit.getUnitType());
entity.setUnitGroups(createReferencesOfType(
unit.getMemberOfUnitGroups(),
EntityType.UNITGROUP));
entites.add(entity);
}
return entites;
}
private Collection<LinkEntity> createContainerLinksFromDAO(Collection<SelectionLink> links)
{
Collection<LinkEntity> entites = new HashSet<>();
for (SelectionLink link : links) {
LinkEntity entity = new LinkEntity();
entity.setName(link.getName());
entity.setP2pPreference(link.getPreferences().getP2pPref());
entity.setPartition(link.getTag());
entity.setPoolGroupsPointingTo(createReferencesOfType(
link.getPoolGroupsPointingTo(),
EntityType.POOLGROUP));
entity.setReadPreference(link.getPreferences().getReadPref());
entity.setRestorePreference(link.getPreferences().getRestorePref());
entity.setUnitGroupsFollowed(createReferencesOfType(
link.getUnitGroupsTargetedBy(),
EntityType.UNITGROUP));
entity.setWritePreference(link.getPreferences().getWritePref());
entites.add(entity);
}
return entites;
}
private Collection<PoolEntity> createContainerPoolsFromDAO(Set<Pool> pools) throws DAOException {
Collection<PoolEntity> entites = new HashSet<>();
for (Pool pool : pools) {
entites.add(mapPoolToEntity(pool));
}
return entites;
}
public void setDAOFactory(DAOFactory daoFactory) {
_daoFactory = daoFactory;
}
private PoolsDAO getPoolsDAO() {
return _daoFactory.getPoolsDAO();
}
private PoolEntity mapPoolToEntity(Pool pool) throws DAOException {
PoolEntity newEntity = new PoolEntity();
newEntity.setIsActive(pool.getSelectionPool().isActive());
newEntity.setIsEnabled(pool.getSelectionPool().isEnabled());
newEntity.setMode(pool.getSelectionPool().getPoolMode().toString());
newEntity.setName(pool.getName());
newEntity.setPoolGroupsBelongingTo(createReferencesOfType(
getPoolsDAO().getPoolGroupsOfPool(pool.getName()),
EntityType.POOLGROUP));
newEntity.setLinksTargetingUs(createReferencesOfType(
pool.getSelectionPool().getLinksTargetingPool(),
EntityType.LINK));
return newEntity;
}
@Override
public List<MatchBean> getMatchForIORequest(IORequest request)
throws PoolSelectionSetupServiceException {
try {
PoolPreferenceLevel[] preferences = getPoolsDAO().match(
mapIoDirectionsViewToModel(request.getType()),
request.getNetUnitName(), request.getProtocolUnitName(),
request.getStore(), request.getDcache(), request.getLinkGroupName());
List<MatchBean> matches = new ArrayList<>();
_log.debug("preferences: {}", preferences.length);
for (PoolPreferenceLevel preference : preferences) {
MatchBean match = new MatchBean(preference.getPoolList(), preference.getTag());
matches.add(match);
}
_log.debug("matches: {}", matches.size());
return matches;
} catch (DAOException ex) {
throw new PoolSelectionSetupServiceException("could not retrive selection data", ex);
}
}
private DirectionType mapIoDirectionsViewToModel(IoDirections direction) {
switch (direction) {
case READ:
return DirectionType.READ;
case WRITE:
return DirectionType.WRITE;
case P2P:
return DirectionType.P2P;
case CACHE:
return DirectionType.CACHE;
default:
throw new RuntimeException("IoDirection unknown " + direction);
}
}
private List<PartitionsBean> createPartitionBeans(Map<String, Partition> partitions) {
List<PartitionsBean> partitionBeans = new ArrayList<>();
for (String name : partitions.keySet()) {
partitionBeans.add(BeanDataMapper.partitionModelToView(name, partitions.get(name)));
}
return partitionBeans;
}
}