Alexander Wels has uploaded a new change for review.

Change subject: webadmin: host tab sorting
......................................................................

webadmin: host tab sorting

- Implemented sorting in hosts main tab
- Implemented sorting in hosts sub tabs.
  - Did NOT implement sort on Host Network Interfaces tab.

Change-Id: Icf32960b4ad0c2510da2895f86950455766b5237
Signed-off-by: Alexander Wels <[email protected]>
---
M 
backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/VdsConditionFieldAutoCompleter.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/SafeHtmlColumn.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/comparators/VMComparator.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostListModel.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabHostView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostHookView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostVmView.java
7 files changed, 176 insertions(+), 42 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/76/28376/1

diff --git 
a/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/VdsConditionFieldAutoCompleter.java
 
b/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/VdsConditionFieldAutoCompleter.java
index d9c9e7f..5708d57 100644
--- 
a/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/VdsConditionFieldAutoCompleter.java
+++ 
b/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/VdsConditionFieldAutoCompleter.java
@@ -8,77 +8,87 @@
 import org.ovirt.engine.core.common.businessentities.VDSStatus;
 
 public class VdsConditionFieldAutoCompleter extends 
BaseConditionFieldAutoCompleter {
+    public static final String NAME = "NAME";
+    public static final String ADDRESS = "ADDRESS";
+    public static final String CLUSTER = "CLUSTER";
+    public static final String DATACENTER = "DATACENTER";
+    public static final String STATUS = "STATUS";
+    public static final String ACTIVE_VMS = "ACTIVE_VMS";
+    public static final String MEM_USAGE = "MEM_USAGE";
+    public static final String CPU_USAGE = "CPU_USAGE";
+    public static final String NETWORK_USAGE = "NETWORK_USAGE";
+
     public VdsConditionFieldAutoCompleter() {
         super();
-        mVerbs.add("NAME");
+        mVerbs.add(NAME);
         mVerbs.add("COMMENT");
-        mVerbs.add("STATUS");
-        mVerbs.add("CLUSTER");
-        mVerbs.add("ADDRESS");
-        mVerbs.add("CPU_USAGE");
-        mVerbs.add("MEM_USAGE");
-        mVerbs.add("NETWORK_USAGE");
+        mVerbs.add(STATUS);
+        mVerbs.add(CLUSTER);
+        mVerbs.add(ADDRESS);
+        mVerbs.add(CPU_USAGE);
+        mVerbs.add(MEM_USAGE);
+        mVerbs.add(NETWORK_USAGE);
         mVerbs.add("LOAD");
         mVerbs.add("VERSION");
         mVerbs.add("CPUS");
         mVerbs.add("MEMORY");
         mVerbs.add("CPU_SPEED");
         mVerbs.add("CPU_MODEL");
-        mVerbs.add("ACTIVE_VMS");
+        mVerbs.add(ACTIVE_VMS);
         mVerbs.add("MIGRATING_VMS");
         mVerbs.add("COMMITTED_MEM");
         mVerbs.add("TAG");
         mVerbs.add("TYPE");
-        mVerbs.add("DATACENTER");
+        mVerbs.add(DATACENTER);
         mVerbs.add("ARCHITECTURE");
         // mVerbs.Add("NOTE", "NOTE");
         buildCompletions();
         mVerbs.add("ID");
         // Building the types dict
-        getTypeDictionary().put("NAME", String.class);
+        getTypeDictionary().put(NAME, String.class);
         getTypeDictionary().put("COMMENT", String.class);
-        getTypeDictionary().put("STATUS", VDSStatus.class);
-        getTypeDictionary().put("CLUSTER", String.class);
-        getTypeDictionary().put("ADDRESS", String.class);
-        getTypeDictionary().put("CPU_USAGE", Integer.class);
-        getTypeDictionary().put("MEM_USAGE", Integer.class);
-        getTypeDictionary().put("NETWORK_USAGE", Integer.class);
+        getTypeDictionary().put(STATUS, VDSStatus.class);
+        getTypeDictionary().put(CLUSTER, String.class);
+        getTypeDictionary().put(ADDRESS, String.class);
+        getTypeDictionary().put(CPU_USAGE, Integer.class);
+        getTypeDictionary().put(MEM_USAGE, Integer.class);
+        getTypeDictionary().put(NETWORK_USAGE, Integer.class);
         getTypeDictionary().put("LOAD", BigDecimal.class);
         getTypeDictionary().put("VERSION", String.class);
         getTypeDictionary().put("CPUS", Integer.class);
         getTypeDictionary().put("MEMORY", Integer.class);
         getTypeDictionary().put("CPU_SPEED", BigDecimal.class);
         getTypeDictionary().put("CPU_MODEL", String.class);
-        getTypeDictionary().put("ACTIVE_VMS", Integer.class);
+        getTypeDictionary().put(ACTIVE_VMS, Integer.class);
         getTypeDictionary().put("MIGRATING_VMS", Integer.class);
         getTypeDictionary().put("COMMITTED_MEM", Integer.class);
         getTypeDictionary().put("TAG", String.class);
         getTypeDictionary().put("TYPE", VDSNiceType.class);
-        getTypeDictionary().put("DATACENTER", String.class);
+        getTypeDictionary().put(DATACENTER, String.class);
         getTypeDictionary().put("ID", UUID.class);
         getTypeDictionary().put("ARCHITECTURE", ArchitectureType.class);
         // mTypeDict.Add("NOTE", typeof(string));
         // building the ColumnName Dict
-        columnNameDict.put("NAME", "vds_name");
+        columnNameDict.put(NAME, "vds_name");
         columnNameDict.put("COMMENT", "free_text_comment");
-        columnNameDict.put("STATUS", "status");
-        columnNameDict.put("CLUSTER", "vds_group_name");
-        columnNameDict.put("ADDRESS", "host_name");
-        columnNameDict.put("CPU_USAGE", "usage_cpu_percent");
-        columnNameDict.put("MEM_USAGE", "usage_mem_percent");
-        columnNameDict.put("NETWORK_USAGE", "usage_network_percent");
+        columnNameDict.put(STATUS, "status");
+        columnNameDict.put(CLUSTER, "vds_group_name");
+        columnNameDict.put(ADDRESS, "host_name");
+        columnNameDict.put(CPU_USAGE, "usage_cpu_percent");
+        columnNameDict.put(MEM_USAGE, "usage_mem_percent");
+        columnNameDict.put(NETWORK_USAGE, "usage_network_percent");
         columnNameDict.put("LOAD", "cpu_load");
         columnNameDict.put("VERSION", "software_version");
         columnNameDict.put("CPUS", "cpu_cores");
         columnNameDict.put("MEMORY", "physical_mem_mb");
         columnNameDict.put("CPU_SPEED", "cpu_speed_mh");
         columnNameDict.put("CPU_MODEL", "cpu_model");
-        columnNameDict.put("ACTIVE_VMS", "vm_active");
+        columnNameDict.put(ACTIVE_VMS, "vm_active");
         columnNameDict.put("MIGRATING_VMS", "vm_migrating");
         columnNameDict.put("COMMITTED_MEM", "mem_commited");
         columnNameDict.put("TAG", "tag_name");
         columnNameDict.put("TYPE", "vds_type");
-        columnNameDict.put("DATACENTER", "storage_pool_name");
+        columnNameDict.put(DATACENTER, "storage_pool_name");
         columnNameDict.put("ID", "vds_id");
         columnNameDict.put("ARCHITECTURE", "architecture");
         // mColumnNameDict.Add("NOTE", "note");
@@ -89,9 +99,9 @@
     @Override
     public IAutoCompleter getFieldRelationshipAutoCompleter(String fieldName) {
         if ("MEMORY".equals(fieldName) || "CPUS".equals(fieldName)
-                || "CPU_USAGE".equals(fieldName) || 
"MEM_USAGE".equals(fieldName)
+                || CPU_USAGE.equals(fieldName) || MEM_USAGE.equals(fieldName)
                 || "LOAD".equals(fieldName) || "CPU_SPEED".equals(fieldName)
-                || "ACTIVE_VMS".equals(fieldName) || 
"NETWORK_USAGE".equals(fieldName)
+                || ACTIVE_VMS.equals(fieldName) || 
NETWORK_USAGE.equals(fieldName)
                 || "COMMITTED_MEM".equals(fieldName)) {
             return NumericConditionRelationAutoCompleter.INSTANCE;
         }
@@ -105,7 +115,7 @@
     @Override
     public IConditionValueAutoCompleter getFieldValueAutoCompleter(String 
fieldName) {
         IConditionValueAutoCompleter retval = null;
-        if ("STATUS".equals(fieldName)) {
+        if (STATUS.equals(fieldName)) {
             retval = new EnumValueAutoCompleter(VDSStatus.class);
         }
         else if ("TYPE".equals(fieldName)) {
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/SafeHtmlColumn.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/SafeHtmlColumn.java
index b2d7212..b6fe700 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/SafeHtmlColumn.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/SafeHtmlColumn.java
@@ -2,7 +2,6 @@
 
 import com.google.gwt.cell.client.SafeHtmlCell;
 import com.google.gwt.safehtml.shared.SafeHtml;
-import com.google.gwt.user.cellview.client.Column;
 
 /**
  * Column for displaying {@link SafeHtml} instances.
@@ -10,7 +9,7 @@
  * @param <T>
  *            Table row data type.
  */
-public abstract class SafeHtmlColumn<T> extends Column<T, SafeHtml> {
+public abstract class SafeHtmlColumn<T> extends SortableColumn<T, SafeHtml> {
 
     public SafeHtmlColumn() {
         super(new SafeHtmlCell());
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/comparators/VMComparator.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/comparators/VMComparator.java
index 6f25113..a62f47a 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/comparators/VMComparator.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/comparators/VMComparator.java
@@ -31,7 +31,7 @@
     };
 
     /**
-     * Comparator for the name field in {@code VM}.
+     * Comparator for the uptime field in {@code VM}.
      */
     public static final Comparator<VM> UPTIME = new Comparator<VM>() {
         @Override
@@ -40,4 +40,80 @@
             return 
((Long)vm1.getRoundedElapsedTime().longValue()).compareTo(vm2.getRoundedElapsedTime().longValue());
         }
     };
+
+    /**
+     * Comparator for the vds group name field in {@code VM}.
+     */
+    public static final Comparator<VM> CLUSTER = new Comparator<VM>() {
+        @Override
+        public int compare(VM vm1, VM vm2) {
+            return lexoNumeric.compare(vm1.getVdsGroupName(), 
vm2.getVdsGroupName());
+        }
+    };
+
+    /**
+     * Comparator for the Vm ipaddress field in {@code VM}.
+     */
+    public static final Comparator<VM> IPADDRESS = new Comparator<VM>() {
+        @Override
+        public int compare(VM vm1, VM vm2) {
+            return 
ipStringToLong(vm1.getVmIp()).compareTo(ipStringToLong(vm2.getVmIp()));
+        }
+    };
+
+    /**
+     * Comparator for the fully qualified domain name field in {@code VM}.
+     */
+    public static final Comparator<VM> FQDN = new Comparator<VM>() {
+        @Override
+        public int compare(VM vm1, VM vm2) {
+            return lexoNumeric.compare(vm1.getVmFQDN(), vm2.getVmFQDN());
+        }
+    };
+
+    /**
+     * Comparator for the memory percentage field in {@code VM}.
+     */
+    public static final Comparator<VM> MEMORY_PERCENTAGE = new 
Comparator<VM>() {
+        @Override
+        public int compare(VM vm1, VM vm2) {
+            return 
vm1.getUsageMemPercent().compareTo(vm2.getUsageMemPercent());
+        }
+    };
+
+    /**
+     * Comparator for the cpu percentage field in {@code VM}.
+     */
+    public static final Comparator<VM> CPU_PERCENTAGE = new Comparator<VM>() {
+        @Override
+        public int compare(VM vm1, VM vm2) {
+            return 
vm1.getUsageCpuPercent().compareTo(vm2.getUsageCpuPercent());
+        }
+    };
+
+    /**
+     * Comparator for the cpu percentage field in {@code VM}.
+     */
+    public static final Comparator<VM> NETWORK_PERCENTAGE = new 
Comparator<VM>() {
+        @Override
+        public int compare(VM vm1, VM vm2) {
+            return 
vm1.getUsageNetworkPercent().compareTo(vm2.getUsageNetworkPercent());
+        }
+    };
+
+    /**
+     * Helper method to convert Ip address strings to Longs so we can sort 
them.
+     * @param ipAddress The ip address to convert.
+     * @return The {@code Long} representation of the ip address.
+     */
+    private static Long ipStringToLong(String ipAddress) {
+        String[] ipAddressInArray = ipAddress.split("\\."); //$NON-NLS-1$
+
+        long result = 0;
+        for (int i = 0; i < ipAddressInArray.length; i++) {
+            int power = 3 - i;
+            result += (Integer.parseInt(ipAddressInArray[i]) % 256 * 
Math.pow(256, power));
+        }
+        return result;
+    }
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostListModel.java
index 957bb70..fdf59d5 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostListModel.java
@@ -29,6 +29,7 @@
 import 
org.ovirt.engine.core.common.businessentities.BusinessEntitiesDefinitions;
 import org.ovirt.engine.core.common.businessentities.DbUser;
 import org.ovirt.engine.core.common.businessentities.FenceActionType;
+import org.ovirt.engine.core.common.businessentities.Permissions;
 import org.ovirt.engine.core.common.businessentities.Provider;
 import org.ovirt.engine.core.common.businessentities.RoleType;
 import org.ovirt.engine.core.common.businessentities.StoragePool;
@@ -38,7 +39,6 @@
 import org.ovirt.engine.core.common.businessentities.VDSStatus;
 import org.ovirt.engine.core.common.businessentities.VDSType;
 import org.ovirt.engine.core.common.businessentities.VdsSpmStatus;
-import org.ovirt.engine.core.common.businessentities.Permissions;
 import org.ovirt.engine.core.common.interfaces.SearchType;
 import org.ovirt.engine.core.common.mode.ApplicationMode;
 import org.ovirt.engine.core.common.queries.ConfigurationValues;
@@ -1843,11 +1843,17 @@
     @Override
     protected void syncSearch()
     {
-        SearchParameters tempVar = new SearchParameters(getSearchString(), 
SearchType.VDS, isCaseSensitiveSearch());
+        SearchParameters tempVar = new 
SearchParameters(applySortOptions(getSearchString()), SearchType.VDS,
+                isCaseSensitiveSearch());
         tempVar.setMaxCount(getSearchPageSize());
         super.syncSearch(VdcQueryType.Search, tempVar);
     }
 
+    @Override
+    public boolean supportsServerSideSorting() {
+        return true;
+    }
+
     public void cancel()
     {
         cancelConfirm();
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabHostView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabHostView.java
index 60d3daa..1c0e4c1 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabHostView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabHostView.java
@@ -7,6 +7,7 @@
 import org.ovirt.engine.core.common.businessentities.VDSStatus;
 import org.ovirt.engine.core.common.businessentities.VdsSpmStatus;
 import org.ovirt.engine.core.common.mode.ApplicationMode;
+import org.ovirt.engine.core.searchbackend.VdsConditionFieldAutoCompleter;
 import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
 import org.ovirt.engine.ui.common.uicommon.model.MainModelProvider;
 import org.ovirt.engine.ui.common.widget.action.ActionButtonDefinition;
@@ -98,6 +99,7 @@
                 return object.getName();
             }
         };
+        nameColumn.makeSortable(VdsConditionFieldAutoCompleter.NAME);
         getTable().addColumn(nameColumn, constants.nameHost(), "150px"); 
//$NON-NLS-1$
 
         CommentColumn<VDS> commentColumn = new CommentColumn<VDS>();
@@ -109,6 +111,7 @@
                 return object.getHostName();
             }
         };
+        hostColumn.makeSortable(VdsConditionFieldAutoCompleter.ADDRESS);
         getTable().addColumn(hostColumn, constants.ipHost(), "150px"); 
//$NON-NLS-1$
 
         TextColumnWithTooltip<VDS> clusterColumn = new 
TextColumnWithTooltip<VDS>() {
@@ -117,6 +120,7 @@
                 return object.getVdsGroupName();
             }
         };
+        clusterColumn.makeSortable(VdsConditionFieldAutoCompleter.CLUSTER);
         getTable().addColumn(clusterColumn, constants.clusterHost(), "150px"); 
//$NON-NLS-1$
 
         if (ApplicationModeHelper.getUiMode() != ApplicationMode.GlusterOnly) {
@@ -126,6 +130,7 @@
                     return object.getStoragePoolName();
                 }
             };
+            dcColumn.makeSortable(VdsConditionFieldAutoCompleter.DATACENTER);
             getTable().addColumn(dcColumn, constants.dcHost(), "150px"); 
//$NON-NLS-1$
         }
 
@@ -135,10 +140,13 @@
                 return object.getStatus();
             }
         };
+        statusColumn.makeSortable(VdsConditionFieldAutoCompleter.STATUS);
         getTable().addColumn(statusColumn, constants.statusHost(), "100px"); 
//$NON-NLS-1$
 
         if (ApplicationModeHelper.getUiMode() != ApplicationMode.GlusterOnly) {
-            getTable().addColumn(new VmCountColumn(), constants.vmsCount(), 
"110px"); //$NON-NLS-1$
+            VmCountColumn vmCountColumn = new VmCountColumn();
+            
vmCountColumn.makeSortable(VdsConditionFieldAutoCompleter.ACTIVE_VMS);
+            getTable().addColumn(vmCountColumn, constants.vmsCount(), 
"110px"); //$NON-NLS-1$
         }
 
         PercentColumn<VDS> memColumn = new PercentColumn<VDS>() {
@@ -147,6 +155,7 @@
                 return object.getUsageMemPercent();
             }
         };
+        memColumn.makeSortable(VdsConditionFieldAutoCompleter.MEM_USAGE);
         getTable().addColumn(memColumn, constants.memoryHost(), "60px"); 
//$NON-NLS-1$
 
         PercentColumn<VDS> cpuColumn = new PercentColumn<VDS>() {
@@ -155,6 +164,7 @@
                 return object.getUsageCpuPercent();
             }
         };
+        cpuColumn.makeSortable(VdsConditionFieldAutoCompleter.CPU_USAGE);
         getTable().addColumn(cpuColumn, constants.cpuHost(), "60px"); 
//$NON-NLS-1$
 
         PercentColumn<VDS> netColumn = new PercentColumn<VDS>() {
@@ -163,6 +173,7 @@
                 return object.getUsageNetworkPercent();
             }
         };
+        netColumn.makeSortable(VdsConditionFieldAutoCompleter.NETWORK_USAGE);
         getTable().addColumn(netColumn, constants.networkHost(), "60px"); 
//$NON-NLS-1$
 
         if (ApplicationModeHelper.getUiMode() != ApplicationMode.GlusterOnly) {
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostHookView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostHookView.java
index fdfff96..b2b3878 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostHookView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostHookView.java
@@ -1,10 +1,12 @@
 package org.ovirt.engine.ui.webadmin.section.main.view.tab.host;
 
+import java.util.Comparator;
 import java.util.Map;
 
 import javax.inject.Inject;
 
 import org.ovirt.engine.core.common.businessentities.VDS;
+import 
org.ovirt.engine.core.common.businessentities.comparators.LexoNumericComparator;
 import org.ovirt.engine.ui.common.uicommon.model.SearchableDetailModelProvider;
 import org.ovirt.engine.ui.common.widget.table.column.TextColumnWithTooltip;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostHooksListModel;
@@ -15,6 +17,10 @@
 
 public class SubTabHostHookView extends AbstractSubTabTableView<VDS, 
Map<String, String>, HostListModel, HostHooksListModel>
         implements SubTabHostHookPresenter.ViewDef {
+    private static final String EVENT_NAME = "EventName"; //$NON-NLS-1$
+    private static final String SCRIPT_NAME = "ScriptName"; //$NON-NLS-1$
+    private static final String PROPERTY_NAME = "PropertyName"; //$NON-NLS-1$
+    private static final String PROPERTY_VALUE = "PropertyValue"; //$NON-NLS-1$
 
     @Inject
     public SubTabHostHookView(SearchableDetailModelProvider<Map<String, 
String>, HostListModel, HostHooksListModel> modelProvider, ApplicationConstants 
constants) {
@@ -29,34 +35,50 @@
         TextColumnWithTooltip<Map<String, String>> eventColumn = new 
TextColumnWithTooltip<Map<String, String>>() {
             @Override
             public String getValue(Map<String, String> object) {
-                return object.get("EventName"); //$NON-NLS-1$
+                return object.get(EVENT_NAME);
             }
         };
+        eventColumn.makeSortable(new HostHookComparator(EVENT_NAME));
         getTable().addColumn(eventColumn, constants.eventNameHook(), "220px"); 
//$NON-NLS-1$
 
         TextColumnWithTooltip<Map<String, String>> scriptColumn = new 
TextColumnWithTooltip<Map<String, String>>() {
             @Override
             public String getValue(Map<String, String> object) {
-                return object.get("ScriptName"); //$NON-NLS-1$
+                return object.get(SCRIPT_NAME);
             }
         };
+        scriptColumn.makeSortable(new HostHookComparator(SCRIPT_NAME));
         getTable().addColumn(scriptColumn, constants.scriptNameHook(), 
"220px"); //$NON-NLS-1$
 
         TextColumnWithTooltip<Map<String, String>> propNameColumn = new 
TextColumnWithTooltip<Map<String, String>>() {
             @Override
             public String getValue(Map<String, String> object) {
-                return object.get("PropertyName"); //$NON-NLS-1$
+                return object.get(PROPERTY_NAME);
             }
         };
+        propNameColumn.makeSortable(new HostHookComparator(PROPERTY_NAME));
         getTable().addColumn(propNameColumn, constants.propertyNameHook(), 
"220px"); //$NON-NLS-1$
 
         TextColumnWithTooltip<Map<String, String>> propValueColumn = new 
TextColumnWithTooltip<Map<String, String>>() {
             @Override
             public String getValue(Map<String, String> object) {
-                return object.get("PropertyValue"); //$NON-NLS-1$
+                return object.get(PROPERTY_VALUE);
             }
         };
+        propValueColumn.makeSortable(new HostHookComparator(PROPERTY_VALUE));
         getTable().addColumn(propValueColumn, constants.propertyValueHook(), 
"250px"); //$NON-NLS-1$
     }
 
+    private static class HostHookComparator implements Comparator<Map<String, 
String>> {
+        private final String key;
+
+        HostHookComparator(String key) {
+            this.key = key;
+        }
+
+        @Override
+        public int compare(Map<String, String> map1, Map<String, String> map2) 
{
+            return new LexoNumericComparator().compare(map1.get(key), 
map2.get(key));
+        }
+    };
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostVmView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostVmView.java
index 52291f0..86020cd 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostVmView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostVmView.java
@@ -11,6 +11,7 @@
 import org.ovirt.engine.ui.common.widget.table.column.EnumColumn;
 import org.ovirt.engine.ui.common.widget.table.column.TextColumnWithTooltip;
 import org.ovirt.engine.ui.uicommonweb.UICommand;
+import org.ovirt.engine.ui.uicommonweb.comparators.VMComparator;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostListModel;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostVmListModel;
 import org.ovirt.engine.ui.webadmin.ApplicationConstants;
@@ -53,6 +54,7 @@
                 return object.getName();
             }
         };
+        nameColumn.makeSortable(VMComparator.NAME);
         getTable().addColumn(nameColumn, constants.nameVm(), "160px"); 
//$NON-NLS-1$
 
         getTable().addColumn(new VmTypeColumn(), constants.empty(), "30px"); 
//$NON-NLS-1$
@@ -63,6 +65,7 @@
                 return object.getVdsGroupName();
             }
         };
+        clusterColumn.makeSortable(VMComparator.CLUSTER);
         getTable().addColumn(clusterColumn, constants.clusterVm(), "160px"); 
//$NON-NLS-1$
 
         TextColumnWithTooltip<VM> ipColumn = new TextColumnWithTooltip<VM>() {
@@ -71,6 +74,7 @@
                 return object.getVmIp();
             }
         };
+        ipColumn.makeSortable(VMComparator.IPADDRESS);
         getTable().addColumn(ipColumn, constants.ipVm(), "200px"); 
//$NON-NLS-1$
 
         TextColumnWithTooltip<VM> fqdnColumn = new TextColumnWithTooltip<VM>() 
{
@@ -79,6 +83,7 @@
                 return object.getVmFQDN();
             }
         };
+        fqdnColumn.makeSortable(VMComparator.FQDN);
         getTable().addColumn(fqdnColumn, constants.fqdn(), "200px"); 
//$NON-NLS-1$
 
         PercentColumn<VM> memColumn = new PercentColumn<VM>() {
@@ -87,6 +92,7 @@
                 return object.getUsageMemPercent();
             }
         };
+        memColumn.makeSortable(VMComparator.MEMORY_PERCENTAGE);
         getTable().addColumn(memColumn, constants.memoryVm(), "120px"); 
//$NON-NLS-1$
 
         PercentColumn<VM> cpuColumn = new PercentColumn<VM>() {
@@ -95,6 +101,7 @@
                 return object.getUsageCpuPercent();
             }
         };
+        cpuColumn.makeSortable(VMComparator.CPU_PERCENTAGE);
         getTable().addColumn(cpuColumn, constants.cpuVm(), "120px"); 
//$NON-NLS-1$
 
         PercentColumn<VM> netColumn = new PercentColumn<VM>() {
@@ -103,6 +110,7 @@
                 return object.getUsageNetworkPercent();
             }
         };
+        netColumn.makeSortable(VMComparator.NETWORK_PERCENTAGE);
         getTable().addColumn(netColumn, constants.networkVm(), "120px"); 
//$NON-NLS-1$
 
         TextColumnWithTooltip<VM> statusColumn = new EnumColumn<VM, 
VMStatus>() {
@@ -117,15 +125,17 @@
                 return object.getStatus();
             }
         };
+        statusColumn.makeSortable(VMComparator.STATUS);
         getTable().addColumn(statusColumn, constants.statusVm(), "130px"); 
//$NON-NLS-1$
 
-        TextColumnWithTooltip<VM> hostColumn = new UptimeColumn<VM>() {
+        TextColumnWithTooltip<VM> uptimeColumn = new UptimeColumn<VM>() {
             @Override
             protected Double getRawValue(VM object) {
                 return object.getRoundedElapsedTime();
             }
         };
-        getTable().addColumn(hostColumn, constants.uptimeVm(), "110px"); 
//$NON-NLS-1$
+        uptimeColumn.makeSortable(VMComparator.UPTIME);
+        getTable().addColumn(uptimeColumn, constants.uptimeVm(), "110px"); 
//$NON-NLS-1$
 
         // add action buttons
         getTable().addActionButton(new 
WebAdminImageButtonDefinition<VM>(constants.suspendVm(),


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Icf32960b4ad0c2510da2895f86950455766b5237
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