Attached Files | issue32039.diff [^] (12,007 bytes) 2016-01-28 16:02 [Show Content] [Hide Content]diff --git a/modules/org.openbravo.client.application/src/org/openbravo/client/application/CachedPreference.java b/modules/org.openbravo.client.application/src/org/openbravo/client/application/CachedPreference.java
new file mode 100644
--- /dev/null
+++ b/modules/org.openbravo.client.application/src/org/openbravo/client/application/CachedPreference.java
@@ -0,0 +1,139 @@
+/*
+ *************************************************************************
+ * The contents of this file are subject to the Openbravo Public License
+ * Version 1.1 (the "License"), being the Mozilla Public License
+ * Version 1.1 with a permitted attribution clause; you may not use this
+ * file except in compliance with the License. You may obtain a copy of
+ * the License at http://www.openbravo.com/legal/license.html
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * The Original Code is Openbravo ERP.
+ * The Initial Developer of the Original Code is Openbravo SLU
+ * All portions are Copyright (C) 2016 Openbravo SLU
+ * All Rights Reserved.
+ * Contributor(s): ______________________________________.
+ ************************************************************************
+ */
+package org.openbravo.client.application;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.enterprise.context.ApplicationScoped;
+
+import org.openbravo.dal.core.OBContext;
+import org.openbravo.dal.service.OBDal;
+import org.openbravo.erpCommon.businessUtility.Preferences;
+import org.openbravo.erpCommon.utility.PropertyException;
+import org.openbravo.model.ad.system.Client;
+import org.openbravo.model.common.enterprise.Organization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class is used as a singleton to keep the value of some preferences in cache during the
+ * application life cycle, avoiding the time spent to compute the preference value. The preference
+ * values that can be cached by this class are those defined at System level.
+ *
+ * This class it is also used by the
+ * {@link org.openbravo.client.application.event.PreferenceEventHandler} class to detect changes in
+ * the cached preferences values, and it that case it invalidates the stored value. This way the
+ * next time it is requested, the current value will be retrieved from database again.
+ *
+ * This mechanism for automatic refresh the preference value, only works on environments with a
+ * single JVM. In case of Tomcat clustering environments (multiple JVM) it will be necessary to
+ * restart Tomcat to retrieve the new value of the preference in every JVM.
+ *
+ */
+@ApplicationScoped
+public class CachedPreference {
+ private static final Logger log = LoggerFactory.getLogger(CachedPreference.class);
+ private List<String> propertyList = new ArrayList<String>(
+ Arrays.asList("OBJSON_AllowUnpagedDatasourceManualRequest"));
+ private Map<String, String> cachedPreference = new HashMap<String, String>();
+
+ /**
+ * It returns a String with the value of the preference whose related property name is entered as
+ * parameter. In case the value is not stored in cache, then the value will be retrieved from
+ * database.
+ *
+ * @param propertyName
+ * The name of the property related to the preference
+ *
+ * @return A String with the value of the cached preference
+ */
+ public String getPreferenceValue(String propertyName) {
+ long t = System.nanoTime();
+ if (!cachedPreference.containsKey(propertyName)) {
+ try {
+ OBContext.setAdminMode(false);
+ Client systemClient = OBDal.getInstance().get(Client.class, "0");
+ Organization asterisk = OBDal.getInstance().get(Organization.class, "0");
+ String value = Preferences.getPreferenceValue(propertyName, true, systemClient, asterisk,
+ null, null, null);
+ setPreferenceValue(propertyName, value);
+ } catch (PropertyException ignore) {
+ // Ignore the exception, caused because the preference was not found
+ setPreferenceValue(propertyName, null);
+ } finally {
+ OBContext.restorePreviousMode();
+ }
+ }
+ log.debug("preference value retrieved in {} ns", (System.nanoTime() - t));
+ return cachedPreference.get(propertyName);
+ }
+
+ /**
+ * Checks if the preference related to the property name entered as parameter is contained in the
+ * list of cached preferences.
+ *
+ * @param propertyName
+ * The name of the property related to the preference
+ * @return true if the preference related to the property name is a cached preference, false
+ * otherwise
+ */
+ public boolean isCachedPreference(String propertyName) {
+ return propertyList.contains(propertyName);
+ }
+
+ /**
+ * Sets the cached value of the preference. This method is defined as synchronized in order to
+ * avoid concurrency problems.
+ *
+ * @param propertyName
+ * The name of the property related to the preference
+ * @param preferenceValue
+ * String with the value assigned to the preference
+ */
+ public synchronized void setPreferenceValue(String propertyName, String preferenceValue) {
+ this.cachedPreference.put(propertyName, preferenceValue);
+ }
+
+ /**
+ * Invalidates the cached value of the preference. This method is defined as synchronized in order
+ * to avoid concurrency problems.
+ *
+ * @param propertyName
+ * The name of the property related to the preference
+ */
+ public synchronized void invalidatePreferenceValue(String propertyName) {
+ this.cachedPreference.remove(propertyName);
+ }
+
+ /**
+ * Adds a new preference into the set of preferences whose value is stored in cache.
+ *
+ * @param propertyName
+ * The name of the property related to the preference to be cached
+ */
+ public void addCachedPreference(String propertyName) {
+ if (!isCachedPreference(propertyName)) {
+ propertyList.add(propertyName);
+ }
+ }
+}
diff --git a/modules/org.openbravo.client.application/src/org/openbravo/client/application/event/PreferenceEventHandler.java b/modules/org.openbravo.client.application/src/org/openbravo/client/application/event/PreferenceEventHandler.java
--- a/modules/org.openbravo.client.application/src/org/openbravo/client/application/event/PreferenceEventHandler.java
+++ b/modules/org.openbravo.client.application/src/org/openbravo/client/application/event/PreferenceEventHandler.java
@@ -11,7 +11,7 @@
* under the License.
* The Original Code is Openbravo ERP.
* The Initial Developer of the Original Code is Openbravo SLU
- * All portions are Copyright (C) 2015 Openbravo SLU
+ * All portions are Copyright (C) 2015-2016 Openbravo SLU
* All Rights Reserved.
* Contributor(s): ______________________________________.
************************************************************************
@@ -25,20 +25,16 @@
import org.apache.log4j.Logger;
import org.openbravo.base.model.Entity;
import org.openbravo.base.model.ModelProvider;
+import org.openbravo.client.application.CachedPreference;
import org.openbravo.client.kernel.event.EntityDeleteEvent;
import org.openbravo.client.kernel.event.EntityNewEvent;
import org.openbravo.client.kernel.event.EntityPersistenceEventObserver;
import org.openbravo.client.kernel.event.EntityUpdateEvent;
import org.openbravo.model.ad.domain.Preference;
-import org.openbravo.service.json.UnpagedRequestCachedPreference;
/**
* Listens to delete, update and save events for the {@link Preference} entity. If it detects a
- * change in the 'OBJSON_AllowUnpagedDatasourceManualRequest' preference it invalidates its cached
- * value by setting it to null.
- *
- * {@link "https://issues.openbravo.com/view.php?id=30204"}
- *
+ * change in any of the cached preferences it invalidates its cached value.
*/
public class PreferenceEventHandler extends EntityPersistenceEventObserver {
@@ -46,7 +42,7 @@
.getEntity(Preference.ENTITY_NAME) };
protected Logger logger = Logger.getLogger(this.getClass());
@Inject
- private UnpagedRequestCachedPreference unpagedRequestPreference;
+ private CachedPreference cachedPreference;
@Override
protected Entity[] getObservedEntities() {
@@ -58,9 +54,7 @@
return;
}
final Preference preference = (Preference) event.getTargetInstance();
- if (unpagedRequestPreference.getProperty().equals(preference.getProperty())) {
- unpagedRequestPreference.setPreferenceValue(null);
- }
+ invalidateCachedPreferenceValue(preference.getProperty());
}
public void onUpdate(@Observes EntityUpdateEvent event) {
@@ -68,9 +62,7 @@
return;
}
final Preference preference = (Preference) event.getTargetInstance();
- if (unpagedRequestPreference.getProperty().equals(preference.getProperty())) {
- unpagedRequestPreference.setPreferenceValue(null);
- }
+ invalidateCachedPreferenceValue(preference.getProperty());
}
public void onDelete(@Observes EntityDeleteEvent event) {
@@ -78,8 +70,12 @@
return;
}
final Preference preference = (Preference) event.getTargetInstance();
- if (unpagedRequestPreference.getProperty().equals(preference.getProperty())) {
- unpagedRequestPreference.setPreferenceValue(null);
+ invalidateCachedPreferenceValue(preference.getProperty());
+ }
+
+ private void invalidateCachedPreferenceValue(String property) {
+ if (cachedPreference.isCachedPreference(property)) {
+ cachedPreference.invalidatePreferenceValue(property);
}
}
}
diff --git a/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java b/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
--- a/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
+++ b/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
@@ -11,7 +11,7 @@
* under the License.
* The Original Code is Openbravo ERP.
* The Initial Developer of the Original Code is Openbravo SLU
- * All portions are Copyright (C) 2009-2015 Openbravo SLU
+ * All portions are Copyright (C) 2009-2016 Openbravo SLU
* All Rights Reserved.
* Contributor(s): ______________________________________.
************************************************************************
@@ -42,6 +42,7 @@
import org.openbravo.base.structure.BaseOBObject;
import org.openbravo.base.util.Check;
import org.openbravo.base.weld.WeldUtils;
+import org.openbravo.client.application.CachedPreference;
import org.openbravo.dal.core.DalUtil;
import org.openbravo.dal.core.OBContext;
import org.openbravo.dal.service.OBDal;
@@ -73,8 +74,10 @@
private static final String ADD_FLAG = "_doingAdd";
+ private static final String ALLOW_UNPAGED_DS_MANUAL_REQUEST = "OBJSON_AllowUnpagedDatasourceManualRequest";
+
@Inject
- private UnpagedRequestCachedPreference unpagedRequestPreference;
+ private CachedPreference cachedPreference;
private static DefaultJsonDataService instance = WeldUtils
.getInstanceFromStaticBeanManager(DefaultJsonDataService.class);
@@ -473,7 +476,8 @@
// for standard tab and selector datasources pagination is mandatory
throw new OBException(OBMessageUtils.messageBD("OBJSON_NoPagedFetch"));
- } else if (!"Y".equals(unpagedRequestPreference.getPreferenceValue()) && !isWsCall) {
+ } else if (!"Y".equals(cachedPreference.getPreferenceValue(ALLOW_UNPAGED_DS_MANUAL_REQUEST))
+ && !isWsCall) {
throw new OBException(OBMessageUtils.messageBD("OBJSON_NoPagedFetchManual"));
}
}
|