package org.ovirt.engine.core.bll; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import javax.inject.Inject; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.host.provider.HostProviderProxy; import org.ovirt.engine.core.bll.provider.ProviderProxyFactory; import org.ovirt.engine.core.common.businessentities.Provider; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.queries.GetHostListFromExternalProviderParameters; import org.ovirt.engine.core.dao.VdsDao; import org.ovirt.engine.core.dao.provider.ProviderDao; public class GetHostListFromExternalProviderQuery<P extends GetHostListFromExternalProviderParameters> extends QueriesCommandBase<P> { @Inject private ProviderDao providerDao; @Inject private VdsDao vdsDao; public GetHostListFromExternalProviderQuery(P parameters) { super(parameters); } @Override protected void executeQueryCommand() { Provider hostProvider = getProvider(); List<VDS> providerHosts = getProviderHosts(hostProvider, getParameters().getSearchFilter()); if (providerHosts != null && getParameters().isFilterOutExistingHosts()) { filterOutExistingHosts(providerHosts); } getQueryReturnValue().setReturnValue(providerHosts); } private void filterOutExistingHosts(List<VDS> hosts) { List<VDS> existingHosts = getExistingHosts(); Set<String> existingHostNames = hostNameSet(existingHosts); Iterator<VDS> hostIter = hosts.listIterator(); while (hostIter.hasNext()) { if (existingHostNames.contains(hostIter.next().getHostName())) { hostIter.remove(); } } } private Set<String> hostNameSet(List<VDS> hosts) { return hosts.stream().map(VDS::getHostName).collect(Collectors.toSet()); } protected List<VDS> getProviderHosts(Provider hostProvider, String searchFilter) { HostProviderProxy proxy = ProviderProxyFactory.getInstance().create(hostProvider); if (StringUtils.isEmpty(searchFilter)) { return proxy.getAll(); } else { return proxy.getFiltered(searchFilter); } } protected List<VDS> getExistingHosts() { return vdsDao.getAll(); } protected Provider getProvider() { return providerDao.get(getParameters().getProviderId()); } }