Daniel Erez has uploaded a new change for review.

Change subject: core,webadmin: GetConfigurationValuesQuery for UI cache
......................................................................

core,webadmin: GetConfigurationValuesQuery for UI cache

Added 'GetConfigurationValuesQuery' for fetching and caching all
configuration values (ConfigurationValues enum) on UI startup.
Apart of the obvious performance improvement, using a single query
for retrieval (instead of a query for each value), results in a
simpler/cleaner UI code.

Core:
* GetConfigurationValuesQuery - new query
* Version - added 3_2 constant for query's usage.
* DBConfigUtils - lowered some logs from 'warn' to 'debug' for
  preventing redundant warnings on each query's execute.

UI:
* AsyncDataProvider:
** CacheConfigValues - caching the 'pre-converted (raw)'
   configuration values returned from 'GetConfigurationValuesQuery'.
** GetConfigValue - getting a raw configuration value from the cache
   (for future usage - requires value conversion if needed).
** GetConfigFromCache - removed legacy 'GetConfigurationValue' call.
* LoginModel/UserPortalLoginModel - caching values after login.
* DataCenterNetworkListModel/HostInterfaceListModel -
  'GetManagementNetworkName' call has relied on the fact that
  the query returns asynchronously - caused a NPE on startup.

Change-Id: Id51a9f86bceef07de728335643b16c0554b6876c
Signed-off-by: Daniel Erez <de...@redhat.com>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetConfigurationValuesQuery.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
M 
backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Version.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/generic/DBConfigUtils.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterNetworkListModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostInterfaceListModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java
9 files changed, 133 insertions(+), 36 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/63/8563/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetConfigurationValuesQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetConfigurationValuesQuery.java
new file mode 100644
index 0000000..415adaa
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetConfigurationValuesQuery.java
@@ -0,0 +1,66 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.ovirt.engine.core.common.config.Config;
+import org.ovirt.engine.core.common.config.ConfigValues;
+import org.ovirt.engine.core.common.queries.ConfigurationValues;
+import org.ovirt.engine.core.common.queries.GetConfigurationValueParameters;
+import org.ovirt.engine.core.compat.EnumCompat;
+import org.ovirt.engine.core.compat.KeyValuePairCompat;
+import org.ovirt.engine.core.compat.Version;
+
+public class GetConfigurationValuesQuery<P extends 
GetConfigurationValueParameters> extends QueriesCommandBase<P> {
+
+    private static final List<String> versions =
+            Arrays.asList(Config.DefaultConfigurationVersion,
+                    Version.v2_2.toString(),
+                    Version.v3_0.toString(),
+                    Version.v3_1.toString(),
+                    Version.v3_2.toString());
+
+    public GetConfigurationValuesQuery(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void executeQueryCommand() {
+        Map<Map.Entry<ConfigurationValues, String>, Object> configValuesMap =
+                new HashMap<Map.Entry<ConfigurationValues, String>, Object>();
+
+        for (ConfigurationValues configValue : ConfigurationValues.values()) {
+            // Ignore an admin configuration value on filtered mode
+            // Ignore a configuration value that doesn't exist in ConfigValues 
enum
+            if (!shouldReturnValue(configValue) || 
!EnumCompat.IsDefined(ConfigValues.class, configValue.toString())) {
+                continue;
+            }
+
+            // Adding a configuration value for each version
+            for (String version : versions) {
+                Map.Entry<ConfigurationValues, String> key =
+                        new KeyValuePairCompat<ConfigurationValues, 
String>(configValue, version);
+                Object value =
+                        Config.<Object> 
GetValue(ConfigValues.valueOf(configValue.toString()), version);
+
+                configValuesMap.put(key, value);
+            }
+        }
+
+        getQueryReturnValue().setReturnValue(configValuesMap);
+    }
+
+    /**
+     * Validates if the query should return anything or not, according to the 
user's permissions:
+     * <ul>
+     * <li>If the query is run as an administrator (note that since we've 
reached the {@link #executeQueryCommand()} method,
+     * we've already validated that the use is indeed an administrator), the 
results from the database queries should be returned.</li>
+     * <li>If the query is run as a user, it may return results <b>ONLY</b> if 
the configuration value has {@link 
org.ovirt.engine.core.common.queries.ConfigurationValues.ConfigAuthType#User}.</li>
+     * </ul>
+     */
+    private boolean shouldReturnValue(ConfigurationValues configValue) {
+        return !getParameters().isFiltered() || !configValue.isAdmin();
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
index a1c5bee..21831a5 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
@@ -144,6 +144,7 @@
 
     // Configuration values
     GetConfigurationValue(VdcQueryAuthType.User),
+    GetConfigurationValues(VdcQueryAuthType.User),
     GetTimeZones(VdcQueryAuthType.User),
     GetDefualtTimeZone(VdcQueryAuthType.User),
     GetDiskConfigurationList(VdcQueryAuthType.User),
diff --git 
a/backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Version.java
 
b/backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Version.java
index df3b28c..8dc0cfa 100644
--- 
a/backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Version.java
+++ 
b/backend/manager/modules/compat/src/main/java/org/ovirt/engine/core/compat/Version.java
@@ -13,6 +13,7 @@
     public static final Version v2_2 = new Version(2, 2);
     public static final Version v3_0 = new Version(3, 0);
     public static final Version v3_1 = new Version(3, 1);
+    public static final Version v3_2 = new Version(3, 2);
 
 
     public Version(String value) {
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/generic/DBConfigUtils.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/generic/DBConfigUtils.java
index 3f59fbb..387e236 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/generic/DBConfigUtils.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/generic/DBConfigUtils.java
@@ -239,9 +239,9 @@
                 Map<String, Object> defaultValues = new HashMap<String, 
Object>();
                 defaultValues.put(version, returnValue);
                 _vdcOptionCache.put(option.getoption_name(), defaultValues);
-                log.warn("Adding new value to configuration cache.");
+                log.debug("Adding new value to configuration cache.");
             }
-            log.warnFormat("Didn't find the value of {0} in DB for version {1} 
- using default: {2}",
+            log.debugFormat("Didn't find the value of {0} in DB for version 
{1} - using default: {2}",
                     name, version, returnValue);
         }
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
index 2bd2c60..ae00ab3 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
@@ -120,6 +120,9 @@
     private static HashMap<Map.Entry<ConfigurationValues, String>, Object> 
cachedConfigValues =
             new HashMap<Map.Entry<ConfigurationValues, String>, Object>();
 
+    private static HashMap<Map.Entry<ConfigurationValues, String>, Object> 
cachedConfigValuesPreConvert =
+            new HashMap<Map.Entry<ConfigurationValues, String>, Object>();
+
     public static void GetDomainListViaPublic(AsyncQuery aQuery, boolean 
filterInternalDomain) {
         aQuery.converterCallback = new IAsyncConverter() {
             @Override
@@ -2109,6 +2112,35 @@
     }
 
     /**
+     * Cache configuration values [raw (not converted) values from vdc_options 
table].
+     */
+    public static void CacheConfigValues(AsyncQuery aQuery) {
+        aQuery.converterCallback = new IAsyncConverter() {
+            @Override
+            public Object Convert(Object returnValue, AsyncQuery _asyncQuery)
+            {
+                if (returnValue != null) {
+                    
cachedConfigValuesPreConvert.putAll((HashMap<Map.Entry<ConfigurationValues, 
String>, Object>) returnValue);
+                }
+                return cachedConfigValuesPreConvert;
+            }
+        };
+
+        Frontend.RunQuery(VdcQueryType.GetConfigurationValues, new 
GetConfigurationValueParameters(), aQuery);
+    }
+
+    /**
+     * Get configuration value from 'cachedConfigValuesPreConvert'
+     * (raw values from vdc_options table).
+     */
+    public static Object GetConfigValue(ConfigurationValues configValue, 
String version) {
+        Map.Entry<ConfigurationValues, String> key =
+                new KeyValuePairCompat<ConfigurationValues, 
String>(configValue, version);
+
+        return cachedConfigValuesPreConvert.get(key);
+    }
+
+    /**
      * method to get an item from config while caching it (config is not 
supposed to change during a session)
      * @param aQuery
      *            an async query
@@ -2116,43 +2148,31 @@
      *            a converter for the async query
      */
     public static void GetConfigFromCache(GetConfigurationValueParameters 
parameters, AsyncQuery aQuery) {
-
         // cache key
         final Map.Entry<ConfigurationValues, String> config_key =
                 new KeyValuePairCompat<ConfigurationValues, 
String>(parameters.getConfigValue(),
                         parameters.getVersion());
 
+        Object returnValue = null;
+
         if (cachedConfigValues.containsKey(config_key)) {
-            // Cache hit
-            Object cached = cachedConfigValues.get(config_key);
-            // return result
-            if (cached != null) {
-                aQuery.asyncCallback.OnSuccess(aQuery.getModel(), cached);
-                return;
+            // cache hit
+            returnValue = cachedConfigValues.get(config_key);
+        }
+        // cache miss: convert configuration value using query's converter
+        // and call asyncCallback's OnSuccess
+        else if (cachedConfigValuesPreConvert.containsKey(config_key)) {
+            returnValue = cachedConfigValuesPreConvert.get(config_key);
+
+            // run converter
+            if (aQuery.converterCallback != null) {
+                returnValue = aQuery.converterCallback.Convert(returnValue, 
aQuery);
+            }
+            if (returnValue != null) {
+                cachedConfigValues.put(config_key, returnValue);
             }
         }
-
-        // save original converter
-        final IAsyncConverter origConverter = aQuery.converterCallback;
-
-        // Cache miss: run the query and replace the converter to cache the 
results
-        aQuery.converterCallback = new IAsyncConverter() {
-
-            @Override
-            public Object Convert(Object returnValue, AsyncQuery asyncQuery) {
-                // run original converter
-                if (origConverter != null) {
-                    returnValue = origConverter.Convert(returnValue, 
asyncQuery);
-                }
-                if (returnValue != null) {
-                    cachedConfigValues.put(config_key, returnValue);
-                }
-                return returnValue;
-            }
-        };
-
-        // run query
-        Frontend.RunQuery(VdcQueryType.GetConfigurationValue, parameters, 
aQuery);
+        aQuery.asyncCallback.OnSuccess(aQuery.getModel(), returnValue);
     }
 
     /**
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java
index db66909..92ec833 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java
@@ -308,7 +308,7 @@
                     }
                     else
                     {
-                        loginModel.getLoggedInEvent().raise(this, 
EventArgs.Empty);
+                        raiseLoggedInEvent();
                     }
                     StopProgress();
                 }
@@ -320,6 +320,17 @@
                 _asyncQuery);
     }
 
+    protected void raiseLoggedInEvent() {
+        // Cache all configurations values before logging-in
+        AsyncDataProvider.CacheConfigValues(new AsyncQuery(this, new 
INewAsyncCallback() {
+            @Override
+            public void OnSuccess(Object target, Object returnValue) {
+                LoginModel loginModel = (LoginModel) target;
+                loginModel.getLoggedInEvent().raise(this, EventArgs.Empty);
+            }
+        }));
+    }
+
     public void AutoLogin(VdcUser user)
     {
         loggingInAutomatically = true;
@@ -327,7 +338,7 @@
         getDomain().setSelectedItem(user.getDomainControler());
         disableLoginScreen();
         setLoggedUser(user);
-        getLoggedInEvent().raise(this, EventArgs.Empty);
+        raiseLoggedInEvent();
     }
 
     protected void disableLoginScreen() {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterNetworkListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterNetworkListModel.java
index 83cf1b6..fa32a58 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterNetworkListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterNetworkListModel.java
@@ -121,7 +121,6 @@
             @Override
             public void OnSuccess(Object model, Object returnValue) {
                 ENGINE_NETWORK = (String) returnValue;
-                UpdateActionAvailability();
             }
         }));
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostInterfaceListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostInterfaceListModel.java
index 65d5317..8398317 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostInterfaceListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostInterfaceListModel.java
@@ -337,7 +337,6 @@
             @Override
             public void OnSuccess(Object model, Object returnValue) {
                 ENGINE_NETWORK_NAME = (String) returnValue;
-                UpdateActionAvailability();
             }
         }));
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java
index 828c174..3660f23 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java
@@ -206,7 +206,7 @@
                         if (success)
                         {
                             model.setLoggedUser((VdcUser) 
returnValue.getActionReturnValue());
-                            model.getLoggedInEvent().raise(this, 
EventArgs.Empty);
+                            model.raiseLoggedInEvent();
                         }
                         else
                         {


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

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

Reply via email to