Martin Betak has uploaded a new change for review.

Change subject: engine: Incorrect VM TimeZone handling
......................................................................

engine: Incorrect VM TimeZone handling

In case or running a VM from older engine installation it was possible
to run a VM with incorrect timezone (empty string '') which is not a
valid value (null - meaning 'use engine default' or valid time-zone key
for given OS type). This caused the regression in frontend as it tried
to select the empty string in the TimeZone lisbox editor and failed.

Now in RunVmCommand we detect incorrect timezone and override it to
'null' (default) and always run the VM with correct TZ thus avoiding the
frontend bug among others.

Refactoring:

Required to unify TZ handling in TimeZoneType with necessary small
changes to make it portable to GWT resulting in simplified TimeZoneModel
and avoiding asynchronous patterns in VmModelBehaviorBase.

Change-Id: Ifd36656bd4f0288e86b1cbd46d702fa68051e28b
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=988259
Signed-off-by: Martin Betak <mbe...@redhat.com>
---
D 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTimeZonesQuery.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
D 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetTimeZonesQueryTest.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/TimeZoneType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java
A 
backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/TimeZoneTypeTest.java
M 
backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Match.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SysprepHandler.java
M 
frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Compat.gwt.xml
M 
frontend/webadmin/modules/gwt-extension/src/main/java/org/ovirt/engine/ui/uioverrides/org/ovirt/engine/core/compat/Match.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TimeZoneModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java
12 files changed, 339 insertions(+), 358 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/24/17524/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTimeZonesQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTimeZonesQuery.java
deleted file mode 100644
index 561000d..0000000
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTimeZonesQuery.java
+++ /dev/null
@@ -1,193 +0,0 @@
-package org.ovirt.engine.core.bll;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.ovirt.engine.core.common.queries.TimeZoneQueryParams;
-import org.ovirt.engine.core.vdsbroker.vdsbroker.SysprepHandler;
-
-public class GetTimeZonesQuery<P extends TimeZoneQueryParams> extends 
QueriesCommandBase<P> {
-    private static Map<String, String> windowsTimezones = new HashMap<String, 
String>();
-    private static Map<String, String> linuxTimezones = new HashMap<String, 
String>();
-
-    static {
-        initWindowsTimeZones();
-        initLinuxTimeZones();
-    }
-
-    public GetTimeZonesQuery(P parameters) {
-        super(parameters);
-    }
-
-    @Override
-    protected void executeQueryCommand() {
-        switch (getParameters().getTimeZoneType()) {
-        case GENERAL_TIMEZONE:
-            getQueryReturnValue().setReturnValue(linuxTimezones);
-            break;
-        case WINDOWS_TIMEZONE:
-            getQueryReturnValue().setReturnValue(windowsTimezones);
-            break;
-        }
-    }
-
-    private static Map<String, String> sortMapByValue(Map<String, String> map) 
{
-        List<Map.Entry<String, String>> list = new 
LinkedList<Map.Entry<String, String>>(map.entrySet());
-        Collections.sort(list, TimeZoneTimeExtractComperator.instance);
-
-        Map<String, String> result = new LinkedHashMap<String, String>();
-        for (Iterator<Map.Entry<String, String>> it = list.iterator(); 
it.hasNext();) {
-            Map.Entry<String, String> entry = it.next();
-            result.put(entry.getKey(), entry.getValue());
-        }
-        return result;
-    }
-
-    private static final class TimeZoneTimeExtractComperator implements 
Comparator<Map.Entry<String, String>> {
-        public static final TimeZoneTimeExtractComperator instance = new 
TimeZoneTimeExtractComperator();
-
-        private static final Pattern regex = 
Pattern.compile(SysprepHandler.TimzeZoneExtractTimePattern);
-
-        // we get a string like "(GMT-04:30) Afghanistan Standard Time"
-        // we use regex to extract the time only and replace it to number
-        // in this sample we get -430
-        @Override
-        public int compare(Map.Entry<String, String> o1, Map.Entry<String, 
String> o2) {
-            int a = 0, b = 0;
-            Matcher match1 = regex.matcher(o1.toString());
-            Matcher match2 = regex.matcher(o2.toString());
-            if (match1.matches() && match1.groupCount() > 0) {
-                a = Integer.parseInt(match1.group(1).substring(3).replace(":", 
"").replace("+", ""));
-            }
-            if (match2.matches() && match2.groupCount() > 0) {
-                b = Integer.parseInt(match2.group(1).substring(3).replace(":", 
"").replace("+", ""));
-            }
-
-            if (a == b) {
-                return 0;
-            }
-
-            return (a > b) ? 1 : -1;
-        }
-    }
-
-    private static void initWindowsTimeZones() {
-        // get all time zones that is supported by sysprep
-
-        // This is a bit of a hack since Java doesn't use the same timezone
-        // standard as Windows
-        // Or actually Windows doesn't use the standard that everybody else is
-        // using (surprise...)
-        // Since this is only used to present to user the list windows 
timezones
-        // We can safely return the list of timezones that are supported by
-        // sysprep handler and be done with it
-        for (String value : SysprepHandler.timeZoneIndex.keySet()) {
-            // we use:
-            // key = "Afghanistan Standard Time"
-            // value = "(GMT+04:30) Afghanistan Standard Time"
-            String key = SysprepHandler.getTimezoneKey(value);
-            windowsTimezones.put(key, value);
-        }
-        windowsTimezones = sortMapByValue(windowsTimezones);
-    }
-
-    /* Instead of returning nearly 600 time zone names shared between Java's
-     * TimeZone.getAvailableIDs() and /usr/share/zoneinfo contents, pare down
-     * the list to show zones similar to those supported by Sysprep.
-     *
-     * Values were converted to Olson names using the Unicode CLDR tables at
-     * http://unicode.org/cldr/charts/supplemental/zone_tzid.html
-     *
-     * For a good overview, see http://stackoverflow.com/tags/timezone/info
-     *
-     * Note: some items marked with "Updated display name" if their names
-     * differ from the names given in SysprepHandler.
-     */
-    private static void initLinuxTimeZones() {
-        linuxTimezones.put("Asia/Kabul", "(GMT+04:30) Afghanistan Standard 
Time");
-        linuxTimezones.put("America/Anchorage", "(GMT-09:00) Alaskan Standard 
Time");
-        linuxTimezones.put("Asia/Riyadh", "(GMT+03:00) Arab Standard Time");
-        linuxTimezones.put("Asia/Dubai", "(GMT+04:00) Arabian Standard Time");
-        linuxTimezones.put("Asia/Baghdad", "(GMT+03:00) Arabic Standard Time");
-        linuxTimezones.put("America/Halifax", "(GMT-04:00) Atlantic Standard 
Time");
-        // linuxTimezones.put("Asia/Baku", "(GMT+04:00) Azerbaijan Standard 
Time"); // Not in Sysprep documentation
-        linuxTimezones.put("Atlantic/Azores", "(GMT-10:00) Azores Standard 
Time");
-        linuxTimezones.put("America/Regina", "(GMT-06:00) Canada Central 
Standard Time");
-        linuxTimezones.put("Atlantic/Cape_Verde", "(GMT-01:00) Cape Verde 
Standard Time");
-        linuxTimezones.put("Asia/Yerevan", "(GMT+04:00) Caucasus Standard 
Time");
-        linuxTimezones.put("Australia/Adelaide", "(GMT+09:30) Cen. Australia 
Standard Time");
-        linuxTimezones.put("America/Guatemala", "(GMT-06:00) Central America 
Standard Time");
-        linuxTimezones.put("Asia/Almaty", "(GMT+06:00) Central Asia Standard 
Time");
-        // linuxTimezones.put("America/Cuiaba", "(GMT-04:00) Central Brazilian 
Standard Time "); // Not in Sysprep documentation
-        linuxTimezones.put("Europe/Budapest", "(GMT+01:00) Central Europe 
Standard Time");
-        linuxTimezones.put("Europe/Warsaw", "(GMT+01:00) Central European 
Standard Time");
-        linuxTimezones.put("Pacific/Guadalcanal", "(GMT+11:00) Central Pacific 
Standard Time");
-        linuxTimezones.put("America/Chicago", "(GMT-06:00) Central Standard 
Time");
-        linuxTimezones.put("America/Mexico_City", "(GMT-06:00) Central 
Standard Time (Mexico)");
-        linuxTimezones.put("Asia/Shanghai", "(GMT+08:00) China Standard Time");
-        linuxTimezones.put("Etc/GMT+12", "(GMT-12:00) Dateline Standard Time");
-        linuxTimezones.put("Africa/Nairobi", "(GMT+03:00) E. Africa Standard 
Time");
-        linuxTimezones.put("Australia/Brisbane", "(GMT+10:00) E. Australia 
Standard Time");
-        linuxTimezones.put("Asia/Nicosia", "(GMT+02:00) E. Europe Standard 
Time");
-        linuxTimezones.put("America/Sao_Paulo", "(GMT-03:00) E. South America 
Standard Time");
-        linuxTimezones.put("America/New_York", "(GMT-05:00) Eastern Standard 
Time");
-        linuxTimezones.put("Africa/Cairo", "(GMT+02:00) Egypt Standard Time");
-        linuxTimezones.put("Asia/Yekaterinburg", "(GMT+05:00) Ekaterinburg 
Standard Time");
-        linuxTimezones.put("Pacific/Fiji", "(GMT+12:00) Fiji Standard Time");
-        linuxTimezones.put("Europe/Kiev", "(GMT+02:00) FLE Standard Time");
-        linuxTimezones.put("Asia/Tbilisi", "(GMT+04:00) Georgian Standard 
Time");
-        linuxTimezones.put("Europe/London", "(GMT+00:00) GMT Standard Time"); 
// Updated display name
-        linuxTimezones.put("America/Godthab", "(GMT-03:00) Greenland Standard 
Time");
-        linuxTimezones.put("Atlantic/Reykjavik", "(GMT) Greenwich Mean Time"); 
// Updated display name
-        linuxTimezones.put("Europe/Bucharest", "(GMT+02:00) GTB Standard 
Time");
-        linuxTimezones.put("Pacific/Honolulu", "(GMT-10:00) Hawaiian Standard 
Time");
-        linuxTimezones.put("Asia/Calcutta", "(GMT+05:30) India Standard Time");
-        linuxTimezones.put("Asia/Tehran", "(GMT+03:00) Iran Standard Time");
-        linuxTimezones.put("Asia/Jerusalem", "(GMT+02:00) Israel Standard 
Time");
-        linuxTimezones.put("Asia/Seoul", "(GMT+09:00) Korea Standard Time");
-        // linuxTimezones.put("(GMT-02:00) Mid-Atlantic Standard Time", 75); 
// Not in Unicode CLDR list
-        linuxTimezones.put("America/Denver", "(GMT-07:00) Mountain Standard 
Time");
-        linuxTimezones.put("Asia/Rangoon", "(GMT+06:30) Myanmar Standard 
Time");
-        linuxTimezones.put("Asia/Novosibirsk", "(GMT+06:00) N. Central Asia 
Standard Time");
-        linuxTimezones.put("Asia/Katmandu", "(GMT+05:45) Nepal Standard Time");
-        linuxTimezones.put("Pacific/Auckland", "(GMT+12:00) New Zealand 
Standard Time");
-        linuxTimezones.put("America/St_Johns", "(GMT-03:30) Newfoundland 
Standard Time");
-        linuxTimezones.put("Asia/Irkutsk", "(GMT+08:00) North Asia East 
Standard Time");
-        linuxTimezones.put("Asia/Krasnoyarsk", "(GMT+07:00) North Asia 
Standard Time");
-        linuxTimezones.put("America/Santiago", "(GMT+04:00) Pacific SA 
Standard Time");
-        linuxTimezones.put("America/Los_Angeles", "(GMT-08:00) Pacific 
Standard Time");
-        linuxTimezones.put("Europe/Paris", "(GMT+01:00) Romance Standard 
Time");
-        linuxTimezones.put("Europe/Moscow", "(GMT+03:00) Russian Standard 
Time");
-        linuxTimezones.put("America/Cayenne", "(GMT-03:00) SA Eastern Standard 
Time");
-        linuxTimezones.put("America/Bogota", "(GMT-05:00) SA Pacific Standard 
Time");
-        linuxTimezones.put("America/La_Paz", "(GMT-04:00) SA Western Standard 
Time");
-        linuxTimezones.put("Pacific/Apia", "(GMT-11:00) Samoa Standard Time");
-        linuxTimezones.put("Asia/Bangkok", "(GMT+07:00) SE Asia Standard 
Time");
-        linuxTimezones.put("Asia/Singapore", "(GMT+08:00) Singapore Standard 
Time");
-        linuxTimezones.put("Africa/Johannesburg", "(GMT+02:00) South Africa 
Standard Time");
-        linuxTimezones.put("Asia/Colombo", "(GMT+06:00) Sri Lanka Standard 
Time");
-        linuxTimezones.put("Asia/Taipei", "(GMT+08:00) Taipei Standard Time");
-        linuxTimezones.put("Australia/Hobart", "(GMT+10:00) Tasmania Standard 
Time");
-        linuxTimezones.put("Asia/Tokyo", "(GMT+09:00) Tokyo Standard Time");
-        linuxTimezones.put("Pacific/Tongatapu", "(GMT+13:00) Tonga Standard 
Time");
-        linuxTimezones.put("America/Indianapolis", "(GMT-05:00) US Eastern 
Standard Time (Indiana)"); // Updated display name
-        linuxTimezones.put("America/Phoenix", "(GMT-07:00) US Mountain 
Standard Time (Arizona)"); // Updated display name
-        linuxTimezones.put("Asia/Vladivostok", "(GMT+10:00) Vladivostok 
Standard Time");
-        linuxTimezones.put("Australia/Perth", "(GMT+08:00) W. Australia 
Standard Time");
-        linuxTimezones.put("Africa/Lagos", "(GMT+01:00) W. Central Africa 
Standard Time");
-        linuxTimezones.put("Europe/Berlin", "(GMT+01:00) W. Europe Standard 
Time");
-        linuxTimezones.put("Asia/Tashkent", "(GMT+05:00) West Asia Standard 
Time");
-        linuxTimezones.put("Pacific/Port_Moresby", "(GMT+10:00) West Pacific 
Standard Time");
-        linuxTimezones.put("Asia/Yakutsk", "(GMT+09:00) Yakutsk Standard 
Time");
-
-        linuxTimezones = sortMapByValue(linuxTimezones);
-    }
-}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
index e2e7c7b..1b30615 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
@@ -29,6 +29,7 @@
 import org.ovirt.engine.core.bll.validator.VmValidator;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.FeatureSupported;
+import org.ovirt.engine.core.common.TimeZoneType;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.CreateAllSnapshotsFromVmParameters;
 import org.ovirt.engine.core.common.action.RunVmParams;
@@ -599,6 +600,7 @@
             return false;
         } else {
             handleMemoryAdjustments();
+            handleTimeZone();
             VmHandler.updateDisksFromDb(getVm());
             getVm().setCdPath(_cdImagePath);
             getVm().setFloppyPath(_floppyImagePath);
@@ -636,6 +638,15 @@
         // nothing to do in RunVmCommand class
     }
 
+    // set the timezone to use the engine default if trying to run VM with 
incorrect TZ set
+    private void handleTimeZone() {
+        TimeZoneType timeZoneType = 
OsRepositoryImpl.INSTANCE.isWindows(getVm().getOs()) ? 
TimeZoneType.WINDOWS_TIMEZONE : TimeZoneType.GENERAL_TIMEZONE;
+        if 
(!timeZoneType.getTimeZoneList().containsKey(getVm().getTimeZone())) {
+            getVm().getStaticData().setTimeZone(null);
+            getVmStaticDAO().update(getVm().getStaticData());
+        }
+    }
+
     protected boolean getVdsToRunOn() {
         // use destination vds or default vds or none
         VDS destinationVds = getDestinationVds();
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetTimeZonesQueryTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetTimeZonesQueryTest.java
deleted file mode 100644
index 669431b..0000000
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetTimeZonesQueryTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.ovirt.engine.core.bll;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.when;
-
-import java.util.Map;
-import java.util.TimeZone;
-
-import org.junit.Test;
-import org.ovirt.engine.core.common.TimeZoneType;
-import org.ovirt.engine.core.common.queries.TimeZoneQueryParams;
-import org.ovirt.engine.core.vdsbroker.vdsbroker.SysprepHandler;
-
-public class GetTimeZonesQueryTest extends 
AbstractSysprepQueryTest<TimeZoneQueryParams, 
GetTimeZonesQuery<TimeZoneQueryParams>> {
-
-    /**
-     * initializing the {@link #MockConfigRule} because there's a static 
initialization in the
-     * {@link #GetTimeZonesQuery}, otherwise the mocking doesn't take place.
-     */
-    @Override
-    public void setUp() throws Exception {
-        mcr.starting(null);
-        super.setUp();
-    }
-
-    @Test
-    public void testExecuteQuery() {
-        
when(getQueryParameters().getTimeZoneType()).thenReturn(TimeZoneType.WINDOWS_TIMEZONE);
-        getQuery().executeQueryCommand();
-
-        @SuppressWarnings("unchecked")
-        Map<String, String> result = (Map<String, String>) 
getQuery().getQueryReturnValue().getReturnValue();
-
-        assertEquals("Wrong number of time zones", 
SysprepHandler.timeZoneIndex.size(), result.size());
-
-    }
-
-    @Test
-    public void queryWindowsTimeZones() {
-        
when(getQueryParameters().getTimeZoneType()).thenReturn(TimeZoneType.WINDOWS_TIMEZONE);
-        getQuery().executeQueryCommand();
-        Map<String, String> map = (Map<String, String>) 
getQuery().getQueryReturnValue().getReturnValue();
-
-        assertFalse(map.get("Asia/Riyadh87") != null);
-        assertTrue(TimeZone.getTimeZone(map.get("E. Australia Standard Time")) 
!= null);
-    }
-
-    @Test
-    public void queryGenralTimeZones() {
-        
when(getQueryParameters().getTimeZoneType()).thenReturn(TimeZoneType.GENERAL_TIMEZONE);
-        getQuery().executeQueryCommand();
-        Map<String, String> map = ((Map<String, String>) 
getQuery().getQueryReturnValue().getReturnValue());
-
-        assertNull(map.get("E. Australia Standard Time"));
-        assertNotNull(TimeZone.getTimeZone(map.get("Asia/Riyadh")));
-    }
-
-}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/TimeZoneType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/TimeZoneType.java
index a448fee..64af9d4 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/TimeZoneType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/TimeZoneType.java
@@ -1,7 +1,255 @@
 package org.ovirt.engine.core.common;
 
-public enum TimeZoneType {
-    WINDOWS_TIMEZONE,
-    GENERAL_TIMEZONE;
+import org.ovirt.engine.core.common.config.ConfigValues;
+import org.ovirt.engine.core.common.queries.ConfigurationValues;
+import org.ovirt.engine.core.compat.Match;
+import org.ovirt.engine.core.compat.Regex;
 
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+public enum TimeZoneType {
+    GENERAL_TIMEZONE(ConfigValues.DefaultGeneralTimeZone, 
ConfigurationValues.DefaultGeneralTimeZone) {
+        @Override
+        protected Map<String, String> initializeTimeZoneList() {
+            Map<String, String> generalTimeZones = new HashMap<String, 
String>();
+            generalTimeZones.put("Etc/GMT", "(GMT+00:00) GMT Standard Time");
+            generalTimeZones.put("Asia/Kabul", "(GMT+04:30) Afghanistan 
Standard Time");
+            generalTimeZones.put("America/Anchorage", "(GMT-09:00) Alaskan 
Standard Time");
+            generalTimeZones.put("Asia/Riyadh", "(GMT+03:00) Arab Standard 
Time");
+            generalTimeZones.put("Asia/Dubai", "(GMT+04:00) Arabian Standard 
Time");
+            generalTimeZones.put("Asia/Baghdad", "(GMT+03:00) Arabic Standard 
Time");
+            generalTimeZones.put("America/Halifax", "(GMT-04:00) Atlantic 
Standard Time");
+            // generalTimeZones.put("Asia/Baku", "(GMT+04:00) Azerbaijan 
Standard Time"); // Not in Sysprep documentation
+            generalTimeZones.put("Atlantic/Azores", "(GMT-10:00) Azores 
Standard Time");
+            generalTimeZones.put("America/Regina", "(GMT-06:00) Canada Central 
Standard Time");
+            generalTimeZones.put("Atlantic/Cape_Verde", "(GMT-01:00) Cape 
Verde Standard Time");
+            generalTimeZones.put("Asia/Yerevan", "(GMT+04:00) Caucasus 
Standard Time");
+            generalTimeZones.put("Australia/Adelaide", "(GMT+09:30) Cen. 
Australia Standard Time");
+            generalTimeZones.put("America/Guatemala", "(GMT-06:00) Central 
America Standard Time");
+            generalTimeZones.put("Asia/Almaty", "(GMT+06:00) Central Asia 
Standard Time");
+            // generalTimeZones.put("America/Cuiaba", "(GMT-04:00) Central 
Brazilian Standard Time "); // Not in Sysprep documentation
+            generalTimeZones.put("Europe/Budapest", "(GMT+01:00) Central 
Europe Standard Time");
+            generalTimeZones.put("Europe/Warsaw", "(GMT+01:00) Central 
European Standard Time");
+            generalTimeZones.put("Pacific/Guadalcanal", "(GMT+11:00) Central 
Pacific Standard Time");
+            generalTimeZones.put("America/Chicago", "(GMT-06:00) Central 
Standard Time");
+            generalTimeZones.put("America/Mexico_City", "(GMT-06:00) Central 
Standard Time (Mexico)");
+            generalTimeZones.put("Asia/Shanghai", "(GMT+08:00) China Standard 
Time");
+            generalTimeZones.put("Etc/GMT+12", "(GMT-12:00) Dateline Standard 
Time");
+            generalTimeZones.put("Africa/Nairobi", "(GMT+03:00) E. Africa 
Standard Time");
+            generalTimeZones.put("Australia/Brisbane", "(GMT+10:00) E. 
Australia Standard Time");
+            generalTimeZones.put("Asia/Nicosia", "(GMT+02:00) E. Europe 
Standard Time");
+            generalTimeZones.put("America/Sao_Paulo", "(GMT-03:00) E. South 
America Standard Time");
+            generalTimeZones.put("America/New_York", "(GMT-05:00) Eastern 
Standard Time");
+            generalTimeZones.put("Africa/Cairo", "(GMT+02:00) Egypt Standard 
Time");
+            generalTimeZones.put("Asia/Yekaterinburg", "(GMT+05:00) 
Ekaterinburg Standard Time");
+            generalTimeZones.put("Pacific/Fiji", "(GMT+12:00) Fiji Standard 
Time");
+            generalTimeZones.put("Europe/Kiev", "(GMT+02:00) FLE Standard 
Time");
+            generalTimeZones.put("Asia/Tbilisi", "(GMT+04:00) Georgian 
Standard Time");
+            generalTimeZones.put("Europe/London", "(GMT+00:00) GMT Standard 
Time"); // Updated display name
+            generalTimeZones.put("America/Godthab", "(GMT-03:00) Greenland 
Standard Time");
+            generalTimeZones.put("Atlantic/Reykjavik", "(GMT) Greenwich Mean 
Time"); // Updated display name
+            generalTimeZones.put("Europe/Bucharest", "(GMT+02:00) GTB Standard 
Time");
+            generalTimeZones.put("Pacific/Honolulu", "(GMT-10:00) Hawaiian 
Standard Time");
+            generalTimeZones.put("Asia/Calcutta", "(GMT+05:30) India Standard 
Time");
+            generalTimeZones.put("Asia/Tehran", "(GMT+03:00) Iran Standard 
Time");
+            generalTimeZones.put("Asia/Jerusalem", "(GMT+02:00) Israel 
Standard Time");
+            generalTimeZones.put("Asia/Seoul", "(GMT+09:00) Korea Standard 
Time");
+            // generalTimeZones.put("(GMT-02:00) Mid-Atlantic Standard Time", 
75); // Not in Unicode CLDR list
+            generalTimeZones.put("America/Denver", "(GMT-07:00) Mountain 
Standard Time");
+            generalTimeZones.put("Asia/Rangoon", "(GMT+06:30) Myanmar Standard 
Time");
+            generalTimeZones.put("Asia/Novosibirsk", "(GMT+06:00) N. Central 
Asia Standard Time");
+            generalTimeZones.put("Asia/Katmandu", "(GMT+05:45) Nepal Standard 
Time");
+            generalTimeZones.put("Pacific/Auckland", "(GMT+12:00) New Zealand 
Standard Time");
+            generalTimeZones.put("America/St_Johns", "(GMT-03:30) Newfoundland 
Standard Time");
+            generalTimeZones.put("Asia/Irkutsk", "(GMT+08:00) North Asia East 
Standard Time");
+            generalTimeZones.put("Asia/Krasnoyarsk", "(GMT+07:00) North Asia 
Standard Time");
+            generalTimeZones.put("America/Santiago", "(GMT+04:00) Pacific SA 
Standard Time");
+            generalTimeZones.put("America/Los_Angeles", "(GMT-08:00) Pacific 
Standard Time");
+            generalTimeZones.put("Europe/Paris", "(GMT+01:00) Romance Standard 
Time");
+            generalTimeZones.put("Europe/Moscow", "(GMT+03:00) Russian 
Standard Time");
+            generalTimeZones.put("America/Cayenne", "(GMT-03:00) SA Eastern 
Standard Time");
+            generalTimeZones.put("America/Bogota", "(GMT-05:00) SA Pacific 
Standard Time");
+            generalTimeZones.put("America/La_Paz", "(GMT-04:00) SA Western 
Standard Time");
+            generalTimeZones.put("Pacific/Apia", "(GMT-11:00) Samoa Standard 
Time");
+            generalTimeZones.put("Asia/Bangkok", "(GMT+07:00) SE Asia Standard 
Time");
+            generalTimeZones.put("Asia/Singapore", "(GMT+08:00) Singapore 
Standard Time");
+            generalTimeZones.put("Africa/Johannesburg", "(GMT+02:00) South 
Africa Standard Time");
+            generalTimeZones.put("Asia/Colombo", "(GMT+06:00) Sri Lanka 
Standard Time");
+            generalTimeZones.put("Asia/Taipei", "(GMT+08:00) Taipei Standard 
Time");
+            generalTimeZones.put("Australia/Hobart", "(GMT+10:00) Tasmania 
Standard Time");
+            generalTimeZones.put("Asia/Tokyo", "(GMT+09:00) Tokyo Standard 
Time");
+            generalTimeZones.put("Pacific/Tongatapu", "(GMT+13:00) Tonga 
Standard Time");
+            generalTimeZones.put("America/Indianapolis", "(GMT-05:00) US 
Eastern Standard Time (Indiana)"); // Updated display name
+            generalTimeZones.put("America/Phoenix", "(GMT-07:00) US Mountain 
Standard Time (Arizona)"); // Updated display name
+            generalTimeZones.put("Asia/Vladivostok", "(GMT+10:00) Vladivostok 
Standard Time");
+            generalTimeZones.put("Australia/Perth", "(GMT+08:00) W. Australia 
Standard Time");
+            generalTimeZones.put("Africa/Lagos", "(GMT+01:00) W. Central 
Africa Standard Time");
+            generalTimeZones.put("Europe/Berlin", "(GMT+01:00) W. Europe 
Standard Time");
+            generalTimeZones.put("Asia/Tashkent", "(GMT+05:00) West Asia 
Standard Time");
+            generalTimeZones.put("Pacific/Port_Moresby", "(GMT+10:00) West 
Pacific Standard Time");
+            generalTimeZones.put("Asia/Yakutsk", "(GMT+09:00) Yakutsk Standard 
Time");
+
+            return sortMapByValue(generalTimeZones);
+        }
+    },
+
+    WINDOWS_TIMEZONE(ConfigValues.DefaultWindowsTimeZone, 
ConfigurationValues.DefaultWindowsTimeZone) {
+        @Override
+        protected Map<String, String> initializeTimeZoneList() {
+            Map<String, String> windowsTimeZones = new HashMap<String, 
String>();
+            windowsTimeZones.put("Arabian Standard Time", "(GMT+04:00) Arabian 
Standard Time");
+            windowsTimeZones.put("W. Australia Standard Time", "(GMT+08:00) W. 
Australia Standard Time");
+            windowsTimeZones.put("Caucasus Standard Time", "(GMT+04:00) 
Caucasus Standard Time");
+            windowsTimeZones.put("India Standard Time", "(GMT+05:30) India 
Standard Time");
+            windowsTimeZones.put("Taipei Standard Time", "(GMT+08:00) Taipei 
Standard Time");
+            windowsTimeZones.put("Eastern Standard Time", "(GMT-05:00) Eastern 
Standard Time");
+            windowsTimeZones.put("Russian Standard Time", "(GMT+03:00) Russian 
Standard Time");
+            windowsTimeZones.put("GMT Standard Time", "(GMT) GMT Standard 
Time");
+            windowsTimeZones.put("Tasmania Standard Time", "(GMT+10:00) 
Tasmania Standard Time");
+            windowsTimeZones.put("W. Europe Standard Time", "(GMT+01:00) W. 
Europe Standard Time");
+            windowsTimeZones.put("E. Africa Standard Time", "(GMT+03:00) E. 
Africa Standard Time");
+            windowsTimeZones.put("Alaskan Standard Time", "(GMT-09:00) Alaskan 
Standard Time");
+            windowsTimeZones.put("US Mountain Standard Time", "(GMT-07:00) US 
Mountain Standard Time");
+            windowsTimeZones.put("Iran Standard Time", "(GMT+03:00) Iran 
Standard Time");
+            windowsTimeZones.put("Sri Lanka Standard Time", "(GMT+06:00) Sri 
Lanka Standard Time");
+            windowsTimeZones.put("New Zealand Standard Time", "(GMT+12:00) New 
Zealand Standard Time");
+            windowsTimeZones.put("Central Standard Time (Mexico)", 
"(GMT-06:00) Central Standard Time (Mexico)");
+            windowsTimeZones.put("Arabic Standard Time", "(GMT+03:00) Arabic 
Standard Time");
+            windowsTimeZones.put("Egypt Standard Time", "(GMT+02:00) Egypt 
Standard Time");
+            windowsTimeZones.put("E. South America Standard Time", 
"(GMT-03:00) E. South America Standard Time");
+            windowsTimeZones.put("Hawaiian Standard Time", "(GMT-10:00) 
Hawaiian Standard Time");
+            windowsTimeZones.put("Myanmar Standard Time", "(GMT+06:30) Myanmar 
Standard Time");
+            windowsTimeZones.put("Newfoundland Standard Time", "(GMT-03:30) 
Newfoundland Standard Time");
+            windowsTimeZones.put("US Eastern Standard Time", "(GMT-05:00) US 
Eastern Standard Time");
+            windowsTimeZones.put("Canada Central Standard Time", "(GMT-06:00) 
Canada Central Standard Time");
+            windowsTimeZones.put("Yakutsk Standard Time", "(GMT+09:00) Yakutsk 
Standard Time");
+            windowsTimeZones.put("Central Pacific Standard Time", "(GMT+11:00) 
Central Pacific Standard Time");
+            windowsTimeZones.put("Greenwich Standard Time", "(GMT) Greenwich 
Standard Time");
+            windowsTimeZones.put("North Asia Standard Time", "(GMT+07:00) 
North Asia Standard Time");
+            windowsTimeZones.put("SA Eastern Standard Time", "(GMT-03:00) SA 
Eastern Standard Time");
+            windowsTimeZones.put("Azores Standard Time", "(GMT-10:00) Azores 
Standard Time");
+            windowsTimeZones.put("South Africa Standard Time", "(GMT+02:00) 
South Africa Standard Time");
+            windowsTimeZones.put("SA Western Standard Time", "(GMT-04:00) SA 
Western Standard Time");
+            windowsTimeZones.put("Vladivostok Standard Time", "(GMT+10:00) 
Vladivostok Standard Time");
+            windowsTimeZones.put("SE Asia Standard Time", "(GMT+07:00) SE Asia 
Standard Time");
+            windowsTimeZones.put("China Standard Time", "(GMT+08:00) China 
Standard Time");
+            windowsTimeZones.put("Mid-Atlantic Standard Time", "(GMT-02:00) 
Mid-Atlantic Standard Time");
+            windowsTimeZones.put("Central European Standard Time", 
"(GMT+01:00) Central European Standard Time");
+            windowsTimeZones.put("Central Standard Time", "(GMT-06:00) Central 
Standard Time");
+            windowsTimeZones.put("GTB Standard Time", "(GMT+02:00) GTB 
Standard Time");
+            windowsTimeZones.put("Tokyo Standard Time", "(GMT+09:00) Tokyo 
Standard Time");
+            windowsTimeZones.put("Nepal Standard Time", "(GMT+05:45) Nepal 
Standard Time");
+            windowsTimeZones.put("Greenland Standard Time", "(GMT-03:00) 
Greenland Standard Time");
+            windowsTimeZones.put("W. Central Africa Standard Time", 
"(GMT+01:00) W. Central Africa Standard Time");
+            windowsTimeZones.put("Cape Verde Standard Time", "(GMT-01:00) Cape 
Verde Standard Time");
+            windowsTimeZones.put("Pacific Standard Time", "(GMT-08:00) Pacific 
Standard Time");
+            windowsTimeZones.put("Central Europe Standard Time", "(GMT+01:00) 
Central Europe Standard Time");
+            windowsTimeZones.put("West Asia Standard Time", "(GMT+05:00) West 
Asia Standard Time");
+            windowsTimeZones.put("Israel Standard Time", "(GMT+02:00) Israel 
Standard Time");
+            windowsTimeZones.put("FLE Standard Time", "(GMT+02:00) FLE 
Standard Time");
+            windowsTimeZones.put("Afghanistan Standard Time", "(GMT+04:30) 
Afghanistan Standard Time");
+            windowsTimeZones.put("Romance Standard Time", "(GMT+01:00) Romance 
Standard Time");
+            windowsTimeZones.put("E. Europe Standard Time", "(GMT+02:00) E. 
Europe Standard Time");
+            windowsTimeZones.put("Arab Standard Time", "(GMT+03:00) Arab 
Standard Time");
+            windowsTimeZones.put("Ekaterinburg Standard Time", "(GMT+05:00) 
Ekaterinburg Standard Time");
+            windowsTimeZones.put("Korea Standard Time", "(GMT+09:00) Korea 
Standard Time");
+            windowsTimeZones.put("Cen. Australia Standard Time", "(GMT+09:30) 
Cen. Australia Standard Time");
+            windowsTimeZones.put("Georgian Standard Time", "(GMT+04:00) 
Georgian Standard Time");
+            windowsTimeZones.put("E. Australia Standard Time", "(GMT+10:00) E. 
Australia Standard Time");
+            windowsTimeZones.put("Central America Standard Time", "(GMT-06:00) 
Central America Standard Time");
+            windowsTimeZones.put("North Asia East Standard Time", "(GMT+08:00) 
North Asia East Standard Time");
+            windowsTimeZones.put("Central Asia Standard Time", "(GMT+06:00) 
Central Asia Standard Time");
+            windowsTimeZones.put("Fiji Standard Time", "(GMT+12:00) Fiji 
Standard Time");
+            windowsTimeZones.put("Pacific SA Standard Time", "(GMT+04:00) 
Pacific SA Standard Time");
+            windowsTimeZones.put("Tonga Standard Time", "(GMT+13:00) Tonga 
Standard Time");
+            windowsTimeZones.put("Singapore Standard Time", "(GMT+08:00) 
Singapore Standard Time");
+            windowsTimeZones.put("Mountain Standard Time", "(GMT-07:00) 
Mountain Standard Time");
+            windowsTimeZones.put("Atlantic Standard Time", "(GMT-04:00) 
Atlantic Standard Time");
+            windowsTimeZones.put("Samoa Standard Time", "(GMT-11:00) Samoa 
Standard Time");
+            windowsTimeZones.put("Dateline Standard Time", "(GMT-12:00) 
Dateline Standard Time");
+            windowsTimeZones.put("SA Pacific Standard Time", "(GMT-05:00) SA 
Pacific Standard Time");
+            windowsTimeZones.put("West Pacific Standard Time", "(GMT+10:00) 
West Pacific Standard Time");
+            windowsTimeZones.put("N. Central Asia Standard Time", "(GMT+06:00) 
N. Central Asia Standard Time");
+
+            return sortMapByValue(windowsTimeZones);
+        }
+    };
+
+    private ConfigValues defaultTimeZoneConfigKey;
+    private ConfigurationValues defaultTimeZoneConfigurationKey;
+    private Map<String, String> timeZones;
+
+    TimeZoneType(ConfigValues defaultTimeZoneConfigKey, ConfigurationValues 
defaultTimeZoneConfigurationKey) {
+        this.defaultTimeZoneConfigKey = defaultTimeZoneConfigKey;
+        this.defaultTimeZoneConfigurationKey = defaultTimeZoneConfigurationKey;
+    }
+
+    public ConfigValues getDefaultTimeZoneConfigKey() {
+        return defaultTimeZoneConfigKey;
+    }
+
+    public ConfigurationValues getDefaultTimeZoneConfigurationKey() {
+        return defaultTimeZoneConfigurationKey;
+    }
+
+    public Map<String, String> getTimeZoneList() {
+        if (timeZones == null) {
+            timeZones = initializeTimeZoneList();
+        }
+        return timeZones;
+    }
+
+    protected abstract Map<String, String> initializeTimeZoneList();
+
+
+    private static final class TimeZoneTimeExtractComperator implements 
Comparator<Map.Entry<String, String>> {
+        public static final TimeZoneTimeExtractComperator instance = new 
TimeZoneTimeExtractComperator();
+
+
+        // we get a string like "(GMT-04:30) Afghanistan Standard Time"
+        // we use regex to extract the time only and replace it to number
+        // in this sample we get -430
+        public static final String TimeZoneExtractTimePattern = 
".*(GMT[+,-]\\d{2}:\\d{2}).*";
+
+        // we get a string like "(GMT-04:30) Afghanistan Standard Time"
+        // we use regex to extract the time only and replace it to number
+        // in this sample we get -430
+        @Override
+        public int compare(Map.Entry<String, String> o1, Map.Entry<String, 
String> o2) {
+            int a = 0, b = 0;
+            Match match1 = Regex.Match(o1.toString(), 
TimeZoneExtractTimePattern);
+            Match match2 = Regex.Match(o2.toString(), 
TimeZoneExtractTimePattern);
+            if (match1.Success() && match1.Groups().size() > 0) {
+                a = 
Integer.parseInt(match1.Groups().get(1).getValue().substring(3).replace(":", 
"").replace("+", ""));
+            }
+            if (match2.Success() && match2.Groups().size() > 0) {
+                b = 
Integer.parseInt(match2.Groups().get(1).getValue().substring(3).replace(":", 
"").replace("+", ""));
+            }
+
+            if (a == b) {
+                return 0;
+            }
+
+            return (a > b) ? 1 : -1;
+        }
+    }
+
+    private static Map<String, String> sortMapByValue(Map<String, String> map) 
{
+        List<Map.Entry<String, String>> list = new 
LinkedList<Map.Entry<String, String>>(map.entrySet());
+        Collections.sort(list, TimeZoneTimeExtractComperator.instance);
+
+        Map<String, String> result = new LinkedHashMap<String, String>();
+        for (Iterator<Map.Entry<String, String>> it = list.iterator(); 
it.hasNext();) {
+            Map.Entry<String, String> entry = it.next();
+            result.put(entry.getKey(), entry.getValue());
+        }
+        return result;
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java
index b82aa5b..dd3fd2f 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java
@@ -98,7 +98,9 @@
     MaxPeakNetworkQoSValue,
     MaxBurstNetworkQoSValue,
     AverageToPeakRatio,
-    AverageToBurstRatio
+    AverageToBurstRatio,
+    DefaultGeneralTimeZone,
+    DefaultWindowsTimeZone
     ;
 
     public static enum ConfigAuthType {
diff --git 
a/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/TimeZoneTypeTest.java
 
b/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/TimeZoneTypeTest.java
new file mode 100644
index 0000000..0d20050
--- /dev/null
+++ 
b/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/TimeZoneTypeTest.java
@@ -0,0 +1,45 @@
+package org.ovirt.engine.core.common;
+
+
+import org.junit.Test;
+import org.ovirt.engine.core.common.config.ConfigValues;
+import org.ovirt.engine.core.common.queries.ConfigurationValues;
+
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+public class TimeZoneTypeTest {
+
+    private static final TimeZoneType windows = TimeZoneType.WINDOWS_TIMEZONE;
+    private static final TimeZoneType general = TimeZoneType.GENERAL_TIMEZONE;
+
+    @Test
+    public void testWindowsTimeZones() {
+        Map<String, String> map = windows.getTimeZoneList();
+        assertNotNull(map);
+        assertEquals(map.get("GMT Standard Time"), "(GMT) GMT Standard Time");
+    }
+
+    @Test
+    public void testGeneralTimeZones() {
+        Map<String, String> map = general.getTimeZoneList();
+        assertNotNull(map);
+        assertFalse(map.get("Asia/Riyadh78") != null);
+        assertEquals(map.get("Asia/Jerusalem"), "(GMT+02:00) Israel Standard 
Time");
+    }
+
+    @Test
+    public void testDefaultConfigValues() {
+        assertEquals(windows.getDefaultTimeZoneConfigKey(), 
ConfigValues.DefaultWindowsTimeZone);
+        assertEquals(general.getDefaultTimeZoneConfigKey(), 
ConfigValues.DefaultGeneralTimeZone);
+    }
+
+    @Test
+    public void testDefaultConfigurationValues() {
+        assertEquals(windows.getDefaultTimeZoneConfigurationKey(), 
ConfigurationValues.DefaultWindowsTimeZone);
+        assertEquals(general.getDefaultTimeZoneConfigurationKey(), 
ConfigurationValues.DefaultGeneralTimeZone);
+    }
+}
diff --git 
a/backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Match.java
 
b/backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Match.java
index c61edc6..945b337 100644
--- 
a/backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Match.java
+++ 
b/backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Match.java
@@ -18,7 +18,7 @@
             this.Success = success;
             int size = success ? mr.groupCount() : 0;
             for (int x = 1; x <= size; x++) {
-                Groups.add(new Match(mr.group(x), success));
+                Groups.add(new Match(mr.group(x)));
             }
             Value = mr.group();
         } else {
@@ -26,7 +26,7 @@
         }
     }
 
-    public Match(String value, boolean success) {
+    public Match(String value) {
         this.Value = value;
         this.Success = true;
     }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SysprepHandler.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SysprepHandler.java
index fab08a4..555f8ce 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SysprepHandler.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SysprepHandler.java
@@ -23,11 +23,6 @@
     private static Map<String, String> passwordPerDomain = new HashMap<String, 
String>();
     public static final Map<String, Integer> timeZoneIndex = new 
HashMap<String, Integer>();
 
-    // we get a string like "(GMT-04:30) Afghanistan Standard Time"
-    // we use regex to extract the time only and replace it to number
-    // in this sample we get -430
-    public static String TimzeZoneExtractTimePattern = 
".*(GMT[+,-]\\d{2}:\\d{2}).*";
-
     private static Log log = LogFactory.getLog(SysprepHandler.class);
 
     static {
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Compat.gwt.xml
 
b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Compat.gwt.xml
index 89d02c4..ba33e82 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Compat.gwt.xml
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Compat.gwt.xml
@@ -22,6 +22,7 @@
                <include name="compat/DateTime.java" />
                <include name="compat/DayOfWeek.java" />
                <include name="compat/RegEx.java" />
+        <include name="compat/MatchGroups.java" />
 
                <!-- Required by common->action->VdcActionParametersBase.java 
-->
                <include name="compat/TransactionScopeOption.java" />
diff --git 
a/frontend/webadmin/modules/gwt-extension/src/main/java/org/ovirt/engine/ui/uioverrides/org/ovirt/engine/core/compat/Match.java
 
b/frontend/webadmin/modules/gwt-extension/src/main/java/org/ovirt/engine/ui/uioverrides/org/ovirt/engine/core/compat/Match.java
index 23e064f..9a6709e 100644
--- 
a/frontend/webadmin/modules/gwt-extension/src/main/java/org/ovirt/engine/ui/uioverrides/org/ovirt/engine/core/compat/Match.java
+++ 
b/frontend/webadmin/modules/gwt-extension/src/main/java/org/ovirt/engine/ui/uioverrides/org/ovirt/engine/core/compat/Match.java
@@ -11,25 +11,30 @@
  */
 public class Match {
 
-    private final int length;
     private final boolean success;
     private final String value;
+    private final MatchGroups groups = new MatchGroups();
 
     public Match(MatchResult matchResult) {
         if (matchResult != null) {
             value = matchResult.getGroup(0);
-            length = matchResult.getGroupCount();
+            for (int i = 1; i <= matchResult.getGroupCount(); i++) {
+                groups.add(new Match(matchResult.getGroup(i)));
+            }
             success = true;
         } else {
             value = "";
-            length = 0;
             success = false;
-
         }
     }
 
-    public int getLength() {
-        return length;
+    public Match(String value) {
+        this.value = value;
+        this.success = true;
+    }
+
+    public MatchGroups Groups() {
+        return groups;
     }
 
     public String getValue() {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TimeZoneModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TimeZoneModel.java
index eaad70b..123e0e6 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TimeZoneModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TimeZoneModel.java
@@ -1,69 +1,26 @@
 package org.ovirt.engine.ui.uicommonweb.models.vms;
 
+import org.ovirt.engine.core.common.TimeZoneType;
+import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.ovirt.engine.core.common.TimeZoneType;
-import org.ovirt.engine.ui.frontend.AsyncQuery;
-import org.ovirt.engine.ui.frontend.INewAsyncCallback;
-import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
-
 
 
 public class TimeZoneModel {
     private static final Map<TimeZoneType, Iterable<TimeZoneModel>> 
cachedTimeZoneModels = new HashMap<TimeZoneType, Iterable<TimeZoneModel>>();
-    private static final Map<TimeZoneType, Map<String, String>> 
cachedTimeZones = new HashMap<TimeZoneType, Map<String,String>>();
-    private static final Map<TimeZoneType, String> cachedDefaultTimeZoneKeys = 
new HashMap<TimeZoneType, String>();
 
     public static Iterable<TimeZoneModel> getTimeZones(TimeZoneType 
timeZoneType) {
         return cachedTimeZoneModels.get(timeZoneType);
     }
 
-    public static String getDefaultTimeZoneKey(TimeZoneType timeZoneType) {
-        return cachedDefaultTimeZoneKeys.get(timeZoneType);
-    }
-
-    /**
-     * Invoke an action supplied in <code>postUpdateDefaultTimeZoneKey</code>
-     * such that it is guaranteed that the given type of default time zone is 
already loaded and cached
-     * before its invocation
-     */
-    public static void withLoadedDefaultTimeZoneKey(TimeZoneType timeZoneType, 
Runnable postUpdateDefaultTimeZoneKey) {
-        if (getDefaultTimeZoneKey(timeZoneType) == null) {
-            updateDefaultTimeZoneKey(timeZoneType, 
postUpdateDefaultTimeZoneKey);
-        } else {
-            postUpdateDefaultTimeZoneKey.run();
+    static {
+        for (TimeZoneType timeZoneType : TimeZoneType.values()) {
+            mapListModels(timeZoneType, timeZoneType.getTimeZoneList());
         }
-    }
-
-    /**
-     * Invoke an action supplied in <code>postUpdateTimeZones</code>
-     * such that it is guaranteed that list of time zones of given type is 
already loaded and cached
-     * before its invocation
-     */
-    public static void withLoadedTimeZones(TimeZoneType timeZoneType, Runnable 
postUpdateTimeZones) {
-        if (getTimeZones(timeZoneType) == null) {
-            updateTimeZones(timeZoneType, postUpdateTimeZones);
-        } else {
-            postUpdateTimeZones.run();
-        }
-
-    }
-
-    private static void updateTimeZones(final TimeZoneType timeZoneType, final 
Runnable postUpdateTimeZones) {
-
-        AsyncDataProvider.getTimeZoneList(new AsyncQuery(null,
-                new INewAsyncCallback() {
-                    @Override
-                    public void onSuccess(Object target, Object returnValue) {
-                        Map<String, String> timeZones = (Map<String, String>) 
returnValue;
-                        cachedTimeZones.put(timeZoneType, timeZones);
-                        mapListModels(timeZoneType, timeZones);
-                        postUpdateTimeZones.run();
-                    }
-                }), timeZoneType);
     }
 
     private static void mapListModels(TimeZoneType timeZoneType, Map<String, 
String> timeZones) {
@@ -73,21 +30,6 @@
             models.add(new TimeZoneModel(entry.getKey(), timeZoneType));
         }
         cachedTimeZoneModels.put(timeZoneType, models);
-    }
-
-
-    private static void updateDefaultTimeZoneKey(final TimeZoneType 
timeZoneType, final Runnable postUpdateDefaultTimeZone) {
-
-        AsyncDataProvider.getDefaultTimeZone(new AsyncQuery(null,
-                new INewAsyncCallback() {
-                    @Override
-                    public void onSuccess(Object target, Object returnValue) {
-
-                        cachedDefaultTimeZoneKeys.put(timeZoneType, (String) 
returnValue);
-                        postUpdateDefaultTimeZone.run();
-
-                    }
-                }), timeZoneType);
     }
 
     private String timeZoneKey = null;
@@ -109,10 +51,10 @@
 
     public String getDisplayValue() {
         if (isDefault()) {
-            final String defaultTimeZoneKey = 
getDefaultTimeZoneKey(timeZoneType);
-            return cachedTimeZones.get(timeZoneType).get(defaultTimeZoneKey);
+            final String defaultTimeZoneKey = (String) 
AsyncDataProvider.getConfigValuePreConverted(timeZoneType.getDefaultTimeZoneConfigurationKey());
+            return timeZoneType.getTimeZoneList().get(defaultTimeZoneKey);
         } else {
-            return cachedTimeZones.get(timeZoneType).get(timeZoneKey);
+            return timeZoneType.getTimeZoneList().get(timeZoneKey);
         }
     }
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java
index c656acb..a0522d8 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java
@@ -190,28 +190,15 @@
 
     protected void updateDefaultTimeZone()
     {
-        TimeZoneModel.withLoadedDefaultTimeZoneKey(getTimeZoneType(), new 
Runnable() {
-
-            @Override
-            public void run() {
-                doUpdateTimeZone(null);
-            }
-
-        });
+        doUpdateTimeZone(null);
     }
 
     private void doUpdateTimeZone(final String selectedTimeZone) {
-        TimeZoneModel.withLoadedTimeZones(getTimeZoneType(), new Runnable() {
-
-            @Override
-            public void run() {
-                final Iterable<TimeZoneModel> timeZones = 
TimeZoneModel.getTimeZones(getTimeZoneType());
-                getModel().getTimeZone().setItems(timeZones);
-                
getModel().getTimeZone().setSelectedItem(Linq.firstOrDefault(timeZones, new 
Linq.TimeZonePredicate(selectedTimeZone)));
-                
getModel().getTimeZone().setChangeProhibitionReason(constants.timeZoneNotChangeableForLinuxVms());
-                
getModel().getTimeZone().setIsChangable(!getModel().getIsLinuxOS());
-            }
-        });
+        final Iterable<TimeZoneModel> timeZones = 
TimeZoneModel.getTimeZones(getTimeZoneType());
+        getModel().getTimeZone().setItems(timeZones);
+        
getModel().getTimeZone().setSelectedItem(Linq.firstOrDefault(timeZones, new 
Linq.TimeZonePredicate(selectedTimeZone)));
+        
getModel().getTimeZone().setChangeProhibitionReason(constants.timeZoneNotChangeableForLinuxVms());
+        getModel().getTimeZone().setIsChangable(!getModel().getIsLinuxOS());
     }
 
     public TimeZoneType getTimeZoneType() {


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifd36656bd4f0288e86b1cbd46d702fa68051e28b
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Martin Betak <mbe...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to