package org.ovirt.engine.ui.uicommonweb.models.networks; import org.ovirt.engine.core.common.businessentities.OpenstackNetworkProviderProperties; import org.ovirt.engine.core.common.businessentities.Provider; import org.ovirt.engine.core.common.businessentities.comparators.NameableComparator; import org.ovirt.engine.core.common.businessentities.network.ExternalSubnet; import org.ovirt.engine.core.common.businessentities.network.NetworkView; 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.compat.Guid; 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.providers.NewExternalSubnetModel; import org.ovirt.engine.ui.uicommonweb.models.vms.RemoveExternalSubnetModel; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; public class NetworkExternalSubnetListModel extends SearchableListModel<NetworkView, ExternalSubnet> { private UICommand newCommand; private UICommand removeCommand; private boolean isExecutionAllowed; public NetworkExternalSubnetListModel() { setHelpTag(HelpTag.external_subnets); setHashName("external_subnets"); //$NON-NLS-1$ setComparator(new NameableComparator()); setNewCommand(new UICommand("New", this)); //$NON-NLS-1$ setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$ updateActionAvailability(); } public UICommand getNewCommand() { return newCommand; } private void setNewCommand(UICommand newCommand) { this.newCommand = newCommand; } public UICommand getRemoveCommand() { return removeCommand; } private void setRemoveCommand(UICommand value) { removeCommand = value; } public void newSubnet() { if (getWindow() != null) { return; } NewExternalSubnetModel model = new NewExternalSubnetModel(getEntity(), this); setWindow(model); } @SuppressWarnings("unchecked") public void remove() { if (getWindow() != null) { return; } RemoveExternalSubnetModel model = new RemoveExternalSubnetModel(this, getSelectedItems()); setWindow(model); } @Override protected void onEntityChanged() { super.onEntityChanged(); if (getEntity() != null) { getSearchCommand().execute(); adjustActionButtonsForNetworkReadOnlyProperty(); } } @Override protected void syncSearch() { if (getEntity() == null) { return; } super.syncSearch(VdcQueryType.GetExternalSubnetsOnProviderByNetwork, new IdQueryParameters(getEntity().getId())); } private void adjustActionButtonsForNetworkReadOnlyProperty(){ NetworkView networkView = getEntity(); if (!networkView.isExternal()) { setCommandExecutionAllowed(true); return; } Guid providerGuid = networkView.getProvidedBy().getProviderId(); Frontend.getInstance().runQuery(VdcQueryType.GetProviderById, new IdQueryParameters(providerGuid), createProviderReadOnlyCallback()); } private AsyncQuery<VdcQueryReturnValue> createProviderReadOnlyCallback(){ return new AsyncQuery<>(returnValue -> setCommandExecutionAllowedForProvider((Provider) (returnValue.getReturnValue()))); } private void setCommandExecutionAllowedForProvider(Provider provider){ OpenstackNetworkProviderProperties properties = (OpenstackNetworkProviderProperties) provider.getAdditionalProperties(); if (properties != null && properties.getReadOnly()){ setCommandExecutionAllowed(false); return; } setCommandExecutionAllowed(true); } private void setCommandExecutionAllowed(boolean isAllowed){ isExecutionAllowed = isAllowed; updateActionAvailability(); } @Override protected void entityPropertyChanged(Object sender, PropertyChangedEventArgs e) { super.entityPropertyChanged(sender, e); if (e.propertyName.equals("name")) { //$NON-NLS-1$ getSearchCommand().execute(); } } private void updateActionAvailability() { newCommand.setIsExecutionAllowed(isExecutionAllowed); getRemoveCommand().setIsExecutionAllowed(getSelectedItems() != null && getSelectedItems().size() > 0 && isExecutionAllowed); } @Override protected void onSelectedItemChanged() { super.onSelectedItemChanged(); updateActionAvailability(); } @Override protected void selectedItemsChanged() { super.selectedItemsChanged(); updateActionAvailability(); } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if (command == getNewCommand()) { newSubnet(); } else if (command == getRemoveCommand()) { remove(); } } @Override protected String getListName() { return "NetworkExternalSubnetListModel"; //$NON-NLS-1$ } }