Alexander Wels has uploaded a new change for review.

Change subject: webadmin: System refresh when needed
......................................................................

webadmin: System refresh when needed

- With the new synchronized refresh the system tree
  was not being refreshed for instance when adding a network.
  This patch fixes that issue.

Change-Id: I062163b1f6d2e5fcfd1539b69a3d0d2cee674654
Signed-off-by: Alexander Wels <[email protected]>
---
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ServerCpu.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SearchableListModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeItemModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/SystemTreeModelProvider.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/tree/SystemTree.java
6 files changed, 253 insertions(+), 26 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/61/26161/1

diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ServerCpu.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ServerCpu.java
index 01b2fc4..049a595 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ServerCpu.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ServerCpu.java
@@ -62,4 +62,39 @@
     public ArchitectureType getArchitecture() {
         return privateArchitecture;
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((privateArchitecture == null) ? 0 : 
privateArchitecture.hashCode());
+        result = prime * result + ((privateCpuName == null) ? 0 : 
privateCpuName.hashCode());
+        result = prime * result + ((privateFlags == null) ? 0 : 
privateFlags.hashCode());
+        result = prime * result + privateLevel;
+        result = prime * result + ((privateVdsVerbData == null) ? 0 : 
privateVdsVerbData.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        ServerCpu other = (ServerCpu) obj;
+        return (privateArchitecture.equals(other.privateArchitecture)
+                && ((privateCpuName != null && 
privateCpuName.equals(other.privateCpuName))
+                        || privateCpuName == other.privateCpuName) // The null 
== null case.
+                && ((privateFlags != null && 
privateFlags.equals(other.privateFlags))
+                        || privateFlags == other.privateFlags) // The null == 
null case.
+                && privateLevel == other.privateLevel
+                && ((privateVdsVerbData != null && 
privateVdsVerbData.equals(other.privateVdsVerbData))
+                        || privateVdsVerbData == other.privateVdsVerbData)); 
// The null == null case.
+    }
+
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SearchableListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SearchableListModel.java
index fe27f60..db59182 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SearchableListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SearchableListModel.java
@@ -790,25 +790,7 @@
 
                 if (newItems != null)
                 {
-                    for (T newItem : newItems)
-                    {
-                        // Search for selected item
-                        if (((IVdcQueryable) 
newItem).getQueryableId().equals(((IVdcQueryable) 
lastSelectedItem).getQueryableId()))
-                        {
-                            newSelectedItem = newItem;
-                        }
-                        else
-                        {
-                            // Search for selected items
-                            for (T item : lastSelectedItems)
-                            {
-                                if (((IVdcQueryable) 
newItem).getQueryableId().equals(((IVdcQueryable) item).getQueryableId()))
-                                {
-                                    selectedItems.add(newItem);
-                                }
-                            }
-                        }
-                    }
+                    newSelectedItem = determineSelectedItems(newItems, 
lastSelectedItem, lastSelectedItems);
                 }
                 if (newSelectedItem != null)
                 {
@@ -822,6 +804,25 @@
             }
             onSelectedItemChanged();
         }
+    }
+
+    protected T determineSelectedItems(List<T> newItems, T lastSelectedItem, 
List<T> lastSelectedItems) {
+        T newSelectedItem = null;
+        for (T newItem : newItems) {
+            // Search for selected item
+            if (((IVdcQueryable) 
newItem).getQueryableId().equals(((IVdcQueryable) 
lastSelectedItem).getQueryableId())) {
+                newSelectedItem = newItem;
+            } else {
+                // Search for selected items
+                for (T item : lastSelectedItems) {
+                    if (((IVdcQueryable) 
newItem).getQueryableId().equals(((IVdcQueryable) item)
+                            .getQueryableId())) {
+                        selectedItems.add(newItem);
+                    }
+                }
+            }
+        }
+        return newSelectedItem;
     }
 
     public void syncSearch(VdcQueryType vdcQueryType, VdcQueryParametersBase 
vdcQueryParametersBase)
@@ -971,6 +972,10 @@
         return true;
     }
 
+    protected boolean refreshOnInactiveTimer() {
+        return false;
+    }
+
     @Override
     protected void registerHandlers() {
         // Register to listen for operation complete events.
@@ -978,7 +983,7 @@
                 new RefreshActiveModelHandler() {
             @Override
             public void onRefreshActiveModel(RefreshActiveModelEvent event) {
-                if (getTimer().isActive()) { // Only if we are active should 
we refresh.
+                if (getTimer().isActive() || refreshOnInactiveTimer()) { // 
Only if we are active should we refresh.
                     if (handleRefreshActiveModel(event)) {
                         syncSearch();
                     }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeItemModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeItemModel.java
index 1f6960c..3e3cdcb 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeItemModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeItemModel.java
@@ -36,6 +36,7 @@
 
     private List<SystemTreeItemModel> privateChildren;
 
+    @Override
     public List<SystemTreeItemModel> getChildren()
     {
         return privateChildren;
@@ -55,6 +56,7 @@
 
     private SystemTreeItemModel privateParent;
 
+    @Override
     public SystemTreeItemModel getParent()
     {
         return privateParent;
@@ -88,7 +90,7 @@
 
     public static SystemTreeItemModel findAncestor(SystemTreeItemType type, 
SystemTreeItemModel root)
     {
-        if (root.getType() != type)
+        if (root != null && root.getType() != type)
         {
             if (root.getParent() != null)
             {
@@ -101,4 +103,39 @@
         return root;
     }
 
+    @Override
+    public boolean equals(Object other) {
+        if (other == this) {
+            return true;
+        }
+        if (other == null || other.getClass() != getClass()) {
+            return false;
+        }
+        SystemTreeItemModel otherModel = (SystemTreeItemModel) other;
+        if (getChildren().size() > 0) {
+            if (otherModel.getChildren().size() == getChildren().size()) {
+                boolean result = true;
+                for (int i = 0; i < getChildren().size(); i++) {
+                    result = 
getChildren().get(i).equals(otherModel.getChildren().get(i));
+                    if (!result) {
+                        break;
+                    }
+                }
+                return result;
+            } else {
+                return false;
+            }
+        } else {
+            if (otherModel.getEntity() != null && 
otherModel.getEntity().equals(getEntity())
+                    && otherModel.getTitle().equals(getTitle())) {
+                return true;
+            }
+            return false;
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return super.hashCode();
+    }
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java
index 7651eff..306c103 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java
@@ -2,6 +2,7 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -34,10 +35,12 @@
 import org.ovirt.engine.ui.uicompat.IFrontendMultipleQueryAsyncCallback;
 import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
 
-public class SystemTreeModel extends SearchableListModel implements 
IFrontendMultipleQueryAsyncCallback {
+public class SystemTreeModel extends SearchableListModel<SystemTreeItemModel> 
implements IFrontendMultipleQueryAsyncCallback {
 
     public static final EventDefinition resetRequestedEventDefinition;
+    public static final EventDefinition beforeItemsChangedEventDefinition;
     private Event privateResetRequestedEvent;
+    private Event privateBeforeItemsChangedEvent;
 
     public Event getResetRequestedEvent()
     {
@@ -47,6 +50,16 @@
     private void setResetRequestedEvent(Event value)
     {
         privateResetRequestedEvent = value;
+    }
+
+    public Event getBeforeItemsChangedEvent()
+    {
+        return privateBeforeItemsChangedEvent;
+    }
+
+    private void setBeforeItemsChangedEvent(Event value)
+    {
+        privateBeforeItemsChangedEvent = value;
     }
 
     private UICommand privateResetCommand;
@@ -89,6 +102,12 @@
     public ArrayList<SystemTreeItemModel> getItems()
     {
         return (ArrayList<SystemTreeItemModel>) super.getItems();
+    }
+
+    @Override
+    public void setItems(Collection<SystemTreeItemModel> value) {
+        getBeforeItemsChangedEvent().raise(this, EventArgs.EMPTY);
+        super.setItems(value);
     }
 
     public void setItems(ArrayList<SystemTreeItemModel> value)
@@ -180,11 +199,14 @@
     static
     {
         resetRequestedEventDefinition = new EventDefinition("ResetRequested", 
SystemTreeModel.class); //$NON-NLS-1$
+        beforeItemsChangedEventDefinition = new 
EventDefinition("BeforeItemsChanged", //$NON-NLS-1$
+                SystemTreeModel.class);
     }
 
     public SystemTreeModel()
     {
         setResetRequestedEvent(new Event(resetRequestedEventDefinition));
+        setBeforeItemsChangedEvent(new 
Event(beforeItemsChangedEventDefinition));
 
         setResetCommand(new UICommand("Reset", this)); //$NON-NLS-1$
         setExpandAllCommand(new UICommand("ExpandAll", this)); //$NON-NLS-1$
@@ -605,7 +627,49 @@
         if 
(!ApplicationModeHelper.getUiMode().equals(ApplicationMode.AllModes)) {
             ApplicationModeHelper.filterSystemTreeByApplictionMode(systemItem);
         }
-        setItems(new ArrayList<SystemTreeItemModel>(Arrays.asList(new 
SystemTreeItemModel[] { systemItem })));
+        List<SystemTreeItemModel> newItems = new 
ArrayList<SystemTreeItemModel>(Arrays.asList(new SystemTreeItemModel[] { 
systemItem }));
+        if(!newItems.equals(items)) {
+            setItems(newItems);
+        }
+    }
+
+    @Override
+    protected SystemTreeItemModel 
determineSelectedItems(List<SystemTreeItemModel> newItems,
+            SystemTreeItemModel lastSelectedItem, List<SystemTreeItemModel> 
lastSelectedItems) {
+        SystemTreeItemModel newSelectedItem = null;
+        for (SystemTreeItemModel newItem : newItems) {
+            newSelectedItem = findNode(newItem, lastSelectedItem);
+            // Search for selected item
+            if (newSelectedItem == null) {
+                // Search for selected items
+                for (SystemTreeItemModel item : lastSelectedItems) {
+                    if (newItem.equals(item)) {
+                        selectedItems.add(newItem);
+                    }
+                }
+            }
+        }
+        return newSelectedItem;
+    }
+
+    public SystemTreeItemModel findNode(SystemTreeItemModel root, 
SystemTreeItemModel match) {
+        SystemTreeItemModel result = null;
+        if (root != null && match != null) {
+            if (root.getEntity() != null && 
root.getEntity().equals(match.getEntity())
+                    && root.getTitle().equals(match.getTitle())) {
+                result = root; //match found.
+            } else {
+                if (root.getChildren().size() > 0) {
+                    for (int i = 0; i < root.getChildren().size(); i++) {
+                        result = findNode(root.getChildren().get(i), match);
+                        if (result != null) {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        return result;
     }
 
     @Override
@@ -613,4 +677,8 @@
         return "SystemTreeModel"; //$NON-NLS-1$
     }
 
+    @Override
+    protected boolean refreshOnInactiveTimer() {
+        return true;
+    }
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/SystemTreeModelProvider.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/SystemTreeModelProvider.java
index b69f6dd..5fa381f 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/SystemTreeModelProvider.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/SystemTreeModelProvider.java
@@ -80,7 +80,7 @@
         // Update data provider only for non-empty data
         if (!items.isEmpty()) {
             super.updateDataProvider(items);
-            selectionModel.setSelected(items.get(0), true);
+            selectionModel.setSelected(getModel().getSelectedItem(), true);
         }
     }
 
@@ -107,7 +107,17 @@
 
     @Override
     public void setSelectedItems(List<SystemTreeItemModel> items) {
-        getModel().setSelectedItem(items.size() > 0 ? items.get(0) : null);
+        if (items.size() > 0) {
+            SystemTreeItemModel selectedItem = null;
+            if (getModel().getSelectedItem() != null) {
+                selectedItem = getModel().findNode(items.get(0), 
getModel().getSelectedItem());
+            } else {
+                selectedItem = items.get(0);
+            }
+            getModel().setSelectedItem(selectedItem);
+        } else {
+            getModel().setSelectedItem(null);
+        }
     }
 
     @Override
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/tree/SystemTree.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/tree/SystemTree.java
index 80b6fae..2ad6d31 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/tree/SystemTree.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/tree/SystemTree.java
@@ -1,8 +1,10 @@
 package org.ovirt.engine.ui.webadmin.widget.tree;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.ListIterator;
+import java.util.Map;
 
 import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
 import org.ovirt.engine.ui.common.widget.action.AbstractActionStackPanelItem;
@@ -21,6 +23,8 @@
 import org.ovirt.engine.ui.webadmin.widget.action.WebAdminButtonDefinition;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.user.cellview.client.CellTable;
 import com.google.gwt.user.cellview.client.CellTree;
@@ -35,6 +39,8 @@
 
     private static final int ALL_LEVELS = Integer.MAX_VALUE;
     private static final int ITEM_LEVEL = 3;
+
+    protected final Map<Object, Map<String, Boolean>> nodeStateMap = new 
HashMap<Object, Map<String, Boolean>>();
 
     interface WidgetUiBinder extends UiBinder<Widget, SystemTree> {
         WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
@@ -97,7 +103,16 @@
         treeModel.getItemsChangedEvent().addListener(new IEventListener() {
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
-                expandTree(getDataDisplayWidget().getRootTreeNode(), 
ITEM_LEVEL);
+                if (modelProvider.getModel().getSelectedItem() == null) {
+                    expandTree(getDataDisplayWidget().getRootTreeNode(), 
ITEM_LEVEL);
+                } else {
+                    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+                        @Override
+                        public void execute() {
+                            
expandPathUsingMap(getDataDisplayWidget().getRootTreeNode(), nodeStateMap);
+                        }
+                    });
+                }
             }
         });
         treeModel.getSelectedItemChangedEvent().addListener(new 
IEventListener() {
@@ -106,6 +121,63 @@
                 
expandPath(modelProvider.getSelectionModel().getSelectedObject());
             }
         });
+        treeModel.getBeforeItemsChangedEvent().addListener(new 
IEventListener() {
+            @Override
+            public void eventRaised(Event ev, Object sender, EventArgs args) {
+                //Empty the state map so we can capture the new state.
+                nodeStateMap.clear();
+                getNodeOpenMap(getDataDisplayWidget().getRootTreeNode(), 
nodeStateMap );
+            }
+        });
+    }
+
+    /**
+     * This method captures the current expansion state of the tree before it 
gets refreshed.
+     * @param treeNode The root node to capture.
+     * @param expandedStateMap The map to store the state in.
+     */
+    private void getNodeOpenMap(TreeNode treeNode, Map<Object, Map<String, 
Boolean>> expandedStateMap) {
+        if (treeNode == null) {
+            return;
+        }
+        for (int i = 0; i < treeNode.getChildCount(); i++) {
+            if (treeNode.getChildValue(i) != null) {
+                Object entity = ((SystemTreeItemModel) 
treeNode.getChildValue(i)).getEntity();
+                Map<String, Boolean> entityStringMap = 
expandedStateMap.get(entity);
+                if (entityStringMap == null) {
+                    entityStringMap = new HashMap<String, Boolean>();
+                    expandedStateMap.put(entity, entityStringMap);
+                }
+                entityStringMap.put(((SystemTreeItemModel) 
treeNode.getChildValue(i)).getTitle(),
+                        treeNode.isChildOpen(i));
+            }
+            // This gets the child node, but doesn't change the open status 
(there's no other way to get the child).
+            getNodeOpenMap(treeNode.setChildOpen(i, treeNode.isChildOpen(i)), 
expandedStateMap);
+        }
+    }
+
+    /**
+     * This method expands the system tree based on the state in the passed in 
map. The map is key
+     * on both entity and title of the node as several nodes will have the 
same entity but will have different
+     * titles.
+     * @param rootNode The root node to expand.
+     * @param expandedStateMap The map that contains the expansion state.
+     */
+    private void expandPathUsingMap(TreeNode rootNode, Map<Object, Map<String, 
Boolean>> expandedStateMap) {
+        if (rootNode == null) {
+            return;
+        }
+        for (int i = 0; i < rootNode.getChildCount(); i++) {
+            Boolean expandNode = false;
+            Map<String, Boolean> entityStringMap =
+                    
expandedStateMap.get(((SystemTreeItemModel)rootNode.getChildValue(i)).getEntity());
+            if (entityStringMap != null) {
+                expandNode = 
entityStringMap.get(((SystemTreeItemModel)rootNode.getChildValue(i)).getTitle());
+            }
+            if (expandNode != null && expandNode) {
+                expandPathUsingMap(rootNode.setChildOpen(i, expandNode), 
expandedStateMap);
+            }
+        }
     }
 
     @Override


-- 
To view, visit http://gerrit.ovirt.org/26161
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I062163b1f6d2e5fcfd1539b69a3d0d2cee674654
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Alexander Wels <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to