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