package org.ovirt.engine.ui.uicommonweb;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.ovirt.engine.core.common.businessentities.AuditLog;
import org.ovirt.engine.core.common.businessentities.BusinessEntity;
import org.ovirt.engine.core.common.businessentities.Identifiable;
import org.ovirt.engine.core.common.businessentities.MacPool;
import org.ovirt.engine.core.common.businessentities.Nameable;
import org.ovirt.engine.core.common.businessentities.Provider;
import org.ovirt.engine.core.common.businessentities.ServerCpu;
import org.ovirt.engine.core.common.businessentities.Snapshot;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.businessentities.aaa.DbUser;
import org.ovirt.engine.core.common.businessentities.comparators.LexoNumericComparator;
import org.ovirt.engine.core.common.businessentities.comparators.LexoNumericNameableComparator;
import org.ovirt.engine.core.common.businessentities.gluster.StorageDevice;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.VnicProfileView;
import org.ovirt.engine.core.common.businessentities.storage.Disk;
import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.StringHelper;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.storage.LunModel;
import org.ovirt.engine.ui.uicommonweb.models.storage.SanTargetModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.LatestVmTemplate;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateWithVersion;
import org.ovirt.engine.ui.uicommonweb.models.vms.DataCenterWithCluster;
import org.ovirt.engine.ui.uicommonweb.models.vms.DiskModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.TimeZoneModel;
public final class Linq {
public static final Comparator<AuditLog> AuditLogComparer = Comparator.comparing(AuditLog::getAuditLogId);
public static final Comparator<? super Identifiable> IdentifiableComparator =
Comparator.nullsFirst(Comparator.comparing(Identifiable::getValue));
public static final Comparator<StorageDevice> StorageDeviceComparer =
Comparator.comparing(StorageDevice::getCanCreateBrick).reversed()
.thenComparing(StorageDevice::getName);
public static final Comparator<Snapshot> SnapshotByCreationDateCommparer =
Comparator.comparing(Snapshot::getCreationDate);
public static final Comparator<VnicProfileView> VnicProfileViewComparator =
Comparator.comparing((VnicProfileView v) -> v == VnicProfileView.EMPTY).reversed()
.thenComparing(VnicProfileView::getNetworkName, new LexoNumericComparator())
.thenComparing(new LexoNumericNameableComparator<>());
public static final Comparator<MacPool> SharedMacPoolComparator =
Comparator.comparing(MacPool::isDefaultPool).reversed()
.thenComparing(new LexoNumericNameableComparator<>());
public static boolean isDataActiveStorageDomain(StorageDomain storageDomain) {
boolean isData = storageDomain.getStorageDomainType().isDataDomain();
boolean isActive = storageDomain.getStatus() == StorageDomainStatus.Active;
return isData && isActive;
}
public static <TSource> TSource firstOrNull(Collection<TSource> source) {
return firstOrNull(source, x -> true);
}
public static <TSource> TSource firstOrNull(Collection<TSource> source, Predicate<? super TSource> predicate) {
return firstOrDefault(source, predicate, null);
}
public static <TSource> TSource firstOrDefault(Collection<TSource> source, Predicate<? super TSource> predicate,
TSource defaultValue) {
return Optional.ofNullable(source)
.orElse(Collections.emptyList())
.stream()
.filter(predicate)
.findFirst()
.orElse(defaultValue);
}
public static <TSource> List<TSource> where(Collection<TSource> source, Predicate<? super TSource> predicate) {
return source.stream().filter(predicate).collect(Collectors.toList());
}
public static List<StorageDomain> getStorageDomainsByIds(List<Guid> storageIds,
List<StorageDomain> storageDomains) {
return where(storageDomains, new IdsPredicate<>(storageIds));
}
public static List<DiskModel> filterDisksByType(List<DiskModel> diskModels, DiskStorageType type) {
return where(diskModels, m -> m.getDisk().getDiskStorageType() == type);
}
public static <I, T extends I> T findByType(Collection<I> models, Class<T> specific) {
return models.stream().filter(m -> m.getClass().equals(specific)).findFirst().map(m -> (T)m).orElse(null);
}
public static Collection<EntityModel<?>> findSelectedItems(Collection<EntityModel<?>> items) {
if (items == null) {
return Collections.emptyList();
}
return where(items, EntityModel::getIsSelected);
}
public static Set<String> getDiskAliases(List<? extends Disk> disks) {
return disks.stream().map(Disk::getDiskAlias).collect(Collectors.toSet());
}
public static class TimeZonePredicate implements Predicate<TimeZoneModel> {
private final String timeZone;
public TimeZonePredicate(String timeZone) {
this.timeZone = timeZone;
}
@Override
public boolean test(TimeZoneModel source) {
return Objects.equals(source.getTimeZoneKey(), timeZone);
}
}
public static class ServerCpuPredicate implements Predicate<ServerCpu> {
private final String cpuName;
public ServerCpuPredicate(String cpuName) {
this.cpuName = cpuName;
}
@Override
public boolean test(ServerCpu source) {
return Objects.equals(source.getCpuName(), cpuName);
}
}
public static class DataCenterWithClusterAccordingClusterPredicate implements Predicate<DataCenterWithCluster> {
private IdPredicate<Guid> idPredicate;
public DataCenterWithClusterAccordingClusterPredicate(Guid clusterId) {
this.idPredicate = new IdPredicate<>(clusterId);
}
@Override
public boolean test(DataCenterWithCluster source) {
return idPredicate.test(source.getCluster());
}
}
public static class DataCenterWithClusterPredicate implements Predicate<DataCenterWithCluster> {
private final Guid dataCenterId;
private final Guid clusterId;
public DataCenterWithClusterPredicate(Guid dataCenterId, Guid clusterId) {
this.dataCenterId = dataCenterId;
this.clusterId = clusterId;
}
@Override
public boolean test(DataCenterWithCluster source) {
return source.getDataCenter() != null &&
source.getCluster() != null &&
source.getDataCenter().getId().equals(dataCenterId) &&
source.getCluster().getId().equals(clusterId);
}
}
public static class DataCenterStatusPredicate implements Predicate<StoragePool> {
private StoragePoolStatus status = StoragePoolStatus.values()[0];
public DataCenterStatusPredicate(StoragePoolStatus status) {
this.status = status;
}
@Override
public boolean test(StoragePool source) {
return source.getStatus() == status;
}
}
public static class HostStatusPredicate implements Predicate<VDS> {
private VDSStatus status = VDSStatus.values()[0];
public HostStatusPredicate(VDSStatus status) {
this.status = status;
}
@Override
public boolean test(VDS source) {
return source.getStatus().equals(status);
}
}
public static class TemplateWithVersionPredicate implements Predicate<TemplateWithVersion> {
protected final Guid id;
protected boolean useLatest;
public TemplateWithVersionPredicate(Guid id, boolean useLatest) {
this.id = id;
this.useLatest = useLatest;
}
@Override
public boolean test(TemplateWithVersion templateWithVersion) {
if (useLatest) {
return templateWithVersion.getTemplateVersion() instanceof LatestVmTemplate;
} else {
return id.equals(templateWithVersion.getTemplateVersion().getId())
&& !(templateWithVersion.getTemplateVersion() instanceof LatestVmTemplate);
}
}
}
public static class TemplateWithVersionPredicateForNewVm extends TemplateWithVersionPredicate {
public TemplateWithVersionPredicateForNewVm(Guid id, boolean useLatest) {
super(id, useLatest);
}
@Override
public boolean test(TemplateWithVersion templateWithVersion) {
if (useLatest) {
return id.equals(templateWithVersion.getTemplateVersion().getId())
&& templateWithVersion.getTemplateVersion() instanceof LatestVmTemplate;
} else {
return id.equals(templateWithVersion.getTemplateVersion().getId())
&& !(templateWithVersion.getTemplateVersion() instanceof LatestVmTemplate);
}
}
}
public static class IdPredicate<T extends Serializable> implements Predicate<BusinessEntity<T>> {
private T id;
public IdPredicate(T id) {
this.id = id;
}
@Override
public boolean test(BusinessEntity<T> entity) {
return entity != null && Objects.equals(entity.getId(), id);
}
}
public static class IdsPredicate<T extends Serializable> implements Predicate<BusinessEntity<T>> {
private Set<T> ids;
public IdsPredicate(Collection<T> ids) {
this.ids = new HashSet<>(ids);
}
@Override
public boolean test(BusinessEntity<T> entity) {
return ids.contains(entity.getId());
}
}
public static class NamePredicate implements Predicate<Nameable> {
private final String name;
public NamePredicate(String name) {
this.name = name;
}
@Override
public boolean test(Nameable entity) {
return Objects.equals(name, entity.getName());
}
}
public static class LunPredicate implements Predicate<LunModel> {
private final LunModel lun;
public LunPredicate(LunModel lun) {
this.lun = lun;
}
@Override
public boolean test(LunModel source) {
return Objects.equals(source.getLunId(), lun.getLunId());
}
}
public static class TargetPredicate implements Predicate<SanTargetModel> {
private final SanTargetModel target;
public TargetPredicate(SanTargetModel target) {
this.target = target;
}
@Override
public boolean test(SanTargetModel source) {
return Objects.equals(source.getName(), target.getName())
&& Objects.equals(source.getAddress(), target.getAddress())
&& Objects.equals(source.getPort(), target.getPort());
}
}
public static class DbUserPredicate implements Predicate<DbUser> {
private final DbUser target;
public DbUserPredicate(DbUser target) {
this.target = target;
}
@Override
public boolean test(DbUser source) {
String targetName = target.getLoginName();
if (!StringHelper.isNullOrEmpty(targetName)) {
targetName = targetName.toLowerCase();
}
return Objects.equals(source.getDomain(), target.getDomain())
&& (StringHelper.isNullOrEmpty(target.getLoginName())
|| "*".equals(target.getLoginName()) //$NON-NLS-1$
|| source.getLoginName().toLowerCase().startsWith(targetName));
}
}
public static class NetworkSameProviderPredicate implements Predicate<Provider<?>> {
private final Network network;
public NetworkSameProviderPredicate(Network network) {
this.network = network;
}
@Override
public boolean test(Provider<?> provider) {
return network.isExternal() && provider.getId().equals(network.getProvidedBy().getProviderId());
}
}
public static Collection<StorageDomain> filterStorageDomainsByStorageType(
Collection<StorageDomain> source, final StorageType storageType) {
return where(source, sd -> sd.getStorageType() == storageType);
}
public static Collection<StorageDomain> filterStorageDomainById(
Collection<StorageDomain> source, final Guid id) {
return where(source, new IdPredicate<>(id));
}
}