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

Reply via email to