Gilad Chaplik has uploaded a new change for review. Change subject: userportal: Optimize basic view ......................................................................
userportal: Optimize basic view Currently for every refresh, the basic view (vm boxes view/television), is getting redrawn. In this fix, only the changed/added/removed boxes will be redrawn. Signed-off-by: Gilad Chaplik <gchap...@redhat.com> Change-Id: I17b92858345de398dbc89d9141468ccea67963fe --- M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalBasicListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalItemModel.java M frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicListItemPresenterWidget.java M frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicListPresenterWidget.java M frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/tab/basic/MainTabBasicListView.java 5 files changed, 147 insertions(+), 9 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/09/10509/1 diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalBasicListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalBasicListModel.java index fb4ae30..e244e81 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalBasicListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalBasicListModel.java @@ -3,6 +3,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.vm_pools; @@ -366,4 +368,59 @@ setWindow(null); } } + + public List<UserPortalItemModel> refreshItems(List<UserPortalItemModel> items, + List<UserPortalItemModel> currentItems, + List<UserPortalItemModel> removeItems) { + List<UserPortalItemModel> refreshItems = new ArrayList<UserPortalItemModel>(); + Map<Guid, UserPortalItemModel> itemsMap = toMap(items); + Map<Guid, UserPortalItemModel> currentItemsMap = toMap(currentItems); + List<UserPortalItemModel> newCurrentItems = new ArrayList<UserPortalItemModel>(); + for (Entry<Guid, UserPortalItemModel> entry : itemsMap.entrySet()) { + UserPortalItemModel value = currentItemsMap.get(entry.getKey()); + // added value || should be refreshed + if (value == null || shouldBeRefreshed(value, entry.getValue())) { + refreshItems.add(entry.getValue()); + } + newCurrentItems.add(entry.getValue()); + currentItemsMap.remove(entry.getKey()); + } + // add all removed items left in currItems + removeItems.addAll(currentItemsMap.values()); + + currentItems.clear(); + currentItems.addAll(newCurrentItems); + + return refreshItems; + } + + private boolean shouldBeRefreshed(UserPortalItemModel current, UserPortalItemModel newItem) { + if (current.getEntity() instanceof vm_pools) { + vm_pools currentPool = (vm_pools) current.getEntity(); + vm_pools newPool = (vm_pools) newItem.getEntity(); + if (current.getStatus() != newItem.getStatus()) { + return true; + } + + } else if (current.getEntity() instanceof VM) { + VM currentVm = (VM) current.getEntity(); + VM newVm = (VM) newItem.getEntity(); + if (currentVm.getStatus() != newVm.getStatus() || + !currentVm.getVmName().equals(newVm.getVmName())) { + return true; + } + } + + return false; + } + + private Map<Guid, UserPortalItemModel> toMap(List<UserPortalItemModel> items) { + Map<Guid, UserPortalItemModel> map = new HashMap<Guid, UserPortalItemModel>(); + if (items != null) { + for (UserPortalItemModel item : items) { + map.put(item.getId(), item); + } + } + return map; + } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalItemModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalItemModel.java index 38dfbb4..5611eaf 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalItemModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalItemModel.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.List; +import org.ovirt.engine.core.common.businessentities.IVdcQueryable; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmOsType; @@ -11,6 +12,7 @@ import org.ovirt.engine.core.common.businessentities.vm_pools; import org.ovirt.engine.core.compat.Event; import org.ovirt.engine.core.compat.EventArgs; +import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.PropertyChangedEventArgs; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.core.compat.Version; @@ -416,4 +418,8 @@ super.ExecuteCommand(command); behavior.ExecuteCommand(command); } + + public Guid getId() { + return (Guid)((IVdcQueryable)getEntity()).getQueryableId(); + } } diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicListItemPresenterWidget.java b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicListItemPresenterWidget.java index 26ab61f..28ab5f3 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicListItemPresenterWidget.java +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicListItemPresenterWidget.java @@ -68,6 +68,8 @@ private final ConsoleManager consoleManager; + private boolean visible; + @Inject public MainTabBasicListItemPresenterWidget(EventBus eventBus, ViewDef view, @@ -208,4 +210,18 @@ return sameEntity(listModel.getSelectedItem(), model); } + @Override + public int hashCode() { + return model.getId().hashCode(); + } + + public void setVisible(boolean visible) { + this.visible = visible; + } + + @Override + public boolean isVisible() { + return visible; + } + } diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicListPresenterWidget.java b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicListPresenterWidget.java index 3ca3a1f..e5275d5 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicListPresenterWidget.java +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicListPresenterWidget.java @@ -1,7 +1,11 @@ package org.ovirt.engine.ui.userportal.section.main.presenter.tab.basic; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.common.utils.ElementIdUtils; import org.ovirt.engine.ui.uicommonweb.models.userportal.UserPortalBasicListModel; import org.ovirt.engine.ui.uicommonweb.models.userportal.UserPortalItemModel; @@ -27,12 +31,18 @@ } + Map<Guid, MainTabBasicListItemPresenterWidget> presenterMap = new HashMap<Guid, MainTabBasicListItemPresenterWidget>(); + + List<UserPortalItemModel> currentItems = null; + @ContentSlot public static final Type<RevealContentHandler<?>> TYPE_VmListContent = new Type<RevealContentHandler<?>>(); private final Provider<MainTabBasicListItemPresenterWidget> basicVmPresenterWidgetProvider; private final UserPortalBasicListProvider modelProvider; + + public static int count; @Inject public MainTabBasicListPresenterWidget(EventBus eventBus, ViewDef view, @@ -51,20 +61,60 @@ @Override public void onDataChange(List<UserPortalItemModel> items) { - // TODO optimize - int vmIndex = 0; - getView().clear(); - for (UserPortalItemModel item : items) { - MainTabBasicListItemPresenterWidget basicVmPresenterWidget = basicVmPresenterWidgetProvider.get(); - basicVmPresenterWidget.getView().setElementId( - ElementIdUtils.createElementId(getView().getElementId(), "vm" + vmIndex++)); //$NON-NLS-1$ - basicVmPresenterWidget.setModel(item); + List<UserPortalItemModel> removeItems = new ArrayList<UserPortalItemModel>(); + List<UserPortalItemModel> refreshItems = null; + // first time + if(currentItems == null){ + currentItems = refreshItems = items; + } else { + refreshItems = modelProvider.getModel().refreshItems(items, currentItems, removeItems); + List<UserPortalItemModel> changedItems = new ArrayList<UserPortalItemModel>(refreshItems); + changedItems.addAll(removeItems); + + for (UserPortalItemModel changedItem : changedItems) { + MainTabBasicListItemPresenterWidget basicVmPresenterWidget = presenterMap.get(changedItem.getId()); + if(basicVmPresenterWidget == null) { + continue; // added item + } else { + presenterMap.remove(changedItem.getId()); + } + basicVmPresenterWidget.setVisible(true); + removeFromSlot(TYPE_VmListContent, basicVmPresenterWidget); + basicVmPresenterWidget.setVisible(false); + } + } + init(items, refreshItems); + } + + private void init(List<UserPortalItemModel> items, List<UserPortalItemModel> refreshItems) { + for (UserPortalItemModel item : refreshItems) { + MainTabBasicListItemPresenterWidget basicVmPresenterWidget = presenterMap.get(item.getId()); + if(basicVmPresenterWidget == null) { + basicVmPresenterWidget = basicVmPresenterWidgetProvider.get(); + basicVmPresenterWidget.getView().setElementId( + ElementIdUtils.createElementId(getView().getElementId(), item.getId().toString())); + basicVmPresenterWidget.setModel(item); + presenterMap.put(item.getId(), basicVmPresenterWidget); + } + basicVmPresenterWidget.setVisible(false); + setCount(item, items); addToSlot(TYPE_VmListContent, basicVmPresenterWidget); + basicVmPresenterWidget.setVisible(true); } selectDefault(modelProvider.getModel(), items); } + private void setCount(UserPortalItemModel item, List<UserPortalItemModel> items) { + for (int i = 0; i < items.size(); i++) { + if(item.getId().equals(items.get(i).getId())){ + count = i; + break; + } + + } + } + /** * When there is nothing selected, selects the first. When there is something selected, does nothing. */ diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/tab/basic/MainTabBasicListView.java b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/tab/basic/MainTabBasicListView.java index 4e66a51..c055fa3 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/tab/basic/MainTabBasicListView.java +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/tab/basic/MainTabBasicListView.java @@ -37,13 +37,22 @@ @Override public void addToSlot(Object slot, Widget content) { if (slot == MainTabBasicListPresenterWidget.TYPE_VmListContent) { - vmPanel.add(content); + vmPanel.insert(content, MainTabBasicListPresenterWidget.count); } else { super.addToSlot(slot, content); } } @Override + public void removeFromSlot(Object slot, Widget content) { + if (slot == MainTabBasicListPresenterWidget.TYPE_VmListContent) { + vmPanel.remove(content); + } else { + super.removeFromSlot(slot, content); + } + } + + @Override public void clear() { vmPanel.clear(); } -- To view, visit http://gerrit.ovirt.org/10509 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I17b92858345de398dbc89d9141468ccea67963fe Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Gilad Chaplik <gchap...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches