package org.ovirt.engine.ui.uicommonweb.models.clusters;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterServerService;
import org.ovirt.engine.core.common.businessentities.gluster.ServiceType;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.help.HelpTag;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
public class ClusterServiceModel extends EntityModel<Cluster> {
private ListModel<VDS> hostList;
public ListModel<VDS> getHostList() {
return hostList;
}
public void setHostList(ListModel<VDS> hostList) {
this.hostList = hostList;
}
private ListModel<ServiceType> serviceTypeList;
public ListModel<ServiceType> getServiceTypeList() {
return serviceTypeList;
}
public void setServiceTypeList(ListModel<ServiceType> serviceTypeList) {
this.serviceTypeList = serviceTypeList;
}
private ListModel<EntityModel<GlusterServerService>> serviceList;
public ListModel<EntityModel<GlusterServerService>> getServiceList() {
return serviceList;
}
public void setServiceList(ListModel<EntityModel<GlusterServerService>> serviceList) {
this.serviceList = serviceList;
}
private List<GlusterServerService> actualServiceList;
public List<GlusterServerService> getActualServiceList() {
return actualServiceList;
}
public void setActualServiceList(List<GlusterServerService> actualServiceList) {
this.actualServiceList = actualServiceList;
}
private UICommand filterServicesCommand;
public UICommand getFilterServicesCommand() {
return filterServicesCommand;
}
private void setFilterServicesCommand(UICommand value) {
filterServicesCommand = value;
}
private UICommand clearFilterServicesCommand;
public UICommand getClearFilterServicesCommand() {
return clearFilterServicesCommand;
}
private void setClearFilterServicesCommand(UICommand value) {
clearFilterServicesCommand = value;
}
public ClusterServiceModel() {
setTitle(ConstantsManager.getInstance().getConstants().servicesTitle());
setHelpTag(HelpTag.services);
setHashName("services"); //$NON-NLS-1$
setActualServiceList(new ArrayList<GlusterServerService>());
setServiceList(new ListModel<EntityModel<GlusterServerService>>());
setHostList(new ListModel<VDS>());
setServiceTypeList(new ListModel<ServiceType>());
updateServiceTypeList();
setFilterServicesCommand(new UICommand("FilterServices", this)); //$NON-NLS-1$
setClearFilterServicesCommand(new UICommand("ClearFilterServices", this)); //$NON-NLS-1$
}
@Override
protected void onEntityChanged() {
super.onEntityChanged();
if (getEntity() != null) {
updateServiceList();
updateHostList();
}
}
private void updateHostList() {
boolean refreshNeeded = false;
List<VDS> hostList = (List<VDS>) getHostList().getItems();
if (hostList != null && hostList.size() > 1) {
for(VDS vds : hostList) {
if (vds != null && !vds.getClusterName().equals(getEntity().getName())) {
refreshNeeded = true;
break;
}
}
}
else {
refreshNeeded = true;
}
if (!refreshNeeded) {
return;
}
updateServiceTypeList();
AsyncDataProvider.getInstance().getHostListByCluster(new AsyncQuery<>(hosts -> {
hosts.add(0, null);
getHostList().setItems(hosts);
}), getEntity().getName());
}
private void updateServiceTypeList() {
ArrayList<ServiceType> serviceTypes = new ArrayList<>();
serviceTypes.add(null);
serviceTypes.add(ServiceType.NFS);
serviceTypes.add(ServiceType.SHD);
getServiceTypeList().setItems(serviceTypes);
}
private void updateServiceList() {
AsyncDataProvider.getInstance().getClusterGlusterServices(new AsyncQuery<>(details -> {
if (details.getServiceInfo() != null) {
setActualServiceList(details.getServiceInfo());
}
else {
setActualServiceList(new ArrayList<GlusterServerService>());
}
filterServices();
}), getEntity().getId());
}
private void filterServices() {
VDS selectedVds = hostList.getSelectedItem();
ServiceType serviceType = serviceTypeList.getSelectedItem();
ArrayList<EntityModel<GlusterServerService>> list = new ArrayList<>();
List<GlusterServerService> serviceList = new ArrayList<>(getActualServiceList());
Collections.sort(serviceList,
Comparator.comparing(GlusterServerService::getHostName)
.thenComparing(g -> g.getServiceType().toString()));
for (GlusterServerService service : serviceList) {
if ((selectedVds == null || service.getHostName().equals(selectedVds.getHostName()))
&& (serviceType == null || service.getServiceType() == serviceType)) {
list.add(new EntityModel<>(service));
}
}
getServiceList().setItems(list);
}
private void clearFilters() {
getHostList().setSelectedItem(null);
getServiceTypeList().setSelectedItem(null);
filterServices();
}
@Override
public void executeCommand(UICommand command) {
super.executeCommand(command);
if (command == getFilterServicesCommand()) {
filterServices();
}
else if (command == getClearFilterServicesCommand()) {
clearFilters();
}
}
}