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
