package org.ovirt.engine.ui.uicommonweb.models.bookmarks; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.ovirt.engine.core.common.action.BookmarksOperationParameters; import org.ovirt.engine.core.common.action.BookmarksParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.Bookmark; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; 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.AsyncCallback; 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.ConfirmationModel; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.Event; import org.ovirt.engine.ui.uicompat.EventArgs; import org.ovirt.engine.ui.uicompat.EventDefinition; import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback; @SuppressWarnings("unused") public class BookmarkListModel extends SearchableListModel { private static class BookmarksComparator implements Comparator<Bookmark>, Serializable { @Override public int compare(Bookmark o1, Bookmark o2) { String name1 = o1.getName(); String name2 = o2.getName(); if (name1 == null || name2 == null) { throw new IllegalArgumentException("Bookmark name cannot be null"); //$NON-NLS-1$ } return name1.compareTo(name2); } } private static final BookmarksComparator COMPARATOR = new BookmarksComparator(); public static final EventDefinition navigatedEventDefinition; public static final EventDefinition savedEventDefinition; private Event<EventArgs> privateNavigatedEvent; public Event<EventArgs> getNavigatedEvent() { return privateNavigatedEvent; } private void setNavigatedEvent(Event<EventArgs> value) { privateNavigatedEvent = value; } private UICommand privateNewCommand; public UICommand getNewCommand() { return privateNewCommand; } private void setNewCommand(UICommand value) { privateNewCommand = value; } private UICommand privateEditCommand; @Override public UICommand getEditCommand() { return privateEditCommand; } private void setEditCommand(UICommand value) { privateEditCommand = value; } private UICommand privateRemoveCommand; public UICommand getRemoveCommand() { return privateRemoveCommand; } private void setRemoveCommand(UICommand value) { privateRemoveCommand = value; } private boolean privateIsBookmarkInitiated; public boolean getIsBookmarkInitiated() { return privateIsBookmarkInitiated; } private void setIsBookmarkInitiated(boolean value) { privateIsBookmarkInitiated = value; } private Event<EventArgs> privateItemSavedEvent; public Event<EventArgs> getItemSavedEvent() { return privateItemSavedEvent; } private void setItemSavedEvent(Event<EventArgs> value) { privateItemSavedEvent = value; } static { navigatedEventDefinition = new EventDefinition("Navigated", BookmarkListModel.class); //$NON-NLS-1$ savedEventDefinition = new EventDefinition("Saved", BookmarkListModel.class); //$NON-NLS-1$ } public BookmarkListModel() { setNavigatedEvent(new Event<>(navigatedEventDefinition)); setItemSavedEvent(new Event<>(savedEventDefinition)); setNewCommand(new UICommand("New", this)); //$NON-NLS-1$ setEditCommand(new UICommand("Edit", this)); //$NON-NLS-1$ setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$ setIsTimerDisabled(true); updateActionAvailability(); } public void executeBookmarksSearch() { setIsBookmarkInitiated(true); getSearchCommand().execute(); setIsBookmarkInitiated(false); } @Override protected void syncSearch() { super.syncSearch(); Frontend.getInstance().runQuery(VdcQueryType.GetAllBookmarks, new VdcQueryParametersBase(), new AsyncQuery<>((AsyncCallback<VdcQueryReturnValue>) returnValue -> { List<Bookmark> resultList = returnValue.getReturnValue(); if (resultList != null) { Collections.sort(resultList, COMPARATOR); } // Prevent bookmark list updates from clearing selected bookmark setIsBookmarkInitiated(true); setItems(resultList); setIsBookmarkInitiated(false); })); } public void remove() { if (getWindow() != null) { return; } ConfirmationModel model = new ConfirmationModel(); setWindow(model); model.setTitle(ConstantsManager.getInstance().getConstants().removeBookmarksTitle()); model.setHelpTag(HelpTag.remove_bookmark); model.setHashName("remove_bookmark"); //$NON-NLS-1$ ArrayList<String> list = new ArrayList<>(); for (Object item : getSelectedItems()) { org.ovirt.engine.core.common.businessentities.Bookmark i = (org.ovirt.engine.core.common.businessentities.Bookmark) item; list.add(i.getName()); } model.setItems(list); UICommand tempVar = UICommand.createDefaultOkUiCommand("OnRemove", this); //$NON-NLS-1$ model.getCommands().add(tempVar); UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$ model.getCommands().add(tempVar2); } public void onRemove() { Bookmark selectedBookmark = (Bookmark) getSelectedItem(); BookmarksParametersBase parameters = new BookmarksParametersBase(selectedBookmark.getId()); IFrontendActionAsyncCallback async = result -> postOnSave(result.getReturnValue()); getWindow().startProgress(); Frontend.getInstance().runAction(VdcActionType.RemoveBookmark, parameters, async); } public void edit() { org.ovirt.engine.core.common.businessentities.Bookmark bookmark = (org.ovirt.engine.core.common.businessentities.Bookmark) getSelectedItem(); if (getWindow() != null) { return; } BookmarkModel model = new BookmarkModel(); setWindow(model); model.setTitle(ConstantsManager.getInstance().getConstants().editBookmarkTitle()); model.setHelpTag(HelpTag.edit_bookmark); model.setHashName("edit_bookmark"); //$NON-NLS-1$ model.setIsNew(false); model.getName().setEntity(bookmark.getName()); model.getSearchString().setEntity(bookmark.getValue()); UICommand tempVar = UICommand.createDefaultOkUiCommand("OnSave", this); //$NON-NLS-1$ model.getCommands().add(tempVar); UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$ model.getCommands().add(tempVar2); } public void newEntity() { if (getWindow() != null) { return; } BookmarkModel model = new BookmarkModel(); setWindow(model); model.setTitle(ConstantsManager.getInstance().getConstants().newBookmarkTitle()); model.setHelpTag(HelpTag.new_bookmark); model.setHashName("new_bookmark"); //$NON-NLS-1$ model.setIsNew(true); model.getSearchString().setEntity(getSearchString()); UICommand tempVar = UICommand.createDefaultOkUiCommand("OnSave", this); //$NON-NLS-1$ model.getCommands().add(tempVar); UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$ model.getCommands().add(tempVar2); } public void onSave() { BookmarkModel model = (BookmarkModel) getWindow(); if (model.getProgress() != null) { return; } if (!model.validate()) { return; } org.ovirt.engine.core.common.businessentities.Bookmark tempVar = new org.ovirt.engine.core.common.businessentities.Bookmark(); tempVar.setId(model.getIsNew() ? Guid.Empty : ((org.ovirt.engine.core.common.businessentities.Bookmark) getSelectedItem()).getId()); tempVar.setName(model.getName().getEntity()); tempVar.setValue(model.getSearchString().getEntity()); org.ovirt.engine.core.common.businessentities.Bookmark bookmark = tempVar; model.startProgress(); Frontend.getInstance().runAction(model.getIsNew() ? VdcActionType.AddBookmark : VdcActionType.UpdateBookmark, new BookmarksOperationParameters(bookmark), result -> { BookmarkListModel localModel = (BookmarkListModel) result.getState(); localModel.postOnSave(result.getReturnValue()); }, this); } public void postOnSave(VdcReturnValueBase returnValue) { getWindow().stopProgress(); if (returnValue != null && returnValue.getSucceeded()) { cancel(); //Refresh the bookmarks. getSearchCommand().execute(); } privateItemSavedEvent.raise(this, EventArgs.EMPTY); } public void cancel() { setWindow(null); } @Override protected void onSelectedItemChanged() { super.onSelectedItemChanged(); updateActionAvailability(); if (getSelectedItem() != null && !getIsBookmarkInitiated()) { // Don't fire navigation events in response to the bookmark list updating itself setIsBookmarkInitiated(true); getNavigatedEvent().raise(this, new BookmarkEventArgs((org.ovirt.engine.core.common.businessentities.Bookmark) getSelectedItem())); setIsBookmarkInitiated(false); } } @Override protected void selectedItemsChanged() { super.selectedItemsChanged(); updateActionAvailability(); } private void updateActionAvailability() { getEditCommand().setIsExecutionAllowed(getSelectedItems() != null && getSelectedItems().size() == 1); getRemoveCommand().setIsExecutionAllowed(getSelectedItems() != null && getSelectedItems().size() > 0); } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if (command == getNewCommand()) { newEntity(); } else if (command == getEditCommand()) { edit(); } else if (command == getRemoveCommand()) { remove(); } else if ("OnRemove".equals(command.getName())) { //$NON-NLS-1$ onRemove(); } else if ("OnSave".equals(command.getName())) { //$NON-NLS-1$ onSave(); } else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$ cancel(); } } @Override protected String getListName() { return "BookmarkListModel"; //$NON-NLS-1$ } }