details: https://code.openbravo.com/erp/devel/pi/rev/e60dfabc36f9
changeset: 23385:e60dfabc36f9
user: Asier Lostalé <asier.lostale <at> openbravo.com>
date: Tue May 27 14:17:08 2014 +0200
summary: fixed bug 26683: prevent unpaged datasource requests
-unpaged requests for standard windows grids raise an exception
-other unpged requests are served but a warn message is logged
diffstat:
modules/org.openbravo.service.json/src-db/database/sourcedata/AD_MESSAGE.xml
| 12 ++
modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
| 48 +++++++++-
modules/org.openbravo.service.json/src/org/openbravo/service/json/JsonConstants.java
| 3 +-
3 files changed, 61 insertions(+), 2 deletions(-)
diffs (121 lines):
diff -r 789521cc4e6f -r e60dfabc36f9
modules/org.openbravo.service.json/src-db/database/sourcedata/AD_MESSAGE.xml
---
a/modules/org.openbravo.service.json/src-db/database/sourcedata/AD_MESSAGE.xml
Mon May 26 16:55:57 2014 +0200
+++
b/modules/org.openbravo.service.json/src-db/database/sourcedata/AD_MESSAGE.xml
Tue May 27 14:17:08 2014 +0200
@@ -12,6 +12,18 @@
<!--0611ACA6E69841D7AC7D7F34308E2780-->
<ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
<!--0611ACA6E69841D7AC7D7F34308E2780--></AD_MESSAGE>
+<!--1F2DA42F35A7413BACE558B6C621980D--><AD_MESSAGE>
+<!--1F2DA42F35A7413BACE558B6C621980D-->
<AD_MESSAGE_ID><![CDATA[1F2DA42F35A7413BACE558B6C621980D]]></AD_MESSAGE_ID>
+<!--1F2DA42F35A7413BACE558B6C621980D-->
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--1F2DA42F35A7413BACE558B6C621980D--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--1F2DA42F35A7413BACE558B6C621980D--> <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--1F2DA42F35A7413BACE558B6C621980D-->
<VALUE><![CDATA[OBJSON_NoPagedFetch]]></VALUE>
+<!--1F2DA42F35A7413BACE558B6C621980D--> <MSGTEXT><![CDATA[Data was tried to
be fetched from server without pagination. Request was aborted to prevent
server performance issues. This is most likely a bug, please contact your
System Administrator.]]></MSGTEXT>
+<!--1F2DA42F35A7413BACE558B6C621980D--> <MSGTYPE><![CDATA[E]]></MSGTYPE>
+<!--1F2DA42F35A7413BACE558B6C621980D-->
<AD_MODULE_ID><![CDATA[F8D1B3ECB3474E8DA5C216473C840DF1]]></AD_MODULE_ID>
+<!--1F2DA42F35A7413BACE558B6C621980D-->
<ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
+<!--1F2DA42F35A7413BACE558B6C621980D--></AD_MESSAGE>
+
<!--3038E4EC493149F08F9701F22B89176B--><AD_MESSAGE>
<!--3038E4EC493149F08F9701F22B89176B-->
<AD_MESSAGE_ID><![CDATA[3038E4EC493149F08F9701F22B89176B]]></AD_MESSAGE_ID>
<!--3038E4EC493149F08F9701F22B89176B-->
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r 789521cc4e6f -r e60dfabc36f9
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
Mon May 26 16:55:57 2014 +0200
+++
b/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
Tue May 27 14:17:08 2014 +0200
@@ -42,7 +42,9 @@
import org.openbravo.dal.core.OBContext;
import org.openbravo.dal.service.OBDal;
import org.openbravo.database.SessionInfo;
+import org.openbravo.erpCommon.utility.OBMessageUtils;
import org.openbravo.service.json.JsonToDataConverter.JsonConversionError;
+import org.openbravo.userinterface.selector.SelectorConstants;
/**
* Implements generic data operations which have parameters and json as an
input and return results
@@ -358,6 +360,24 @@
final String startRowStr =
parameters.get(JsonConstants.STARTROW_PARAMETER);
final String endRowStr = parameters.get(JsonConstants.ENDROW_PARAMETER);
+ final JSONObject criteria = JsonUtils.buildCriteria(parameters);
+
+ if ((StringUtils.isEmpty(startRowStr) || StringUtils.isEmpty(endRowStr))
+ && !isIDCriteria(criteria)) {
+ // pagination is not set, this is most likely a bug
+ String paramMsg = "";
+ for (String paramKey : parameters.keySet()) {
+ paramMsg += paramKey + ":" + parameters.get(paramKey) + "\n";
+ }
+ log.warn("Fetching data without pagination, this can cause perfomance
issues. Parameters: "
+ + paramMsg);
+
+ if (parameters.containsKey(JsonConstants.TAB_PARAMETER)
+ ||
parameters.containsKey(SelectorConstants.DS_REQUEST_SELECTOR_ID_PARAMETER)) {
+ // for standard tab and selector datasources pagination is mandatory
+ throw new OBException(OBMessageUtils.messageBD("OBJSON_NoPagedFetch"));
+ }
+ }
boolean directNavigation = parameters.containsKey("_directNavigation")
&& "true".equals(parameters.get("_directNavigation"))
@@ -377,7 +397,7 @@
}
}
- queryService.setCriteria(JsonUtils.buildCriteria(parameters));
+ queryService.setCriteria(criteria);
if (parameters.get(JsonConstants.NO_ACTIVE_FILTER) != null
&& parameters.get(JsonConstants.NO_ACTIVE_FILTER).equals("true")) {
@@ -894,4 +914,30 @@
protected enum DataSourceAction {
FETCH, ADD, UPDATE, REMOVE
}
+
+ /**
+ * Checks whether a criteria is filtering by ID property
+ *
+ * @param jsonCriteria
+ * criteria to check
+ * @return <code>true</code> if the criteria is filtering by ID
+ */
+ private boolean isIDCriteria(JSONObject jsonCriteria) {
+ if (!jsonCriteria.has("criteria")) {
+ return false;
+ }
+
+ try {
+ JSONArray criteria = jsonCriteria.getJSONArray("criteria");
+ for (int i = 0; i < criteria.length(); i++) {
+ JSONObject criterion = criteria.getJSONObject(i);
+ if (criterion.has("fieldName") &&
JsonConstants.ID.equals(criterion.getString("fieldName"))) {
+ return true;
+ }
+ }
+ } catch (JSONException e) {
+ log.error("Error parsing criteria " + jsonCriteria, e);
+ }
+ return false;
+ }
}
\ No newline at end of file
diff -r 789521cc4e6f -r e60dfabc36f9
modules/org.openbravo.service.json/src/org/openbravo/service/json/JsonConstants.java
---
a/modules/org.openbravo.service.json/src/org/openbravo/service/json/JsonConstants.java
Mon May 26 16:55:57 2014 +0200
+++
b/modules/org.openbravo.service.json/src/org/openbravo/service/json/JsonConstants.java
Tue May 27 14:17:08 2014 +0200
@@ -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-2011 Openbravo SLU
+ * All portions are Copyright (C) 2009-2014 Openbravo SLU
* All Rights Reserved.
* Contributor(s): ______________________________________.
************************************************************************
@@ -62,6 +62,7 @@
public static final String ENDROW_PARAMETER = "_endRow";
public static final String SORTBY_PARAMETER = "_sortBy";
public static final String TARGETRECORDID_PARAMETER = "_targetRecordId";
+ public static final String TAB_PARAMETER = "tabId";
public static final String DATASOURCE_PARAMETER = "_dataSource";
public static final String TEXTMATCH_PARAMETER = "_textMatchStyle";
public static final String TEXTMATCH_PARAMETER_OVERRIDE =
"_textMatchStyleOverride";
------------------------------------------------------------------------------
The best possible search technologies are now affordable for all companies.
Download your FREE open source Enterprise Search Engine today!
Our experts will assist you in its installation for $59/mo, no commitment.
Test it for FREE on our Cloud platform anytime!
http://pubads.g.doubleclick.net/gampad/clk?id=145328191&iu=/4140/ostg.clktrk
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits