package org.ovirt.engine.ui.uicommonweb.models.networks; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.List; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.network.NetworkView; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.common.utils.PairQueryable; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.help.HelpTag; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.HostSetupNetworksModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; import org.ovirt.engine.ui.uicompat.external.StringUtils; public class NetworkHostListModel extends SearchableListModel<NetworkView, PairQueryable<VdsNetworkInterface, VDS>> { private UICommand setupNetworksCommand; private NetworkHostFilter viewFilterType; private Collection<VdsNetworkInterface> attachedByLabelInterfaces; public NetworkHostListModel() { setTitle(ConstantsManager.getInstance().getConstants().hostsTitle()); setHelpTag(HelpTag.hosts); setHashName("hosts"); //$NON-NLS-1$ setComparator( Comparator.comparing((PairQueryable<VdsNetworkInterface, VDS> p) -> p.getSecond() .getClusterName()).thenComparing(p -> p.getSecond().getName())); setSetupNetworksCommand(new UICommand("SetupNetworks", this)); //$NON-NLS-1$ updateActionAvailability(); } @Override protected void onEntityChanged() { super.onEntityChanged(); getSearchCommand().execute(); } @Override public void search() { if (getEntity() != null) { super.search(); } } @Override protected void syncSearch() { if (getEntity() == null) { return; } final NetworkHostFilter filter = getViewFilterType(); AsyncQuery<VdcQueryReturnValue> asyncQuery = new AsyncQuery<>(returnValue -> { if (filter.equals(getViewFilterType())) { final Iterable returnList = returnValue.getReturnValue(); if (NetworkHostFilter.unattached.equals(getViewFilterType())) { final List<PairQueryable<VdsNetworkInterface, VDS>> items = new ArrayList<>(); for (Object obj : returnList) { items.add(new PairQueryable<VdsNetworkInterface, VDS>(null, (VDS) obj)); } setItems(items); } else if (NetworkHostFilter.attached.equals(getViewFilterType())) { initAttachedInterfaces((Collection<PairQueryable<VdsNetworkInterface, VDS>>) returnList); } } }); IdQueryParameters params = new IdQueryParameters(getEntity().getId()); params.setRefresh(getIsQueryFirstTime()); if (NetworkHostFilter.unattached.equals(getViewFilterType())) { Frontend.getInstance().runQuery(VdcQueryType.GetVdsWithoutNetwork, params, asyncQuery); } else if (NetworkHostFilter.attached.equals(getViewFilterType())) { Frontend.getInstance().runQuery(VdcQueryType.GetVdsAndNetworkInterfacesByNetworkId, params, asyncQuery); } setIsQueryFirstTime(false); } private void initAttachedInterfaces(final Collection<PairQueryable<VdsNetworkInterface, VDS>> items) { if (getEntity() == null || StringUtils.isEmpty(getEntity().getLabel()) || items == null || items.isEmpty()) { setItems(items); return; } final NetworkHostFilter filter = getViewFilterType(); IdQueryParameters params = new IdQueryParameters(getEntity().getId()); params.setRefresh(false); Frontend.getInstance().runQuery(VdcQueryType.GetInterfacesByLabelForNetwork, params, new AsyncQuery<VdcQueryReturnValue>(returnValueObj -> { if (!filter.equals(getViewFilterType())) { return; } attachedByLabelInterfaces = returnValueObj.getReturnValue(); setItems(items); })); } public Boolean isInterfaceAttachedByLabel(VdsNetworkInterface iface) { return attachedByLabelInterfaces != null && attachedByLabelInterfaces.contains(iface); } public void setupNetworks() { if (getWindow() != null) { return; } HostSetupNetworksModel setupNetworksWindowModel = new HostSetupNetworksModel(this, getSelectedItem().getSecond()); setWindow(setupNetworksWindowModel); } @Override protected void entityPropertyChanged(Object sender, PropertyChangedEventArgs e) { super.entityPropertyChanged(sender, e); if (e.propertyName.equals("name")) { //$NON-NLS-1$ getSearchCommand().execute(); } } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if (command == getSetupNetworksCommand()) { setupNetworks(); } } private void updateActionAvailability() { Collection<PairQueryable<VdsNetworkInterface, VDS>> selectedItems = getSelectedItems() != null ? getSelectedItems() : new ArrayList(); getSetupNetworksCommand().setIsExecutionAllowed(selectedItems.size() == 1); } @Override protected void onSelectedItemChanged() { super.onSelectedItemChanged(); updateActionAvailability(); } @Override protected void selectedItemsChanged() { super.selectedItemsChanged(); updateActionAvailability(); } public UICommand getSetupNetworksCommand() { return setupNetworksCommand; } private void setSetupNetworksCommand(UICommand value) { setupNetworksCommand = value; } public NetworkHostFilter getViewFilterType() { return viewFilterType; } public void setViewFilterType(NetworkHostFilter viewFilterType) { this.viewFilterType = viewFilterType; search(); } @Override protected String getListName() { return "NetworkHostListModel"; //$NON-NLS-1$ } }