package org.ovirt.engine.ui.uicommonweb.models.profiles; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.ovirt.engine.core.common.businessentities.BusinessEntity; import org.ovirt.engine.core.common.businessentities.profiles.ProfileBase; import org.ovirt.engine.core.common.businessentities.qos.QosBase; import org.ovirt.engine.core.common.businessentities.qos.QosType; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.QosQueryParameterBase; 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.HasEntity; import org.ovirt.engine.ui.uicommonweb.models.ListWithSimpleDetailsModel; import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionListModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; import com.google.inject.Inject; public abstract class ProfileListModel<P extends ProfileBase, Q extends QosBase, R extends BusinessEntity<Guid>> extends ListWithSimpleDetailsModel<R, P> { private UICommand newCommand; private UICommand editCommand; private UICommand removeCommand; private Map<Guid, Q> qosMap; final PermissionListModel<P> permissionListModel; @Inject public ProfileListModel(final PermissionListModel<P> permissionListModel) { this.permissionListModel = permissionListModel; setDetailList(); setTitle(ConstantsManager.getInstance().getConstants().diskProfilesTitle()); setHelpTag(HelpTag.disk_profiles); setHashName("disk_profiles"); //$NON-NLS-1$ setNewCommand(new UICommand("New", this)); //$NON-NLS-1$ setEditCommand(new UICommand("Edit", this)); //$NON-NLS-1$ setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$ updateActionAvailability(); } private void setDetailList() { List<HasEntity<P>> list = new ArrayList<>(); list.add(permissionListModel); setDetailModels(list); } protected abstract ProfileBaseModel<P, Q, R> getNewProfileModel(); protected abstract ProfileBaseModel<P, Q, R> getEditProfileModel(); protected abstract RemoveProfileModel<P> getRemoveProfileModel(); protected abstract QosType getQosType(); protected abstract Guid getStoragePoolId(); protected abstract VdcQueryType getQueryType(); public void newProfile() { if (getWindow() != null) { return; } ProfileBaseModel<P, Q, R> model = getNewProfileModel(); setWindow(model); initProfileParentList(model); } public void edit() { if (getWindow() != null) { return; } ProfileBaseModel<P, Q, R> model = getEditProfileModel(); setWindow(model); initProfileParentList(model); } public void remove() { if (getWindow() != null) { return; } RemoveProfileModel<P> model = getRemoveProfileModel(); setWindow(model); } private void initProfileParentList(ProfileBaseModel<P, Q, R> model) { model.getParentListModel().setItems(Arrays.<R> asList(getEntity())); model.getParentListModel().setSelectedItem(getEntity()); model.getParentListModel().setIsChangeable(false); } public void cancel() { setWindow(null); } @Override protected void onEntityChanged() { super.onEntityChanged(); if (getEntity() != null) { getSearchCommand().execute(); } updateActionAvailability(); } @Override public void search() { if (getEntity() != null) { super.search(); } } @Override protected void syncSearch() { if (getEntity() == null) { return; } Guid dcId = getStoragePoolId(); if (dcId == null) { // not attached to data center fetchProfiles(); } else { Frontend.getInstance().runQuery(VdcQueryType.GetAllQosByStoragePoolIdAndType, new QosQueryParameterBase(dcId, getQosType()), new AsyncQuery<VdcQueryReturnValue>(returnValue -> { List<Q> qosList = (ArrayList<Q>) returnValue.getReturnValue(); qosMap = new HashMap<>(); if (qosList != null) { for (Q qos : qosList) { qosMap.put(qos.getId(), qos); } } fetchProfiles(); })); } } private void fetchProfiles() { if (getEntity() == null) { return; } Frontend.getInstance().runQuery(getQueryType(), new IdQueryParameters(getEntity().getId()), new AsyncQuery<VdcQueryReturnValue>(returnValue -> setItems((List<P>) returnValue.getReturnValue()))); } @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() { R parentEntity = getEntity(); getNewCommand().setIsExecutionAllowed(parentEntity != null); getEditCommand().setIsExecutionAllowed(getSelectedItems() != null && getSelectedItems().size() == 1); getRemoveCommand().setIsExecutionAllowed(getSelectedItems() != null && getSelectedItems().size() > 0); } @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()) { newProfile(); } else if (command == getEditCommand()) { edit(); } else if (command == getRemoveCommand()) { remove(); } else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$ cancel(); } } public UICommand getNewCommand() { return newCommand; } private void setNewCommand(UICommand value) { newCommand = value; } @Override public UICommand getEditCommand() { return editCommand; } private void setEditCommand(UICommand value) { editCommand = value; } public UICommand getRemoveCommand() { return removeCommand; } private void setRemoveCommand(UICommand value) { removeCommand = value; } public Q getQos(Guid qosId) { return qosMap.get(qosId); } public PermissionListModel<P> getPermissionListModel() { return permissionListModel; } }